回顾异常处理机制:
异常机制使程序中异常处理代码和正常业务代码分离,也就是把某些异常交给异常处理器去处理,不让JVM直接处理。
JMV的处理方式时打印异常跟踪栈的信息,并终止程序运行,比如:
[java]
public static void main(String[] args) {
System.out.println(1 / 0); // 程序抛出java.lang.ArithmeticException: / by zero 然后程序结束。
... // 下面的代码无法得到执行。
}
public static void main(String[] args) {
System.out.println(1 / 0); // 程序抛出java.lang.ArithmeticException: / by zero 然后程序结束。
... // 下面的代码无法得到执行。
}
于是乎,我来捕捉一下这个异常好了:
[java]
public static void main(String[] args) {
try {
System.out.println(1 / 0); // 如果捕捉到异常,生成对应的异常类的对象
}catch(ArithmeticException ae) { // 如果捕捉到异常对象,进行自定义异常处理
ae.printStackTrace(); // 简单的异常处理,打印异常的跟踪栈信息
}
System.out.println("main方法结束"); // 这就是异常处理代码和正常业务代码分离的好处,逻辑上清晰,并且单独处理被捕获的异常。
}
public static void main(String[] args) {
try {
System.out.println(1 / 0); // 如果捕捉到异常,生成对应的异常类的对象
}catch(ArithmeticException ae) { // 如果捕捉到异常对象,进行自定义异常处理
ae.printStackTrace(); // 简单的异常处理,打印异常的跟踪栈信息
}
System.out.println("main方法结束"); // 这就是异常处理代码和正常业务代码分离的好处,逻辑上清晰,并且单独处理被捕获的异常。
}
问,上面的异常需要被捕捉吗?算术异常.
如果按照平常思维来思考,程序运行时有异常退出就行了。还捕捉啥呢?还干嘛分为checked异常跟runtime异常呢?
1:捕捉异常是为了让程序单独处理被捕获的异常。
2:区分checked异常跟runtime异常,是为了增强程序健壮性。
checked(知道编译时可能会有问题,我能处理,或者你来处理,最后必须处理(抛向JVM)),编译时就必须给我说清楚怎么处理。
runtime(知道运行时可能会有问题,我愿意处理就处理,你爱处理不处理),运行期出了错你负责。
无论是哪种异常,都不一定100%发生异常,100%发生异常的代码?你会写吗?你会写编译器让你写吗?