异常关键字:
- try{可能出现异常的代码}
- catch(异常的类型 异常){}
- finally{不管是否有异常,都会执行的代码}
- throw 抛出异常 主要用于创建自定义的异常
- throws 声明异常 提示虚拟机会产生哪些异常,可以声明多个。放在类(参数)后面,多个异常用“,”逗号隔开
常见异常:
- java.util.ArithmeticException 算数异常
- java.lang.ClassCastException 类型转化异常
- java.lang.ArrayIndexOutOfBoundsException 数组越界异常
- java.lang.NullPointerException 空指令异常
- java.lang.InputMismatchExceptuin 输入类型不匹配异常
try-catch-finally语法:
- 不带finally
(1) try-catch
代码A
try{
可能出现异常的代码B
}catch(异常类型 异常名){
捕捉到异常后会执行的代码C
}
代码D
- 没有出现异常
代码A->代码B->代码D - 出现异常,并捕捉到
代码A->代码B(到出现异常的部分)->代码C->代码D - 出现异常,但是不匹配捕捉的类型
代码A->代码B(到出现异常的代码)->报错,退出程序。提示报错类型
- 带finally
代码A
try{
可能出现异常的代码B
}catch(异常类型 异常名){
捕捉到异常后会执行的代码C
}finally{
代码D
}
代码E
- 没有出现异常
代码A->代码B->代码D->代码E - 出现异常,并捕捉到
代码A->代码B(到出现异常的部分)->代码C->代码D->代码E - 出现异常,但是不匹配捕捉的类型
代码A->代码B(到出现异常的代码)->代码D->提示代码B报错类型
注:只有在finally执行之前,执行过System.exit();结束程序才不会执行finally代码
-
多重catch注意事项
- 异常逐个匹配,出现多个异常也只会执行遇到的第一个匹配的异常
- 异常的先后顺序:先子类后父类(子类不能抛出比父类更多的异常)
- catch只能执行一个
-
异常的体系结构(Throwable)- 直接子类为Error(错误)和Exception(异常)
-
Thorwable类(表示可抛出)是所有异常和错误的超类,两个直接子类为Error和Exception,分别表示错误和异常。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常, 这两种异常有很大的区别,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。
- Error (代码错误异常)
是程序无法处理的异常,由JVM产生和抛出的。异常发生时,Java虚拟机(JVM)一般会选择线程终止。 - Exception(异常)
程序本身可以处理的异常,这种异常分两大类运行时异常和非运行时异常。程序中应当尽可能去处理这些异常。- 运行时异常(RuntimeException)
- 这些异常是不检查异常,程序中可以选择捕获处理,也可以不处 理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
- Checked-检查异常(RuntimeException以外的异常)
- 从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
- Error (代码错误异常)
-
自定义异常
- 自定义一个类。继承父类(Exception,RuntimeException,Throwable)
- 重写构造方法
- 使用throw new 自定义的异常类名(参数);(实例化自定义的异常类)
-
当catch中有return语句时
- 如果try代码块中有异常,并捕捉到
先执行try里面的代码块,再执行catch语句块中return之前的语句,再执行finally语句块,最后才执行return; - 如果try中没有异常
先执行try代码块 ,再执行finally中的代码块。
- 如果try代码块中有异常,并捕捉到