String input = in.next();
int value = Integer.parseInt(input);
System.out.println(value);
} catch (FileNotFoundException e) { // 捕捉FileNotFoundException
e.printStackTrace();
} catch (NumberFormatException e) { // NumberFormatException
e.printStackTrace(); // 打印异常信息 就是形如:at java.lang.NumberFor...的信息
System.out.println("I'm here!");
} finally {
System.out.println("this is finally block!");
}
}
}
我加了一个catch块,转么捕获NumberFormatException,则程序输出:
java.lang.NumberFormatException: For input string: "abc"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:447)
at java.lang.Integer.parseInt(Integer.java:497)
at Test.main(Test.java:14)
I'm here!
this is finally block!
没有输出异常抛出的地方。继续改代码:
[java]
public class Test2 {
public void open(){
String filename = "d:\\test.txt";
try {
FileReader reader = new FileReader(filename);
Scanner in = new Scanner(reader);
String input = in.next();
int value = Integer.parseInt(input);
System.out.println(value);
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("this is test2 block!");
}
}
}
[java]
public class Test3 {
public void carry() {
Test2 t2 = new Test2();
try {
t2.open();
} catch (Exception e) {
e.printStackTrace();
System.out.println("this is test3 block!");
}
}
}
[java]
public class Test {
public static void main(String[] args) {
Test3 t3 = new Test3();
t3.carry();
}
}
思路是:Test2类中处理业务,Test3类调用Test2类的open方法,最后在Test类中调用Test3类的carry方法,但是,我将异常抛在Test3中,看看异常输出的结果:
java.lang.NumberFormatException: For input string: "abc"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:447)
at java.lang.Integer.parseInt(Integer.java:497)
at Test2.open(Test2.java:13)
at Test3.carry(Test3.java:6)
at Test.main(Test.java:7)
this is test3 block!
首先,抛出的异常没有地方信息了,其次输出了:this is test3 block!,说明该异常是从Test3类中的carry方法抛出的,当我们把Test3类中的异常捕获语句注释掉的时候,异常如下:
Exception in thread "main" java.lang.NumberFormatException: For input string: "abc"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:447)
at java.lang.Integer.parseInt(Integer.java:497)
at Test2.open(Test2.java:13)
at Test3.carry(Test3.java:6)
at Test.main(Test.java:7)
看到此处,我想读者朋友们应该有一定的感觉了,说了这么多,就是想说明一点,当程序处理不了异常的时候会怎么办?是这样的:当前方法如果声明了相应的异常处理器,如上面的程序如果加了catch(NumberFormatException e),则直接抛出,但是如果没有声明,则会找到它的调用者,如果调用者也没有做相应的处理,则会一直往前找,直到找到main方法,最后抛出异常,所以上面的现象不难解释!此处我们简单总结下异常处理的过程:1、在可能出错的方法加上try/catch块语句,来调用异常处理器。2、当异常发生时,直接跳到相应的异常处理器catch中,如果有则抛出异常,执行该catch块中的语句,如果没哟,则找到它的调用者,直到main方法。3、如果有finally块,则执行finally块中的语句。
注意:
1、一个try可对应多个catch。2、有try必须至少有一个catch。3、finally块不是必须的,可有可无。4、一般情况下,当异常发生时,会执行catch块中的语句,特殊情况:当main方法中抛出异常时,如果程序声明了该异常处理器,则执行相应的catch块中的语