异常
异常的介绍
java语言中,在程序执行中发生不正常的情况称为 “异常”。(注意开发中语法错误和逻辑错误不是异常)
在执行过程中所发生的异常事件可分为两大类:
- Error(错误):java虚拟机无法解决的严重问题。如:jvm的系统内部错误,资源耗尽等严重错误。
比如:StackOverflowError(栈溢出)和OOM (out of memory),Error是严重的错误,程序会崩溃。 - Exception:其他因编程错误或者偶然的外在因素导致的一般性问题,可以针对性的对代码进行处理。
比如:空指针异常,试图读取不存在的文件,网络连接中断等。
Exception分为两大类:运行时异常(程序运行时,发生的异常)和编译时异常(编程时,编译检查出来的错误)。
异常的类图:
常见的运行异常
名称 | 描述 |
---|---|
NullPointerException | 空指针异常。当应用程序试图在需要对象的地方使用Null时,抛出异常。 |
ArithmeticException | 数学运算异常。当出现异常的运算条件时,抛出异常。 |
ArrayIndexOutOfBoundsExpetion | 数组下标越界异常。 |
ClassCastException | 当试图将对象强制转换为不是实例子类时,抛出异常。 |
NumberFormatException | 数字格式不正确异常。 当应用程序将字符串转换成一种数值类型,但字符串不能转换成适当格式,抛出该异常。 |
常见的编译异常
编译异常是指在编译期间,就必须处理的异常,否则代码不能通过编译。
名称 | 描述 |
---|---|
SQLException | 操作数据库时,查询表可能发生的异常 |
IOException | 操作文件时,发生的异常 |
FileNotFoundException | 当操作一个不存在的文件时,发生异常 |
ClassNotFoundException | 加载类,而类不存在时,发生异常 |
EOF Exception | 操作文件,已经到达文件末尾,发生异常 |
IllegalArrguementException | 非法参数异常 |
异常的处理
1. try - catch方式处理
1)java 提供了try和catch块来处理异常。try块用于包含可能出错的代码。catch块用于处理try块中的异常。可以根据需要在程序中用多个数量的 try …catch块。
idea的快捷键是: ctrl + alt + t
2)基本语法
try{
//可疑的代码
//将异常生成对应的异常对象,传递给catch块
}catch(异常){
//异常处理
}finally{
//无论怎样 都会执行。
//多用于资源的关闭。
}
//如果没有finally也是可以的。
1)如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块中。
2) 如果异常没有发生,则顺序执行try的代码块,不会进入到catch
3)如果希望不管是否发生异常,都执行某段代码块则就把代码写在finally中
例如:
public class try_catch {
public static void main(String[] args) {
int i =1;
int j =0;
try {
int result = i/j;
} catch (Exception e) {
e.printStackTrace();
}finally {
//都会执行的代码
System.out.println("slslsllsls");
}
}
}
try -catch -finally 的注意事项:
- 如果没有出现异常,则执行try块中的所有语句,不执行catch块中的语句,如果有finally,最后还需要执行finally里面的语句。
- 如果出现异常,则try块中异常发生后,try块剩下的语句不在执行。将执行catch块中语句,如果有finally,最后还需要执行finally里面的语句。
2. throws方式处理
- 对于编译异常,程序必须处理,比如try-catch 或者 throws
- 对于运行时的异常,程序中如果没有处理,默认就是throws方法处理。
- 子类重写父类方法,对抛出的异常的规定:子类重写方法,所抛出的异常类型要么和父类抛出一致,要么为父类抛出异常类型的子类型。
- 在throws过程中,如果有try - catch方法,就相当于处理异常,就可不必在throws。
- 如果在一个方法调用另一个方法抛出编译异常的方法,那么调用的方法必须处理被调用方法的编译异常,或者继续向上抛出。
f1()throws FileNotFoundException{//要么处理,要么继续抛出。
f2();//为编译异常,必须处理,要么继续抛出
}
f2() throws FileNotFoundException{//抛出编译异常
}
自定义异常:
使用条件:
当程序中出现了某些“错误”,但该错误信息并没有被在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述错误信息。
public class CoustomException {
public static void main(String[] args) {
int age = 800;
if (!(age>=80&&age<=120)){
throw new AgeExcption("那么大!");
}
}
}
class AgeExcption extends RuntimeException{
public AgeExcption(String message){
super(message);
}
}
throw 和 throws的区别:
意义 | 位置 | 后面跟的东西 | |
---|---|---|---|
throws | 异常处理的一种方式 | 方法声明处 | 异常的类型 |
throw | 手动生成异常对象的关键字 | 方法体中 | 异常的对象 |