一,异常:
就是程序出现不正常的情况
1.1,分类:
在Java程序设计中,关于异常有一大类,叫做Throwable,其下又有两个分类:Error,Exception
Error:程序出现的严重问题,且只能抛出(throw),不能试图捕获(try catch)
Exception:是程序出现的问题,可以捕获可以抛出
编译期异常又叫受检查异常,运行时异常又叫不受检查异常
1.2,异常的产生:
在代码内部使用 throw 异常对象,来产生异常
throw new ParseException()
1.3,编译期异常和运行时异常:
运行时异常:代码执行时可能会出错,程序中出现运行时异常没有强制处理,默认采取抛出异常
编译期异常:代码编译时可能会出错,程序中出现编译期异常,就会强制要求处理
运行时异常:
ArithmeticException 算术异常
ArrayIndexOutOfBoundsException 数组下标越界异常
NullPointerException 空指针异常
ClassCastException 类转换异常
StringIndexOutOfBoundsException 字符串下标越界
NumberFormatException 数字格式化错误
编译时异常
ParseException 解析异常
throw | throws | |
---|---|---|
位置 | 类内 | 方法后 |
后面 | 对象 | 异常类 |
作用 | 产生异常 | 声明异常 |
1.4,异常处理:
异常的处理只有两种方案:
1,抛出(throws)
抛出是将异常在方法签名上声明抛出
public void test () throws 异常类名{
}
在方法参数列表后,使用throws加异常类名来声明抛出异常,且允许声明多个异常类,中间用逗号隔开,谁调用这个方法,异常就抛给谁,调用者就要继续处理异常。抛出异常后,异常处后续代码不再执行
2.1,试图捕获(try catch):
try{
//可能会出现异常的代码
}catch(一异常类名 e){
e.XXX();
}
try里面包裹代码,如果其中代码出现异常,就会被catch抓住,需要抛出异常和catch后声明的异常同类型才可以抓住,否则抓不住,如果try里面的代码没有任何报错,catch内的代码不执行
catch还可以同时声明多个异常类,特别强调不是同时抓多个异常对象,因为根本就不可能产生多个异常对象,因为try内部一旦出现异常,try后面的内容不执行了
try {
System.out.println(1 / 0);
int[] arr = {1};
System.out.println(arr[1]);
} catch (ArrayIndexOutOfBoundsException e){
e.printStackTrace();
System.out.println("数组越界");
} catch (ArithmeticException ae){
ae.printStackTrace();
System.out.println("算术异常");
}
虽然可以同时声明多个异常类,但是很麻烦,一般可以直接写一个最大异常类Exception
try {
System.out.println(1 / 0);
int[] arr = {1};
System.out.println(arr[1]);
} catch (Exception e) {
e.printStackTrace();
System.out.println("程序出错");
}
//try...catch结构后的代码不影响,继续执行
System.out.println("11111);
}
抛出:抛出异常后,异常处后续代码不再执行
捕获:无论try...catch代码有没有错误,其结构后面的代码能执行
2.2 finally:
try{
//...
} catch(Exception e){
//...
} finally{
//...
}
或者
try{
//...
} finally{
//...
}
finally这么设计的作用:为了确保某些代码必须能够执行到,一般用于释放资源
2.3异常的应用:
应用1,设计方法时,如果这个方法会多次调用,或者被多次多层调用,尽量自行捕获异常,不要抛出,因为一旦抛出,所有使用者都需要处理该异常
应用2,方法重写时子类抛出的异常范围小于等于父类的异常范围,父类方法没有异常,子类重写时也不能抛出异常
2.4异常的API:
最大父类Throwable
构造方法
Throwable(String message)
message就是异常信息
构造带指定详细消息的新throwable
String getMessage()
返回此throwable的详细消息字符串
void printStackTrace()
将异常信息打印
将此throwable及其追踪输出至标准错误流
二,自定义异常:
自定义异常需要继承Throwable类,一般继承的是Throwable的子类,只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw语句抛出,继承RuntimeException那就是运行时异常的特点,继承非RuntimeException及其子类那就是编译期异常的特点
1,建类,2,继承,3,写构造方法,4,在方法内部使用异常(产生异常),5,测试
三,总结:
关于异常,以后常见的是Exception,Error基本见不到(除非问题非常严重),需要分清楚编译期异常有哪些,运行时异常有哪些,要分清楚,捕获异常,抛出异常有什么特点
自定义异常在后续写项目会用到