Использование блока Try/Catch для идентификации строк в файле

Я пытаюсь прочитать набор чисел из файла и сложить их. Но я также добавил несколько строк в файл. Сейчас я пытаюсь прочитать числа, сложить их вместе и используя блок try / catch. Я пытаюсь отобразить ошибку, когда файл читает строку вместо целого числа. Однако, как только код читает строку из файла, он выдает ошибку, код не продолжает складывать числа вместе. Он просто печатает ошибку и печатает 0. Как изменить ее так, чтобы она продолжала считывать числа и складывать их вместе, а также отображать сообщение об ошибке после чтения строки.

Код:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.InputMismatchException;
import java.util.Scanner;
public class AddNumbers {

public static void main (String[]args) {
    try{
        File myFile = new File("numbers.txt");
        Scanner scan = new Scanner(myFile);

        int x;
        int y = 0;
        try{
            //Read file while it has a line 
            while(scan.hasNextLine()){
            //scan a integer value
                x = scan.nextInt();
            //Add the scanned value to y
                y = y+x;
            }
        }catch(InputMismatchException e){
            //If a string is found then print this error
            System.err.println("Strings found! Error!");
        }
        System.out.println(y);
        scan.close();

    }catch(FileNotFoundException e){
        System.err.println("No such file exists!");
        System.out.println();
    }


}

}

Содержание файла

Albert 
10000
20000
30000
Ben 
50000
12000
Charlie 

3 ответа

Во-первых, try-catch блок находится за пределами while петля. В случае возникновения исключения управление достигает catch блок, который печатает сообщение об ошибке, а затем выходит из цикла. Вам нужно разместить try-catch внутри петли.

Во-вторых, когда Scanner#nextInt() выдает исключение, Scanner не будет использовать ввод, вызывая бесконечный цикл в случае чтения недопустимого целого числа. Вы можете просто прочитать всю строку, используя Scanner#nextLine() и разобрать его как int:

while (scan.hasNextLine()) {
    try {
        // scan a integer value
        String line = scan.nextLine();
        x = Integer.parseInt(line);
        // Add the scanned value to y
        y = y + x;
    } catch (NumberFormatException e) { // this can be thrown by Integer.parseInt(line)
        // If a string is found then print this error
        System.err.println("Strings found! Error!");
    }
}

Попробуйте прочитать строку как строку, а затем с помощью Integer.parseInt(x) и поймать это, если он выбрасывает исключение.

Смотрите здесь для получения информации о Integer.parseInt()

Вы должны поместить try/catch внутри цикла while.

While(scan.hasNextLine()){
    try{
      x=scan.nextInt();
      // add
    }catch(InputMismatchException ime){
       //write error
    }
}
Другие вопросы по тегам