主要内容
1.JAVA异常简介
2.使用try..catch..finally实现异常处理
3.JAVA中的异常抛出以及自定义异常
4.异常链
5.经验总结
JAVA异常简介:
有异于常态,和正常情况不一样,有错误出现。阻止当前方法或作用域继续执行的问题称之为异常。
JAVA中的异常:
1 JAVA中的所有不正常类都继承于Throwable类,Throwable主要有两个大类,一个是Error类,一个是Exception类。
2 其中Error类包括虚拟机错误和线程死锁,一旦Error出现,程序就彻底挂了,被称为程序终结者。
3 Exception类主要指编码环境,用户操作输入出现了问题,Exception主要包括两大类,非检查异常(RuntimeException)和检查异常(其他的一些异常)
其子类主要有:
非检查异常(运行时异常RuntimeException):【由JAVA虚拟机自动捕获】如空指针NullPointer、越界ArrayIndexOutofBounds、错误类型转换ClassCast、算数异常Arithmetic等
检查异常CheckException:【需要手动添加捕获和处理语句】文件异常IO等
异常处理的作用:
将异常提示给用户或编程人员,使本来已经中断了的程序,以适当的方式继续运行或者退出并且能够保存用户的当前操作,或进行数据回滚,最后再把占用的资源释放掉。
使用try..catch..finally实现异常处理:
一、try-catch(多catch块 可以存在多个catch块来捕获多个异常)-finally
(1)try块:负责捕获异常,一旦try中发现异常,程序的控制权将被移交给catch块中的异常处理程序。【try语句块不可以独立存在,必须与 catch 或者 finally 块同存】
(2)catch块:如何处理?比如发出警告:提示、检查配置、网络连接,记录错误等。执行完catch块之后程序跳出catch块,继续执行后面的代码。 编写catch块的注意事项:多个catch块处理的异常类,要按照先catch子类后catch父类的处理方式,因为会【就近处理】异常(由上自下)。
(3)finally:最终执行的代码,用于关闭和释放资源等
异常处理 try-catch以及try-catch-finally
try{
//一些会抛出的异常
}catch(Exception e){
//处理该异常的代码块
}finally{
//最终要执行的代码
}
try会抛出很多种类型的异常,多个catch块捕获多种错误。 多重异常处理代码块顺序问题:先子类再父类(顺序不对也会提醒错误),finally语句块处理最终将要执行的代码
JAVA中的异常抛出以及自定义异常:
throw ---将产生的异常抛出(动作)
throws --- 声明将要抛出何种类型的异常(声明)
public void 方法名 (参数列表) throws 异常列表{
//调用会抛出异常的方法或者
throw new Exception();---先抛出异常
}
两个重要的关键字:throw和throws
1.throws的异常列表可以是抛出一条异常,也可以是抛出多条异常,每个类型的异常中间用逗号隔开
2.方法体中调用会抛出异常的方法或者是先抛出一个异常:用throw new Exception() throw写在方法体里,表示“抛出异常”这个动作
3.当某个方法调用到会抛出异常的方法,就必须调用try catch语句块来尝试处理异常
4.当调用者不知道或者不必处理异常时,就继续声明将抛出异常,给更上一层调用者处理
5.尽管JAVA提供了大量种类的异常,我们在实际使用时还会用到自定义异常: 自定义异常:要么继承于意思相近的异常,要么继承于所有异常类的基类Exception
自定义异常:
class 自定义异常类 extends Exception{};
异常链:
有时候,我们可以把捕获的异常包装成新的异常,然后再新的异常里面添加对原始异常的引用,再把这个新异常抛出,他们就像是链式反应一样。
实现异常链功能的基本写法:
第二种写法:
经验总结:
1、处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
2、在多重catch块的后面,可以加一个catch(Exception)来处理可能会被遗漏的异常。
3、对于不确定的代码,也可以加上try-catch处理潜在的异常
4、尽量去处理异常,切忌只是简单的引用printStackTrace()去打印输出。
5、具体如何处理异常,要根据不同的业务需求和异常类型去决定
6、尽量添加finally语句块去释放占用的资源
7、使用函数区分各功能块。