2011-09-03 17 views
7

nedeniyle kilitleniyor Başka bir Activity ürününde oluşturulan bir metin dosyasından metin içe aktarmaya çalışıyorum. Oluşturulan metin dosyası, yalnızca sayıları ve Android tarafından oluşturulan diğer rasgele metinleri içeren bir StringArrayList'dan oluşur. Dosyadan metin aldığımda, her yeni numarayı IntegerArrayList içine almak için BufferedReader ve readLine() kullanıyorum. Herhangi bir sayısal olmayan değeri metin dosyasından kaldırıyorum ve diğer Faaliyette oluşturulan sayılar bir "\ n" ile ayrılıyor.Integer.parseInt

Karşılaştığım sorun, Activity yüklendiğinde Android'in çökmesidir. Nedeni Integer.parseInt()'a indirdim.

Benim kod aşağıda:

ArrayList<Integer> lines = new ArrayList<Integer>(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     File file = new File(getFilesDir(), "test_file.txt"); 

     try { 
      BufferedReader br = new BufferedReader(new FileReader(file)); 
      while (br.readLine() != null) { 
       String text = (br.readLine()).replaceAll("[^0-9]+","").trim(); 
       Integer number = Integer.parseInt(text); 
       lines.add(number); 
      } 
     } catch (IOException e) { 

     } 

     TextView tv = (TextView) findViewById(R.id.helptext); 

     int max = 0, min = 100; 
     double total = 0; 
     for (int i = 0; i < lines.size(); i++) { 
      int number = lines.get(i); 
      max = Math.max(max, number); 
      min = Math.min(min, number); 
      total += number; 
     } 

     tv.setText("max = " + max + " min = " + min + " total = " 
       + total); 

cevap

10

Sorunları: replaceAll("[^0-9]+","") yaptığınızda

  • bir NumberFormatException atmak için Integer.parseInt neden olan bir boş dize ile sona erebilir.

  • Sen her satırı atlama vardır

    while (br.readLine() != null) // consumes one line 
    

Böyle bir şey deneyin (sizin while döngü koşulu ... vb ilk satırı, üçüncü hattı ve tüketir):

BufferedReader br = new BufferedReader(new FileReader(file)); 
String input; 
while ((input = br.readLine()) != null) { 
    String text = input.replaceAll("[^0-9]+",""); 
    if (!text.isEmpty()) 
     lines.add(Integer.parseInt(text)); 
} 
+0

ÇALIŞIR !!!!!! Text.isEmpty() 'yi text.length() == 0 olarak değiştirmem gerekiyordu çünkü daha eski bir Android API kullanıyorum ama IT WORKS! SİZ DAHA ÇOK DACWE TEŞEKKÜR EDERİZ! – BGM

+1

@Arjan - Özür dilerim, yorumlarda yanıtlama konusunda yardım ettim ancak yanlışlıkla "@" sembolünü bıraktım. Ayrıca, tee için çok üzgünüm, gerçekten çok fazla belaya neden olmasını beklemiyordum. Bu sorunu çözmek için çok zaman harcamıştım ve dacwe çözdüğü zaman çok mutluydum ki ona yeterince teşekkür edemedim. Seni temin ederim, bir daha olmayacak. Btw, ben stackoverflow en iyi, en iyi değil, internet üzerinde kod çözümleri için sitelerden biri olduğunu söylemeliyim. Bunu kurmak için yardım eden adamlardan biriyseniz, çok teşekkür ederim! – BGM

+1

@BGM, dacwe için bir sorun değil, eğer bu okuduysanız (http://meta.stackexchange.com/questions/104959/gift-reward-offered-after-accepting-an-answer). Son nota, '' Stack Overflow isminde bir alandan hoşlanır ;-) ''. Tüm söylenenler: Hadi temizleyelim; Yorumlarımı siliyorum - Stack Exchange'e hoş geldiniz! – Arjan

0

"1234" herhangi bir istisna veya hata vermeyecektir. Ama herhangi bir karakter veya özel karakter vereceksiniz, ardından ayrıştırma() işlevi istisna atar. Bu yüzden büyük olasılıkla değil, textbir dizede yalnızca sayıları olduğundan emin olun dikkatle bazı karakter yüzden durum atma ve elde ettiğini geçiyor olmalı

+0

Yardımlarınız için teşekkürler! :) – BGM

+0

Sorununuz çözüldü ya da değil mi? –

+0

Evet, hepsi çözüldü! Teşekkürler! – BGM

0

çöktü kontrol ediniz. Ayrıca denemek isteyebilir:

Integer number = Integer.valueOf(text); 

yerine:

Integer number = Integer.parseInt(text); 

bakınız:

parseInt() ilkel tamsayı türü döner (int), bu sayede, valueOf döner java.lang .Integer, tamsayı nesnesinin temsilcisi. İlkel tür yerine, Tam Sayı nesnesini isteyebileceğiniz durumlar vardır.

Düzenleme: Aşağıdaki yorum, ben döngü içinde her zaman text log ediyorum sonra günlük text değişken boş gösterecektir hatayı atar zaman, şansı vardır.

+0

Maalesef kodunuzu denedikten sonra uygulama hala çöküyor. Diğer aktivitede dosya için arraylistimi yaratma yolu: – BGM

+0

'code'String filename =" test_file.txt "; \t \t FileOutputStream fos; \t \t { \t \t fos = openFileOutput (dosya adı, Context.MODE_PRIVATE); \t \t ObjectOutputStream out = new ObjectOutputStream (fos); \t \t \t out.writeObject (arrayList); \t \t \t out.close(); \t \t} yakalamak (FileNotFoundException e) { \t \t \t // YAPıLACAK) (yakalamak bloğunu \t \t \t e.printStackTrace Otomatik oluşturulan; \t \t} yakalamak (Ioexception e) { \t \t \t // YAPıLACAK) (yakalamak bloğunu \t \t \t e.printStackTrace Otomatik oluşturulan; \t \t} 'code' ........' code'arrayList.add (Integer.toString (val [0]) + "\ n"); 'code' – BGM

+0

** 'code'text'kodu textView altında yazdırarak ve replaceAll (" [^ 0-9] * "," ") işlevini kullandıktan sonra dizede yalnızca sayılar vardır. – BGM

2

Yukarıdaki tüm cevaplar doğrudur, ancak bazı nedenlerden ötürü size gelen bilgilerin bir Integer olması durumunda size yardımcı olmazlar.Örneğin - Sunucu yanlışlıkla userId yerine kullanıcı adını gönderdi (Tamsayı olmalı).

Böyle bir durum olabilir, bu nedenle, bunu önlemek için her zaman çeklere koyulmalıyız. Aksi takdirde, uygulamamız çökecek ve hoş bir kullanıcı deneyimi olmayacaktır. Bu nedenle, String'u Integer'a dönüştürürken, uygulama kilitlenmelerini önlemek için her zaman bir try-catch bloğunu kullanın. Ben kodu nedeniyle tamsayı ayrıştırma için uygulama kazasında önlemek için aşağıdaki kullanın -

try { 
    Log.d(TAG, Integer.parseInt(string)); 
    } catch (NumberFormatException e) { 
     Log.w(TAG, "Key entered isn't Integer"); 
    } 
İlgili konular