一:定义
程序在运行期间,发生的不可预测的事件,他阻止了我们的程序正常运行;
二:异常处理机制
在我们程序发生异常以后,代码能够按照我们实现设计的顺序继续执行;
处理方式分为两种:
01.在方法体内使用try{}catch{}finally{}代码处理;
02.在方法体内throw抛出异常,在方法参数列表后面用throws声明异常;
三:异常的分类:
01.运行时异常 都是 RuntimeException 类的子类,编写程序是可以不处理;
02.受查异常 是Exception类的直接子类,编写代码是需要处理;
所有的异常和错误都是Throwable的子类。
03.异常链的使用:
把我们捕获的异常信息包装成一个新的异常,继续抛出!新异常中记录了异常的原始信息,便于我们找到异常的根本原因:
异常链案例:
1 public class LinkDemo { 2 // main方法 3 public static void main(String[] args) { 4 try { 5 firstException(); 6 } catch (SQLException e) { 7 e.printStackTrace(); 8 } 9 } 10 // 第1个异常 11 private static void firstException() throws SQLException { 12 try { 13 secondException(); 14 } catch (IOException e) { 15 e.printStackTrace(); 16 throw new SQLException("第1个异常", e); 17 } 18 } 19 // 第2个异常 20 private static void secondException() throws IOException { 21 try { 22 thirdException(); 23 } catch (InputMismatchException e) { 24 e.printStackTrace(); 25 throw new IOException("第2个异常", e); 26 } 27 } 28 // 第3个异常 29 private static void thirdException() throws InputMismatchException { 30 throw new InputMismatchException("根本的异常"); 31 } 32 }
常用异常举例:
IOException IO流异常
FileNotFoundException 文件没找到
ArithMeticException 算术异常
InputMismatchException 输入类型不匹配
NullPointerException 空指针异常
ClassNotFoundException 没有找到类
ClassCastException 类型转换异常
四:自定义异常
异常类都是Throwable的子类,一般继承RunnableException,Exception类就可以了。
案例:
1 public class MyException extends RuntimeException { 2 public MyException() { 3 super(); 4 } 5 public MyException(String message) { 6 super(message); 7 } 8 public MyException(String message, Throwable cause) { 9 super(message, cause); 10 } 11 public MyException(Throwable cause) { 12 super(cause); 13 } 14 }
五:五个关键字
try catch finally throw throws
try(尝试):
01.不能单独使用,必须和catch/finally联合使用;
02.存放可能出现 异常的代码;
03.如果try代码块中出现了异常,回去匹配catch代码块对应的异常类型,
如果没有匹配的类型,则走finally代码块。.
catch(捕获):
01.可以有多个catch块,每个catch都能捕获一个类型的异常;
02.多个catch块捕获的异常不能重复;
03.多个catch块的类型必须是从小到大排列;
04.如果多个catch块都能匹配,默认使用第一个匹配的;
05.如果try中的代码没有出现异常,则catch代码块被忽略;
06.每个代码块中的属性都是私有的;
finally(最终):
01.无论代码是否发生异常,都会执行finally代码块;
02.如果遇到了System.exit(0);或者System.exit(^0);,则不会执行finally;
03.如果try代码块中出现了return,也是先执行finally,再跳出方法。
04.finally中经常书写关闭流或者断开数据库连接资源的方法代码;
throw(抛出异常):
01.语法 throw new 异常类型(异常信息);
02.异常信息必须是Exception或者其子类;
03.throw只能出现在方法体内,且只能抛出一个异常
04.异常抛出以后,需要选择一种异常处理方式处理;
05.如果使用声明异常的方式处理异常,则抛出的异常类型必须是声明的异常本身或者其子类。
throws(声明异常):
01.语法 : throws 异常类型1,异常类型2......
02.定义在方法参数列表之后,可以声明多个异常类型;
03.throws所在的方法不处理异常,方法的调用者处理异常;
04.如果是在main方法中使用throws,则是JVM(java虚拟机)来处理异常(不建议使用该方法);