Java编程语言使用异常处理机制为程序提供了错误处理的能力:
程序中预先设置好对付异常的处理办法,程序运行,发现异常,对异常进行处理,处理完毕,程序继续运行。
Java中如何进行异常处理:Java的异常处理是通过5个关键字来实现的:try、catch、finally、throw、throws
try-catch块捕获异常:
1. try块中的代码段不会产生异常,会直接运行try-catch块后的代码段。
2. try块中代码段产生异常,产生异常对象,程序进入catch块中进行异常类型匹配,此时try中产生异常的代码段后面的代码段将不被执行。如果可以匹配到异常类型,catch对异常进行处理的代码段将被执行。程序继续执行try-catch块后的代码段。如果异常类型不匹配,程序中断运行。
在catch块中处理异常:
加入用户自定义处理信息
System.err.println("");
调用方法输出异常信息,输出异常的堆栈信息。
e.printStackTrace();
返回异常信息描述字符串,是printStackTrace()输出信息的一部分。
e.getMessage();
异常类型
Exception: 异常层次结构的父类。
ArithmeticException: 算数错误情形,如以零作除数。
ArrayIndexOutOfBoundsException: 数组下标越界。
NullPointerException:尝试访问null对象成员。
ClassNotFoundException:不能加载所需的类。
IllegalArgumentException:方法接收到非法参数。
ClassCastException:对象强制类型转换出错。
NumberFormatException: 数字格式转换异常,如把"abc"转换成数字。
try-catch块后加入finally块,是否发生异常都执行,不执行的唯一情况,有异常且catch块中有System.exit();中段程序,退出Java虚拟机。
演示示例:try块和catch块中return语句的执行。
1. 发生异常
2.进入catch块
3.执行finally块
4.执行return退出方法
排列catch语句的顺序:先子类后父类
发生异常时按顺序逐个匹配
只执行第一个与异常类型匹配的catch语句。catch功能类似swtich+break,一旦匹配到就会跳出try-catch语句。
异常部分常见疑惑:
try-catch如果发生异常但没有匹配到异常类型,finally块还会执行吗?
是的,无论是否捕获到异常,finally块都会执行。当try块中发生异常时,程序会跳转到catch块或者终止程序。但不管怎样,finally块都会在try块执行完成后执行,无论是否发生异常。
在finally块中通常用于释放资源或者清理代码。因此,即使try块中发生了异常并且没有匹配到对应的catch块,finally块也会执行,确保资源得到释放和清理。
方式1:调用者处理异常
方式2:调用者继续声明异常
main()方法声明的异常由Java虚拟机处理:
方式1和方式2都是处理Java方法抛出的异常的方式。
-
方式1:调用者处理异常。这意味着调用方法的代码块要捕获该方法抛出的异常并进行处理,例如打印错误消息或尝试恢复程序状态。在这种情况下,被调用方法的声明中不需要包含异常,因为所有的异常都被调用者处理了。
-
方式2:调用者继续声明异常。这意味着被调用方法可能会抛出异常,因此调用者必须声明它可能会抛出的异常。调用者可以处理该异常或将其传递给其调用者进行处理。在这种情况下,被调用方法的声明中需要包含异常信息。
对于main()方法声明的异常由Java虚拟机处理这句话的意思是,如果main()方法抛出了一个未被捕获的异常,Java虚拟机将自动捕获该异常并终止程序。如果声明了异常,虚拟机会将异常信息记录在日志文件中。