异常概述
异常:异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。简单来说就是程序出现了不正常的情况。
异常本质就是java当中对出现的问题进行描述的一种对象体现。
常见的异常:
除数不能为0异常(ArithmeticException)
空指针异常(NullPointException)
数组越界异常(ArrayIndexOutOfBoundsException)
类型转换异常(ClassCastException)
ParseException
ClassNotfoundException
异常分类
Error:称为错误,由java虚拟机生成并抛出,程序对其不做处理。
Exception:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显示的声明或捕获。
RuntimeException:运行时期异常,又称为非受检异常,RuntimeException及其所有子类都是运行时期异常。
编译时期异常:不是继承自RuntimeException的Exception的子类都称为编译时期异常。
如下图解
异常处理
如果我们不做任何处理,异常将会交由虚拟机来处理;虚拟机的处理方式是:把异常的名称、异常出现的位置、异常原因等信息输出打印在控制台,并同时将程序停止执行。
-
我们自己处理异常的方式有两种:
1)try...catch...finally
异常处理的格式:
try{
//放置程序可能出现问题的代码
}catch(异常类 异常名){
//这里放置异常处理的代码
} finally{
//释放资源
}
2)throws抛出异常格式:
[修饰符] 返回值类型 方法名(参数列表) [throws 异常类1,异常类2....]{
}
注意:
java中的Error我们没有办法处理,我们只需要关心Exception的处理。
编译时异常:java程序必须处理,否则无法通过编译,程序报错。
运行时异常:程序可以不处理,但是建议一旦发现就应该和编译时异常一样处理。
Throwable类
Throwable类是java语言中所有错误或异常的超类。
成员方法:
public String getMessage():返回此 throwable 的详细消息字符串
public String toString():获取异常类名和异常信息。
public void printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。
public void printStackTrace(PrintStream s):通常用该方法将异常内容保存在日志文件中,以便查阅。
Throws关键字
概述:在定义一个方法的时候可以使用throws关键字声明,使用throws声明的方法表示此方法不处理异常,而交给方法的调用者进行处理。
使用格式:
[修饰符] 返回值类型 方法名(参数列表) [throws 异常类1,异常类2....]{
}
注意:
如果一个方法声明的是编译时期异常,则在调用这个方法之处必须处置这个异常(谁调用谁处理)。
重写一个方法时,它所声明的异常范围不能被扩大。
Throws和Throw的区别
throws用在方法声明后面,跟的是异常类名;throw用在方法体内,跟的是异常对象名。
throws可以跟多个异常类名,用逗号隔开;throw只能抛出一个异常对象名。
throws表示抛出异常,由该方法的调用者来处理;throw表示抛出异常,由方法体内的语句处理。
throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。
finally关键字
finally修饰的代码块一定会被执行,除非在执行到finally之前程序异常退出或者调用了系统退出的方法。比如:System.exit();
finally用于释放资源,在IO流操作和数据库操作中会见到。
(finally相关的面试题:final、finally、finalize三者间的区别)