Java:try / catch with InputMismatchException在读取文件时创建无限循环

时间:2015-11-29 16:34:07

标签: java file loops try-catch java.util.scanner

我有一个任务是创建一个程序,将程序中的所有有效整数相加,并忽略任何不是有效的int。我必须使用Try and Catch。

File Numbers = new File("Numbers.txt");
    Scanner readFile = null;
    int i = 0;
    int total= 0;

    boolean success = false;

    while(!success){    
        try {
        readFile = new Scanner(Numbers);
        while(readFile.hasNext()){  
            i = readFile.nextInt();
            System.out.println(i);
            total = i + total;
            };
        success = true;// Ends The loop

        } catch (FileNotFoundException e1) {
            System.err.println(Numbers.getName()+" does not exist");
        }
        catch(InputMismatchException e2){
            System.err.println("Data incorrect type expecting an int found:  " + readFile.nextLine());

            readFile.next();
        }

    System.out.println("total is: " + total);
    };

问题在于程序陷入无限循环,而不是超越异常它只是再次启动。任务看起来非常简单,但我不知道它为什么不起作用?

2 个答案:

答案 0 :(得分:0)

假设将引发以下任何FileNotFound或InputMismatchException异常,那么您的程序将不会将成功更改为true。因此,它返回外部while循环并读取相同的文件。因为没有任何改变,所以会再次抛出相同的异常。

==>无尽的循环。

要解决这个问题,我建议将try / catch块移动到内部。

答案 1 :(得分:0)

你陷入了无限循环,因为当异常发生时,success变量没有将其值更改为true。为了在发生异常时执行某些操作 ,您应该添加finnaly块。它看起来像这样:

try {
    // do some stuff
} catch (Exception e) {
    // catch the exception
} finally {
    if (!readFile.hasNext()) success = true;
}

顺便说一下,从不这样做:catch (Exception e) ,我这样做只是为了清酒。相反,总是捕获特定的异常。因为Exception是异常层次结构中最基本的类,所以它会赶上所有异常,除非你重新抛出它,否则你可能会产生错误的感觉" safiness& #34 ;.当你想要捕获所有异常时,你应该这样做:

try {
    // do stuff
} catch (RuntimeException e) {
    throw e;
} catch (Exception e) {
    e.printStackTrace(); // or other approptiate action, i.e. log it.
}