异常处理
异常概述
- Java中的异常事件
- Error:Java虚拟机无法解决的严重问题(JVM系统内部错误、资源耗尽等),一般不编写针对性代码进行处理
- Exception:编程错误或偶然的外在因素导致的一般性问题,可使用针对性代码进行处理
- 捕获异常最理想是在编译期间,但有的异常只有在运行时才会发生(除数为0、数组下标越界)——》分为:
- 编译时异常(受检异常):IOException、ClassNotFoundException…
- 运行时异常(非受检异常):NullPointerException、ArrayIndexOutOfBoundsExceptio…
- 异常的处理:抓抛模型
- 抛:代码执行过程中,一旦出现异常,会在异常代码处生成一个对应的异常类的对象,并将此对象抛出。 抛出对象以后,其后的代码不再执行
- 抓:异常处理机制
异常处理机制
try-catch-finally
-
格式
try{ //可能出现异常的代码 }catch(异常类型1 变量名1){ //处理异常的方式1 }catch(异常类型2 变量名2){ //处理异常的方式2 } ...... finally{ //一定会执行的代码 }
-
注意点
-
catch中的异常类型如果没有子父类关系,则声明顺序没有关系
反之,则要求子类一定要声明在父类上面
-
-
catch中常用方法:getMessage() printStackTrace()
import org.junit.Test; public class ExceptionTest { @Test public void test1(){ String str = "abc"; try{ int num = Integer.parseInt(str); }catch (NumberFormatException e){ System.out.println(e.getMessage()); e.printStackTrace(); } } }
-
finally的使用:
- finally是可选的
- finally表示一定会执行的语句,即使catch中出现异常,try或catch中有return 语句
- 像数据库连接、输入输出流、网络编程Socket等资源,JVM不能自动回收,要求我们需要自己手动的进行资源的释放。此时资源释放需要声明在finally中
-
体会
- try-catch-finally处理编译时异常,使得程序在编译时不再报错,但是运行时仍可能报错。相当于将编译时可能出现的异常,延迟到运行时出现
- 开发中,通常不针对运行时异常编写try-catch-finally。针对编译时异常一定考虑异常的处理
throws+异常类型
-
”throws+异常类型“ 写在方法声明处,出现异常时,生成的异常类对象满足throws后异常类型时,就会被抛出。异常代码后续代码不再执行
public void method() throws FileNotFoundException,IOException{ }
-
try-catch-finally:真正将异常处理
throws:只将异常抛出给方法的调用者,并没有真正将异常处理掉
-
子类重写的方法抛出的异常必须比父类被重写的方法小
如何选择异常处理机制
- 父类被重写的方法没有throws方法,则子类重写的方法也不能使用throws,——》如果子类重写的方法中有异常,必须使用try-catch-finally方式处理
- 执行的方法A中有多个递进关系的方法,则这多个方法使用throws,而执行方法A中使用try-catch-finally
手动抛出异常
-
异常对象的产生
- 系统自动生成的异常对象
- 手动的生成一个异常对象,并抛出(throw)
public class ExceptionTest1 { public static void main(String[] args) { Student student = new Student(); try { student.regist(-100); } catch (Exception e) { System.out.println(e.getMessage()); } student.toString(); } } class Student{ private int id; public void regist(int id) throws Exception { if(id > 0){ this.id = id; }else{ //手动抛出异常 //throw new RuntimeException("输入数据非法!"); throw new Exception("输入数据非法!"); } } @Override public String toString() { return "Student{" + "id=" + id + '}'; } }
自定义异常类
-
- 继承于现有的异常结构:RuntimeException或Exception
- 提供全局常量:serialVersionUID
- 提供重载的构造器