一、异常
程序在运行时的时候,出现的不正常事件,就是所谓的异常。
1、异常分类
![异常的分类.png](https://img-blog.csdnimg.cn/img_convert/0ed3cb57b5393dcbd05b96c462bfc475.png#clientId=u59d967fa-6bc6-4&crop=0&crop=0&crop=1&crop=1&from=ui&id=u3f2c7bef&margin=[object Object]&name=异常的分类.png&originHeight=548&originWidth=861&originalType=binary&ratio=1&rotation=0&showTitle=false&size=73700&status=done&style=none&taskId=u7d9fbd40-66c3-4314-a9d5-5e651de23ae&title=)
Throwable
:可抛出的,一切错误或异常的父类,,位于java.lang
包中
Error
: JVM、硬件、执行逻辑错误,不能手动处理。常见错误:StackOverflowErro
r、OutOfMemoryError
等Exception
:程序在运行和配置中产生的问题,可处理RuntimeException
:运行时异常,可处理,可不处理CheckedException
:检查时异常,必须处理
//异常:可以处理
int[] nums={3,12,11,55};
System.out.println(nums[4]);//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
//错误:不能处理
int[] nums= new int[1024*1024*1024];//Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
//此处若无效需要设置JVM运行内存值-Xmx256m
//异常:检查异常和运行时异常
int div = 10 / 0;//Exception in thread "main" java.lang.ArithmeticException: / by zero/编译器不检查的异常
//编译能检查出来,检查异常
FileInputStream fileInputStream = new FileInputStream("");
检查异常:由编译器能够检查出来的异常。外部原因导致的异常,程序中必须处理。
FileNotFoundException
IOException
SQLException
运行时异常:RuntimeException
,也叫非受检异常,编译器不检查的异常。往往一些代码逻辑问题。
NullPointerException
ArrayIndexOutOfBoundsException
ArithmeticException
ClassCastException
NumberFormatException
2、异常的处理
捕获异常:try,catch,finally
语法:
try {
//可能产生异常的代码
FileInputStream fileInputStream = new FileInputStream("");
} catch (异常类型1 e) {
//捕获异常的处理
} catch (异常类型1 e) {
//捕获异常的处理
} finally {
//无论程序是否产生异常,此处代码一定会被执行
//比如:释放资源,删除临时文件。。
}
注意点:
- 一个try可以匹配多个catch
- 如果try中产生了异常对象,那么会跳出try,进到相应的catch中处理异常,从上向下匹配。
- 如果是多个catch语句,那么小的异常捕获处理写在前面,大的异常捕获处理写后面。
- finally可写可不写
ctrl+alt+t
:try,catch,finally代码块快捷键
声明异常throws
方法级别上,向外抛出异常。
方法的声明上就要通过throws关键字声明抛出异常:
public static void main(String[] args) throws FileNotFoundException {
FileInputStream fileInputStream = new FileInputStream("");
}
按照方法的调用链反向传递,如始终没有处理异常,最终会由JVM进行默认异常处理(打印堆栈跟踪信息).
运行时异常的抛出,不一定要处理
检查异常的抛出,必须处理
Exception和RuntimeException是的区别?
1、RuntimeException是ExceptionException的子类。
2、Exception包含了受检异常,所以抛出Exception以及受检异常时,代码中一定要给处理。如果抛出的是RuntimeException(运行时异常,非受检)以及它的子类异常,程序中不一定非要处理。
3、重写的时候,子类不能抛出比父类更大的异常
throw关键字
- throws,用于定义方法的时候,声明该方法向外抛出异常。
- throw,主动抛出一个异常的对象。打断程序的执行。配合try/catch,或者throws来使用。
3、自定义异常
需继承Exception或Exception的子类,代表特定问题。
异常类型名称望文生义,可在发生特定问题时抛出对应的异常
public class AgeException extends RuntimeException {
public AgeException(String message) {
super(message);
}
}
public class Person {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
if (age<0){
throw new AgeException("年龄不对");
}
this.age = age;
}
}