前言: Java 中 Exception 继承自Throwable。在程序的编译、运行过程中,JVM检测、捕获这些异常,保证程序运行的健壮性。
Exception 分类
Exception 总共有两大类:
Unchecked Exception(Runtime Exception)
Checked Exception(非Runtime Exception)
提醒:所有的RuntimeException都是Unchecked Exception,其余的全是CheckedException.
区别:Unchecked 与Checked 区别在于,对于CheckedException,我们必须对其检查处理,也就是必须添加try…catch…捕获异常、或者throw 抛出异常。而对于UncheckedException,可以选择处理,也可以不处理。推荐不处理这些异常。
常见异常.png
异常处理
try 块:用于捕获异常。其后可接零个或多个catch块,若没有catch块,则必须跟一个finally块。
catch 块:用于处理try捕获到的异常。
finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。其实 finally 语句块是在 try 或者 catch 中的 return 语句之前执行的。更加一般的说法是,finally 语句块应该是在控制转移语句之前执行,控制转移语句除了 return 外,还有 break 和 continue。
在以下特殊情况下,finally块不会被执行:
1)在finally语句块中 发生了异常。
2)try或者catch中System.exit(0)退出程序。
3)程序所在的线程死亡。
4)计算机断电、失火、或遭遇病毒攻击
异常处理.png
代码示例:
//该代码直接借用的@Dandan Meng 的,他写的很棒,我就没有再去创建
public class ExceptionTest
{
public static void main(String[] args)
{
int c = 0;
try
{
int a = 3;
int b = 0;
// 这块代码出现了异常 ,除数不能为0
c = a / b;
// 那么异常之后的代码都不会被执行
System.out.println("Hello World");
}
catch (ArithmeticException e)
{
e.printStackTrace();
}
finally
{
//不管有没有发生异常,finally语句块都会被执行
System.out.println("Welcome");
}
System.out.println(c);
// 当b为0时,有异常,输出为c的初始值0
}
}
小结