异常简介
异常是一种对象,用于表示阻止正常进行程序执行的错误或情况。
异常处理使程序可以处理非预期的情景,并且继续执行代码,反之,如果不处理出现的异常,那么程序将会非正常终止。
异常层次结构
其中
Error属于系统错误,程序本身并不能处理,由JVM抛出。
RuntimeException是运行时异常,一般描述的是程序设计逻辑上的错误。故应尽量在程序设计上避免它。
Error,RuntimeException以及他们的子类也被称为**免检异常(unchecked exception),即不被强制要求进行处理的异常。
与此对应的就是必检异常(checked exception)。
何为必检异常(checked exception)?
即指编译器会强制程序员检查并通过合适的异常处理机制进行处理的异常。
除了Error,RuntimeException以及他们的子类(免检异常)外的所有异常类都是必检异常。
异常处理机制
java处理异常的方式有两种:捕获异常或抛出异常。
捕获异常
关键字:try, catch, finally
常用结构:
try
{
// 可能发生异常的代码
// 如果发生了异常,那么异常之后的代码都不会被执行
}
catch (Exception e)
{
// 如果发生了异常,则执行异常处理代码
// 如果没发生异常,则跳过该语句块
}
finally
{
// 不管有没有发生异常,finally语句块都会被执行
}
重点关注:
1. 一个try后可以跟多个catch,但最终只执行其中一个catch。故对catch块的放置顺序应该慎重:”父类异常“的catch块不能出现在”子类异常“的catch块前,否则会出现编译错误.
2.除了以下情况,finally语句块必须被执行:
1.JVM提前退出,即执行了System.exit(int)语句。
2.finally语句块中出现异常。
3.当前线程消亡。。。。。想到补充。
抛出异常
关键字:throw,throws
应用举例:
//throws
void methodName() throws Exception1,Exception2,..,ExceptionN{
//代码块
}
//throw
void methodName(){
//......
//发生异常,抛出异常
throw new Exception();
}
重点关注:
1.当调用抛出异常的方法时,方法的调用者必须处理或重新抛出该异常。
2.覆盖一个抛出异常的方法时,声明的任何异常必须是被覆盖方法所声明异常的同类或子类。
3.程序执行完throw语句后,不会执行后续的代码。而是选择沿着当前方法链一层层往上,寻找可以处理该异常的方法。
自定义异常
为了更好的处理异常问题,java允许通过继承Exception或其子类自定义自己的异常类。
常用于处理业务逻辑上的异常,如登录错误,用户输入有误等
举例:
public class myException extends Exception{
//.......
}
异常使用的基本原则
1.因为异常处理需要花费较多的时间和资源(初始化异常对象的资源花费,沿着方法链寻找处理器的时间花费,返回调用栈的时间),故应谨慎地使用异常。
2. 不要使用try -catch块处理简单的,可预期的情况(即使用if 就能处理的简单逻辑问题)。