9

別ので生成されたテキストファイルからテキストをインポートしようとしていますActivity。生成されたテキストファイルはString ArrayList、Androidによって生成された数字とその他のランダムなテキストのみを含むで構成されています。ファイルからテキストをインポートするときは、BufferedReaderとを使用しreadLine()て新しい番号をそれぞれに取得しますInteger ArrayList。テキストファイルから数値以外の値を削除しています。他のアクティビティで生成された数値は「\n」で分割されています。

私が直面している問題は、AndroidがをロードするとクラッシュすることActivityです。原因をに絞り込みました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);
4

4 に答える 4

9

問題:

  • これを行うreplaceAll("[^0-9]+","")と、空の文字列が作成されて。Integer.parseIntがスローされる可能性がありますNumberFormatException

  • 1行おきにスキップしています(whileループ条件は1行目、3行目などを消費します...)

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

次のようなものを試してください。

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));
}
于 2011-09-03T09:07:50.123 に答える
3

上記のすべての答えは正しいですが、何らかの理由であなたに届くデータがではない場合、それらはあなたを助けませんInteger。例-サーバーが誤ってuserIdではなくユーザー名を送信しました(整数である必要があります)。

これが発生する可能性があるため、これを防ぐために常にチェックを行う必要があります。そうしないと、アプリがクラッシュし、快適なユーザーエクスペリエンスになりません。したがって、に変換Stringするときは、アプリのクラッシュを防ぐためIntegerに常にブロックを使用してください。try-catch整数解析によるアプリのクラッシュを防ぐために、次のコードを使用します-

try {
     Log.d(TAG, Integer.parseInt(string));
    } catch (NumberFormatException e) {
      Log.w(TAG, "Key entered isn't Integer");
    }
于 2015-08-21T05:46:18.377 に答える
0

文字列内の数字のみであることを確認してください。そうではない可能性がありtext ます。また、試してみることもできます。

Integer number = Integer.valueOf(text);

それ以外の:

Integer number = Integer.parseInt(text);

見る:

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

編集:以下のコメントの後text、ループに入るたびにログに記録します。エラーがスローされると、ログにtext変数が空であることが示される可能性があります。

于 2011-09-03T09:13:00.520 に答える
-1

「1234」のような文字列として数値を指定する場合、例外やエラーは発生しません。ただし、任意の文字または特殊文字を指定すると、parse()関数は例外をスローします。したがって、例外をスローしてクラッシュするように、いくつかの文字が通過している必要があることを注意深く確認してください

于 2011-09-03T09:08:15.293 に答える