本篇目录:
1、模拟运行异常 2、处理异常 3、抛出异常 4、finally关键字 5、自定义异常 6、异常的继承关系
Java中为异常提供的关键字有如下五个关键字:try
,catch
,finally
,throw
,throws
1 模拟运行异常
代码语言:javascript复制int i = 1 / 0;
System.out.println(1);
上面第一行代码由于算术中除数不能为零,则会抛出算术运算异常。
运行结果如下:
代码语言:javascript复制Exception in thread "main" java.lang.ArithmeticException: / by zero
at exception.Main.main(Main.java:10)
数字1
并没有输出,说明在第一行代码运行异常后,不会继续再向下运行,所以第二行代码就不会运行。
即异常发生后代码没有继续向下执行,而是停止了运行。
2 处理异常
那么我们如何处理这个异常呢,并且让程序不影响运行。
处理异常示例:
代码语言:javascript复制try{
int i = 1 / 0;
}catch (ArithmeticException exception){
System.out.println("这是算术运行异常");
}
System.out.println(1);
运行结果如下:
代码语言:javascript复制这是算术运行异常
1
在运行结果中数字1
成功打印,说明异常被成功处理,并没有影响程序的正常执行。
3 抛出异常
除了使用try...catch
关键字将异常捕获,还可以将异常抛出给上一级处理,即谁调用它就交给谁来处理这个异常。
如果没有调用关系,则将这个异常交给JVM处理,也就是运行Java字节码的虚拟机。
再如果JVM处理不了这个异常,那么JVM就会罢工,不会继续执行了。
3.1、抛出异常未处理
抛出异常示例:
代码语言:javascript复制public static void main(String[] args){
demoA();// 调用方法
System.out.println(2);// 打印数字2
}
// 抛出算术异常
public static void demoA() throws ArithmeticException{
int i = 1 / 0;// 算术异常
System.out.println(1);// 打印数字1
}
在上述例子中,方法demoA出现异常,并抛出异常给main方法,但是main方法并没有捕获处理。
运行结果如下:
代码语言:javascript复制Exception in thread "main" java.lang.ArithmeticException: / by zero
at exception.Main.demoA(Main.java:11)
at exception.Main.main(Main.java:5)
3.2、抛出异常并进行处理
抛出异常并进行处理示例:
代码语言:javascript复制public static void main(String[] args){
try {
demoA();// 调用方法
}catch (ArithmeticException exception){
System.out.println("处理demoA抛出的异常");
}
System.out.println(2);// 打印数字2
}
// 抛出算术异常
public static void demoA() throws ArithmeticException{
int i = 1 / 0;// 算术异常
System.out.println(1);// 打印数字1
}
执行结果:
代码语言:javascript复制处理demoA抛出的异常
2
数字2
被成功打印,但是数字1
没有,因为打印数字1
的前一行代码出现了异常,而这个方法中没有对这个异常进行捕获处理,而是抛出了异常,那么这个方法到抛出异常后就停止执行了。
4 finally关键字
在异常处理中,当发生异常时,才会执行catch
中的代码。相反,没有异常就不会执行。而有很多的情景下是需要无论执行有无异常都需要执行的代码,那finally
就是干这个工作的。
示例:
代码语言:javascript复制try {
int i = 1 / 0;// 算术异常
} catch (ArithmeticException exception) {
System.out.println("算术异常");
}finally {
System.out.println("finally代码块");
}
5 自定义异常
在实际开发中,我们难免会遇到一些需要我们手动抛出的异常信息,尤其是分模块开发中,而且需要告诉我们的上一级代码遇到的问题。
5.1、简单的自定义异常
代码语言:javascript复制public class TestException extends Exception {
public TestException(String message){
super(message);
}
}
这就是一个最简单的自定义异常。
步骤:①定义一个异常类。②继承Exception类。③编写构造方法,并调用父类的构造方法将异常信息输出。
5.2、抛出自定义异常
代码语言:javascript复制public static void demoA() throws TestException{
throw new TestException("抛出自定义异常");
}
捕获的异常信息:
代码语言:javascript复制exception.TestException: 抛出自定义异常
at exception.Main.demoA(Main.java:13)
at exception.Main.main(Main.java:6)
6 异常的继承关系
在我们自定义异常时也看到了,其实异常也是一个类,以我们自定义的异常类为例,它的继承关系如下:
所有的异常都是从Throwable类继承来的,而Throwable类有两个子类,分别是Exception
和Error
。
Exception是程序本身可以处理的异常,而Error是JVM本身的错误,通过代码没有办法被捕获并处理。