关于Java异常处理机制深入理解(4)

如上述代码,在 validateUserName() 方法中两处拋出了 IllegalArgumentException 异常,即当用户名字符含有非字母或者数字以及长度不够 8 位时。在 main() 方法中,调用了 validateUserName() 方法,并使用 catch 语句捕获该方法可能拋出的异常。

运行程序,当用户输入的用户名包含非字母或者数字的字符时,程序输出异常信息,如下所示。

请输入用户名:
administrator@#
java.lang.IllegalArgumentException: 用户名只能由字母和数字组成!

当用户输入的用户名长度不够 8 位时,程序同样会输出异常信息,如下所示。

请输入用户名:
admin
java.lang.IllegalArgumentException: 用户名长度必须大于 8 位!

捕获异常:

  在方法抛出异常后,运行时系统将转为寻找合适的异常处理器。潜在的异常处理器是异常发生时依次存存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到合适的异常处理器的方法并执行。当运行时系统遍历调用栈,而未找到合适的异常处理器方法时,运行时系统终止,同时意味着java程序的终止。

通常使用try、catch、finally来捕获异常:

try
{
    逻辑代码块
}
catch(ExceptionType e)
{
    异常处理代码块
}
finally
{
    清理代码块
}

try块:用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟个finally块。

catch块:用于处理try捕获到的异常。

finally块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,finally 语句块将在方法返回之前被执行。

在以下4种特殊情况下,finally块不会被执行:

1)在finally语句块中发生了异常。

2)在前面的代码中用了System. exit(退出程序。

3)程序所在的线程死亡。

4)关闭CPU。

try、catch、finally 语句块的执行顺序:

1)当try没有捕获到异常时: try 语句块中的语句逐一被执行,程序将跳过catch语句块,执行finally语句块和其后的语句;

2)当try捕获到异常,catch语句块里没有处理此异常的情况:当try语句块里的某条语句出现异常时,而没有处理此异常的catch语句块时,此异常将会抛给JVM处理,finally 语句块里的语句还是会被执行,但finally语句块后的语句不会被执行;

3)当try捕获到异常,catch 语句块里有处理此异常的情况:在try语句块中是按照顺序来执行的,当执行到某一条语句出现异常时,程序将跳到catch语句块,并与catch语句块逐一匹配,找到与之对应的处理程序,其他的catch语句块将不会被执行,而try语句块中,出现异常之后的语句也不会被执行,catch 语句块执行完后,执行finally语句块里的语句,最后执行finally语句块后的语句。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/66f0a15c4b0a272cf7e22457f6343862.html