我有一个任务是创建一个程序,将程序中的所有有效整数相加,并忽略任何不是有效的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);
};
问题在于程序陷入无限循环,而不是超越异常它只是再次启动。任务看起来非常简单,但我不知道它为什么不起作用?
答案 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.
}