2011-09-03 14 views
7

別のActivityで生成されたテキストファイルからテキストをインポートしようとしています。生成されたテキストファイルは、StringArrayListで構成され、番号とAndroidで生成されたその他のランダムテキストのみが含まれています。ファイルからテキストをインポートすると、BufferedReaderreadLine()を使用して新しい番号をIntegerArrayListに取得しています。私はテキストファイルから数値以外の値を削除しています。他のアクティビティで生成された数値は "\ n"で分割されています。Integer.parseIntによるクラッシュ

私が直面している問題は、ActivityをロードするとAndroidがクラッシュすることです。私は原因をInteger.parseInt()に絞り込んだ。

私のコードは以下の通りです:

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); 

答えて

10

問題:あなたはreplaceAll("[^0-9]+","")を行うと

  • あなたがNumberFormatExceptionをスローするようにInteger.parseIntを引き起こしの文字列で終わることができます。

  • あなたが他のすべての行をスキップしている

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

はこのような何かを試してみてください(あなたのwhileループ条件が...ように最初の行、三行目と消費):

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

IT WORKS !!!!!! Text.isEmpty()をtext.length()に変更する必要がありました== 0古いAndroid APIを使用していますが、ITは機能します。 大変ありがとうございます。 – BGM

+1

@Arjan - 申し訳ありませんが、私はコメントで返信するのを助けてくれましたが、間違って "@"記号を削除しました。また、私は本当にすごく大変なことを期待していませんでした。私は問題を解決しようとずっとずっと努力していましたが、私が彼に十分な感謝を捧げることができなかったので、それを解決したときにとても幸せでした。私はあなたにそれが再び起こらないことを保証します。ところで、私はstackoverflowが最高ではないにしても最高のサイトで、インターネット上のコードソリューションのサイトだと言わざるを得ません。あなたがセットアップを手伝った人の一人なら、どうもありがとう! – BGM

+1

@BGM、あなたが[this](http://meta.stackexchange.com/questions/104959/gift-reward-offered-after-accepting-an-answer)を読むと、dacweのティーは問題になりません。最後のメモ、 '' Stack Overflowは、その名前のスペースが好きです;-) '。すべてのことが言った:きれいにしましょう。私は私のコメントを削除しています - スタックエクスチェンジへようこそ! – Arjan

0

数字を「1234」のような文字列として指定する場合例外またはエラーは発生しません。しかし、あなたは任意の文字や特殊文字を与え、次にparse()関数は例外をスローします。だから、慎重にいくつかの文字が、文字列の番号のみで、それはそうではありませんtextを確認し、例外を投げていると

+0

ご協力ありがとうございます! :) – BGM

+0

あなたの問題は解決されているかどうか? –

+0

すべてが解決しました!ありがとう! – BGM

0

をクラッシュしたばかり渡しているが存在する必要があります確認してください。また、あなたは試してみたいことがあります。

Integer number = Integer.valueOf(text); 

の代わり:

Integer number = Integer.parseInt(text); 

参照:

のparseInt()は、それによってのvalueOf 返すjava.langで、プリミティブ整数型(int)を返します。 .Integerは、 整数を表すオブジェクトです。プリミティブ型の代わりにInteger オブジェクトが必要な場合があります。

編集:以下のコメントの後、私は、ループ内のすべての時間をtextログと思います、チャンスはそれがエラーをスローした場合、ログはtext変数が空で表示されますされています。

+0

残念ながら、あなたのコードを試してもアプリはまだクラッシュしています。他のアクティビティでファイルのarraylistを生成する方法は次のとおりです。 – BGM

+0

'code'String filename =" test_file.txt "; \t \t FileOutputStream fos; \t \t { \t \t \t fos = openFileOutput(filename、Context.MODE_PRIVATE); \t \t \t ObjectOutputStream out =新しいObjectOutputStream(fos); \t \t \t out.writeObject(arrayList); \t \t \t out.close(); \t \t}キャッチ(にFileNotFoundException電子){ \t \t \t // TODO自動生成されたcatchブロック \t \t \t e.printStackTrace(); \t \t}キャッチ(IOExceptionを電子){ \t \t \t // TODO自動生成されたcatchブロック \t \t \t e.printStackTrace(); \t \t} 'code' ........' code'arrayList.add(Integer.toString(val [0])+ "\ n"); 'code' – BGM

+0

**私はtextViewの下にそれを印刷することによって 'code'text'code'を実行し、replaceAll(" [^ 0-9] * "、" ")関数を使用した後に文字列内に数字だけがあります。 – BGM

2

上記の回答はすべて当てはまりますが、何らかの理由であなたに届くデータがIntegerではない場合は、お手伝いできません。例えば、Serverは誤ってuserIdの代わりにユーザー名を送信しました(Integerでなければなりません)。

このようなことが起こる可能性があるため、私たちは常にそれを防ぐために小切手を入れなければなりません。そうしないと、アプリがクラッシュし、快適なユーザーエクスペリエンスにはなりません。したがって、StringIntegerに変換するときは、常にアプリケーションのクラッシュを防ぐためにブロックtry-catchを使用してください。私は次のコードを使用して整数の解析によるアプリケーションのクラッシュを防ぎます -

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