Java 异常
Java 异常
异常体系结构图
绿色的是编译时受检查的异常,如果在编译前得到处理,那么就不能通过编译;红色的异常则是不受检查的异常,只有在程序运行起来的时候才能被发现和处理;
异常概述
在 Java 语言中,将程序执行过程中发生的不正常的情况称为异常、不包括开发过程中的语法错误和逻辑错误。
-
Error:虚拟机无法解决的问题,例如 JVM 系统内部错误、资源耗尽等严重错误,比如:StackOverflowError 和 OOM(堆溢出 OutOfMemoryError ) 一般情况下不会编写相对应的代码进行处理。
-
Exception:因编码错误或者偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理,例如:空指针访问、试图读取不存在的文件、网络连接中断、数组角标越界
-
异常又分为:编译时异常、运行时异常
-
编译时异常:IOException、FileNotFoundException、ClassNotFoundException
-
运行时异常:NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、NumberFormatException、InputMismatchException、ArithmaticException(算数异常)
-
异常处理机制
- try 监控区域
- catch 捕获异常 -- 要知道异常的类型
- finally -- 释放占用资源
- throws
- throw
异常处理
方式一
-
抛:程序在正常执行的过程中,一旦出现异常,就会在代码异常处生成一个对应的异常类对象,并将此对象抛出,抛出后,其后面的代码将不再执行
-
抓:异常的处理方式
try-catch-finally
各部分职责
try{ }
代码块
- 包装可能出现问题的代码 出现异常后,会生成对应的异常对象,根据此对象去匹配 catch 中的异常类型;
- 在没有写 finally 结构的情况下执行完 catch 语句就直接跳出 try-catch 结构,继续执行其后面的代码 ;
catch(异常类型1 变量名1 ){ }
catch 处理方式:处理异常或者打印异常信息;
finally{ }
-
它是一个一定会执行的代码;即使 try、catch 中有 return 语句 或者 catch 中又出现异常 finally 也会执行;
-
例如:数据库的连接、输入输出流、网络编程 socket 等资源,JVM 是不能自动回收的,我们需要自己手动进行资源的释放;
-
资源的释放就要放在 finally 里面
方式二
throws 向上抛出给上层进行处理;
throws + 异常类型 先在方法声明处,指明在方法执行是可能会抛出异常,一旦方法遇到异常就体执行抛出,异常后续的代码将不再执行;
方式三
“主动抛一个异常”
throw new RuntimeException("抛出异常"); 运行时异常我们一般不做处理
throw new Exception("错误信息"); 此时我们就需要对异常进行处理,需要处理或者向上抛出
try {
if (b >= 0) {
System.out.println("");
} else {
throw new Exception("数字非法!"); //手动抛出异常 手动生成异常
}
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
} finally {
System.out.println("已经处理");
}
throw 与 throws 的区分
- throws 是处理异常的一冲方式用于声明在方法头
public void add() throws RuntimeException{
}
- throw 是用于主动抛出异常,手动创建异常对象并抛出
throw new Exception("数字非法!");
自定义异常类
实现自定义类的条件:
- 必须继承于现有异常 RuntimeException(不用显式的处理异常)、Exception(需要处理)
- 提供一个全局变量用于标识该异常 serialVersionUID
- 提供重载的构造器
实现:
public class demo02Exception extends Exception {
static final long serialVersionUID = -3387517893124229948L;
public demo02Exception() {
}
public demo02Exception(String msg){
super(msg);
}
}