异常
异常
- 基本概念
程序中执行发生的不正常情况称为异常。(开发中的语法和逻辑错误不是异常)
- 异常事件可以分为两类
-
Error(错误)
Error是JVM无法解决的严重问题,如StackOverflowError栈溢出,OutOfMemory内存溢出等,Error是严重错误,程序会崩溃。
-
Exception
一般由程序编程错误或其他偶然外在因素引起的,可以使用针对性代码进行处理。常见的Exception有空指针异常,数组下标越界,网络连接中断等。Exception分为两大类:编译型异常和运行时异常
-
运行时异常
编译器不要求强制处理,一般是编程的逻辑错误,是程序员应该避免出现的异常
运行时异常很常见,可以不处理,如果全处理代码就有很多try-catch,影响可读性和运行效率
-
编译时异常,编译器要求必须处理的异常,如文件不存在等。
-
常见的运行时异常
NullPointerException空指针异常
ArithmeticException算数运算异常
ArrayIndexOutOfBoundsException数组下标越界异常
ClassCastException类型转换异常
NumFormatException数字格式不正确异常
异常处理机制
当异常发生时,对异常处理的方式,有两种方式,这里两个方式是互斥的
捕获异常 try-catch-finally
try:监控区域。try块里放有可能发生异常的代码
catch:当try块里发生异常时,系统将异常封装成一个异常对象,传递给catch;
如果try块里没有异常,catch部分就不会执行
finally:无论出不出异常,finally里的语句终究会进行
如果要捕获多个异常,catch的异常从小到大排列
示例代码
public static void main(String[] args) {
int a = 1;
int b = 0;
try {//监控区域
System.out.println(a / b);
} catch (Exception e) {//捕获Exception类异常
e.printStackTrace();
} catch (Throwable e) {//捕获Throwable类异常
e.printStackTrace();
} finally {//最终执行
System.out.println("结束");
}
}
调用tyr catch快捷键Ctrl + Alt + T
抛出异常
在一个方法可能生成某种异常,但并不能确定如何处理,那么这个方法应该显式声明抛出异常,表明该方法不对这些异常进行处理,由该方法的调用者负责处理
- throws和throw
-
throws
在方法声明throws可以声明抛出的异常列表,thorws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类
案例:
public void f(){
//创建一个文件流对象
FileInputStream fis = new FileInputStream("d://a.txt");
}
这个代码编译器会报错:FileNotFoundException找不到文件,这是一个编译型异常,我们必须进行处理,处理如下:
public void f() throws FileNotFoundException{
//创建一个文件流对象
FileInputStream fis = new FileInputStream("d://a.txt");
}
把这个异常抛出,让方法f( )的调用者(一般来说也是一个方法)来处理,这个throws后面的也可以是Exception,因为是异常FileNotFoundException的父类。
-
throw
throw是手动生成异常对象的关键字,它是在方法体中声明,throw后面接的是一个异常对象
public double f1(double a,double b){//简单的除法方法返回 a / b
if (b == 0){
throw new ArithmeticException("除数为0")
}
return a / b;
}
这里就是主动的抛出异常对象
- throw和throws区别
意义 | 位置 | 后面跟的东西 | |
---|---|---|---|
throws | 异常处理的一种方式 | 方法生命处 | 异常类型 |
throw | 手动生成异常对象的关键字 | 方法体中 | 异常对象 |