9

我正在尝试从另一个生成的文本文件中导入文本Activity。生成的文本文件由一个String ArrayList只包含数字和其他由 Android 生成的随机文本组成。当我从文件中导入文本时,我正在使用 aBufferedReader并将readLine()每个新数字放入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

4 回答 4

9

问题:

  • 当你这样做时,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));
}
于 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,它是表示整数的对象。在某些情况下,您可能需要一个 Integer 对象,而不是原始类型。

编辑:在您在下面发表评论之后,我text每次都会在循环中记录,当它抛出错误时,日志将显示text变量为空。

于 2011-09-03T09:13:00.520 回答
-1

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

于 2011-09-03T09:08:15.293 回答