2020/4/21--Java异常处理
- java的异常处理机制
- 使用try、catch、finally处理异常
- 使用throw和throws应发异常
- getMessage、printStackTrace方法
- 自定义异常类
异常概述
是java语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时才能被throw语句跑出,才可以是catch子句中的参数类型。两个子类:Error、Exception用于指示发生了异常情况。
这些实例是在异常情况下的上下文中新近创建的,因此包含了堆栈跟踪数据
Error类是指严重的系统错误,一般是与JVM相关的问题,如系统崩溃、虚拟机出错、动态链接失败等,这一类错误无法恢复或不能捕获,程序将终端。
Exception类是指一些可以捕获并恢复异常的情况,如数组下标越界ArrayIndexOutBoundException、数组被除0产生异常ArithmeticException、输入输出异常I/OException
异常分为以下几种:
-
非受检异常
unchecked异常是指编译器不要求强制处理的异常。一般是指编程的逻辑错误。java.lang.RuntimeException类及其子类
- 错误的类型转换异常:java.lang.ClassCastException
- 数组下标越界异常:java.lang.ArrayIndexOutOfBoundException
- 空指针访问异常:java.lang.NullPointerException
- 除零溢出错误:java.lang.ArithmeticException
-
受检异常
checked异常是指编译器必须处理的异常,程序在运行时由于外界因素造成的一般性异常。
- s没有找到指定名称的类异常:java.lang.ClassNotFoundException
- 访问不存在的文件:java.io.FileNotFoundException
- 操作文件时发生的异常: java.io.IOException
- 操作数据库发生的异常:java.sql.SQLException
try和catch捕获异常
出现异常时,会自动生成一个异常对象,该异常对象被自动交给JVM,JVM接受到后,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获异常。找不到捕获异常的方法,系统将终止,程序也退出
异常发生时要执行catch后面括号中的语句,并且catch之后的语句也会整形;没有异常发生,不会执行catch后面括号中的语句。
throw和throws引发异常
-
throw
必须throw出一个对象,throw完成后,程序立即停止
try { number = Integer.parseInt(args[0]); } catch(Exception e) { throw new ArrayIndexOfBoundException("数组越界"); }
-
throws
一个方法a可以引发异常,而它自己并不对该异常进行处理,那么a方法必须将这个异常抛给调用以使程序能够继续运行下去。这时候就要用到throws语句。
try { createThrow(tmp); } catch(Exception e) { System.out.println("来自createThrow方法的异常"); } public static void createThrow(String[] tmp) throws Exception { int number = 0; number = Integer.parseInt(tmp[0]); System.out.println("你输入的数字为:"+number); }
-
throw、throws语句组合应用
捕获异常后,跑出一个明确的异常给调用者
// 调用有异常的方法 public static void testThrow(String[] tmp) { try { createThrow(cmp); } catch(Exception e) { System.out.println("捕获来自createThrow方法的异常"); } } //抛出一个具体的异常 public statci void createThrow(String[] tmp) throws Exception { int number = 0; try { number = Integer.parseInt(tem[0]); } catch(Exception e) { throw new ArrayIndexOfBoundException("数组越界"); } System.out.println("你输入的数字为:" + number); }
throw语句写在方法中,throws语句是在方法前面之后的,throws抛出的类型的范围要比throw抛出的对象范围大才可以用。
finally关键字
无论异常总要被执行的代码。
finally语句在return之前执行。
getMessage 和 printStackTrace方法
getMessage用法:ex.getMessage()
printStackTrace用法:ex.printStackTrace();
多重catch
类似switch,挨个去检查与异常类型匹配的catch语句块,执行其中之一后,其他catch语句忽略
Java异常处理的几个原则:
- 不要丢弃异常
- catch语句应该制定具体的异常类型
- finally里面释放资源
- 分离各个可能出现异常的语句并分别捕获异常
- 对于数据不完整,需要用户做出相应处理,至少提示数据的不完整
自定义异常类
定义一个直接间接继承Throwable类的类。一般选择Exception作为父类。
public class MyException extends Exception {
public MyException(){ super();}
public MyException(String msg) {
super(msg);
}
public MyException(String msg, Throwable cause) {
super(msg, cause);
}
public MyException(Throwable cause) {
super(cause);
}
}
使用:
public String[] createArray(int length) throws MyException {
if (lenght < 0) {
throw new MyException("数组长度小于0,不合法");
}
return new String[length];
}