Crashing due to Integer.parseInt

BGM picture BGM · Sep 3, 2011 · Viewed 13.8k times · Source

I'm trying to import text from a text file which has been generated in another Activity. The generated text file is made up of a String ArrayList which only contains numbers and the other random text generated by Android. When I import the text from the file I'm using a BufferedReader and readLine() to get each new number into an Integer ArrayList. I'm removing any non-numerical values from the text file and the numbers that are generated in the other Activity are split up by an "\n".

The problem that I'm facing is that Android crashes when it loads the Activity. I've narrowed the cause down to Integer.parseInt().

My code is below:

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

Answer

dacwe picture dacwe · Sep 3, 2011

Problems:

  • When you do replaceAll("[^0-9]+","") you can end up with an empty string causing Integer.parseInt to throw an NumberFormatException.

  • You are skipping every other line (your while loop condition consumes the first line, the third line and so on...)

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

Try something like this:

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