因Integer.parseInt而崩溃

时间:2011-09-03 09:02:52

标签: java android arrays parseint

我正在尝试从另一个Activity生成的文本文件中导入文本。生成的文本文件由String ArrayList组成,其中仅包含数字和Android生成的其他随机文本。当我从文件中导入文本时,我正在使用BufferedReaderreadLine()将每个新号码添加到Integer ArrayList。我正在从文本文件中删除任何非数字值,而在另一个Activity中生成的数字将被“\ 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 个答案:

答案 0 :(得分:10)

问题:

  • 当您执行replaceAll("[^0-9]+","")时,您最终会遇到字符串,导致Integer.parseInt抛出NumberFormatException

  • 您正在跳过其他所有行(您的while循环条件会消耗第一行,第三行等等...)

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

答案 1 :(得分: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");
    }

答案 2 :(得分:0)

确保text 字符串中的数字,可能不是。您也可以尝试:

Integer number = Integer.valueOf(text);

而不是:

Integer number = Integer.parseInt(text);

请参阅:

  

parseInt()返回原始整数类型(int),其中valueOf   返回java.lang.Integer,它是代表的对象   整数。在某些情况下,您可能需要Integer   对象,而不是原始类型。

编辑:在下面的评论之后,我每次都会在循环中记录text,很可能它会抛出错误,日志会显示text变量为空。

答案 3 :(得分:-1)

如果您将数字设为字符串,如“1234”,则不会出现任何异常或错误。但是你会给任何字符或特殊字符,然后parse()函数会抛出异常。因此,请仔细检查必须有一些字符正在传递,因此它会抛出异常并导致崩溃