异常
1.Java在编译或者运行过程中出现的错误。
2.异常处理机制:程序出现了异常,我们就会想办法解决,所以我们设计了针对发生异常时进行对应的操作,不同的异常有不同的处理方式,为得时保证程序受影响程度降到最低,以及代码的清晰性。
Throwable体系
Error:Java运行过程中发生错误,程序无法处理,只有事先避免。一般设计程序而言,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。
Exception:程序可以自己捕捉,程序员可以处理的异常,分为运行时错误RunTimeException和非运行时错误。
异常
Java语言定义了一些异常类在java.lang标准包。
Runtime运行时异常
RutimeExeption的错误一般是由程序逻辑错误引起,Java编译器不会检查它,也就是说,当程序中出现这类异常时,也会编译通过。 (选择性处理)
处理方式:
抛异常(throws异常名),将异常抛出,由java的虚拟机对相关异常做出处理。
int a = 0;
int b = 1;
System.out.println(b/a);//除数不能为0
捕获异常: (try{可能存在的异常代码;})catch {异常类 ;类名}{处理方式}}并手动处理;
//Java的DateFormat抽象类中的,
//SimpleDateFormat实现类中的parse()方法就有一个异常需要抛出;
protected Date parse(String source)throws ParseException{
return new Date();
}
非运行时异常
程序语言来讲是必须要进行处理的异常,不处理,程序编译的过程不能通过,编译器会提示。(一般情况不自定义检查类)
重点
try: 执行代码,代码正常运行就执行try里的代码.
catch: try里面的代码出了错,就会进行利用catch进行捕获。
throw:用来抛出一个指定的异常对象(可自定义,可能出现异常不匹配)
finally:无论是否出现异常,最后都执行finally里面的代码。
自定义异常:自定义异常就是在我们书写代码时无法避免的错误,在调用的时候给用户提醒的,自定义异常通常要继承自Exception/RuntimeException,在自定的时候可以参考Exception,底层就是继承Throwable。
Cat类
public class Cat {
private Integer age;
private String name;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Cat(){
}
public Cat(String name,Integer age){
if(age< 0){
throw new CatAgeException("还在肚子里吗?");
} else if(age >100) {
throw new CatAgeException("你这是在开玩笑!");
}else {
this.age=age;
}
this.name=name;
}
@Override
public String toString() {
return "Cat{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
CatAgeException异常类
public class CatAgeException extends RuntimeException{
public CatAgeException(){
super();
}
public CatAgeException(String mess){
super(mess);
}
}
测试
public class CatAgeException extends RuntimeException{
public CatAgeException(){
super();
}
public CatAgeException(String mess){
super(mess);
}
}
非检查性异常
异常 | 描述 |
---|---|
ArithmeticException | 当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。 |
ArrayIndexOutOfBoundsException | 用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。 |
ArrayStoreException | 试图将错误类型的对象存储到一个对象数组时抛出的异常。 |
ClassCastException | 当试图将对象强制转换为不是实例的子类时,抛出该异常。 |
IllegalArgumentException | 抛出的异常表明向方法传递了一个不合法或不正确的参数。 |
IllegalMonitorStateException | 抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。 |
IllegalStateException | 在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。 |
IllegalThreadStateException | 线程没有处于请求操作所要求的适当状态时抛出的异常。 |
IndexOutOfBoundsException | 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。 |
NegativeArraySizeException | 如果应用程序试图创建大小为负的数组,则抛出该异常。 |
NullPointerException | 当应用程序试图在需要对象的地方使用 null 时,抛出该异常 |
NumberFormatException | 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。 |
SecurityException | 由安全管理器抛出的异常,指示存在安全侵犯。 |
StringIndexOutOfBoundsException | 此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。 |
UnsupportedOperationException | 当不支持请求的操作时,抛出该异常。 |
检查异常类
异常 | 描述 |
---|---|
异常 描述 | |
ArithmeticException | 当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。 |
ArrayIndexOutOfBoundsException | 用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。 |
ArrayStoreException | 试图将错误类型的对象存储到一个对象数组时抛出的异常。 |
ClassCastException | 当试图将对象强制转换为不是实例的子类时,抛出该异常。 |
IllegalArgumentException | 抛出的异常表明向方法传递了一个不合法或不正确的参数。 |
IllegalMonitorStateException | 抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。 |
IllegalStateException | 在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。 |
IllegalThreadStateException | 线程没有处于请求操作所要求的适当状态时抛出的异常。 |
IndexOutOfBoundsException | 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。 |
NegativeArraySizeException | 如果应用程序试图创建大小为负的数组,则抛出该异常。 |
NullPointerException | 当应用程序试图在需要对象的地方使用 null 时,抛出该异常 |
NumberFormatException | 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。 |
SecurityException | 由安全管理器抛出的异常,指示存在安全侵犯。 |
StringIndexOutOfBoundsException | 此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。 |
UnsupportedOperationException | 当不支持请求的操作时,抛出该异常。 |
参考文献
文献地址:{https://developer.aliyun.com/article/1171276?spm=a2c6h.24874632.expert-profile.93.b9a47868yeAw0O}