概述
异常情形(exceptional condition)是指阻止当前方法或作用域继续执行的问题。
异常往往能降低错误处理代码的复杂度。如果不使用异常,那么就必须检查特定的错误,并在程序中的许多地方去处理它。而如果使用异常,那就不必在方法调用处进行检查,因为异常机制将保证能够捕获这个错误。理想情况下,只需在一个地方处理错误,即所谓的异常处理程序中。这种方式不仅节省代码,而且把“描述在正常执行过程中做什么事”的代码和“出了问题怎么办”的代码相分离。总之,与以前的错误处理方法相比,异常机制使代码的阅读、编写和调试工作更加井井有条。 —《On Java 8》
异常体系
异常机制其实是帮助我们找到程序中的问题,异常的根类是 java.lang.Throwable ,其下有两个子类:java.lang.Error 与 java.lang.Exception ,平常所说的异常指 java.lang.Exception 。
Throwable体系:
- Error:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现。因此,程序员应该关注Exception为父类的分支下的各种异常类。
- Exception:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使用,是异常处理的核心。
Throwable中的常用方法:
public void printStackTrace()
:打印异常的详细信息。包含了异常的类型,异常的原因,还包括异常出现的位置。public String getMessage()
:获取发生异常的原因。提示给用户的时候,就提示错误原因。public String toString()
:获取异常的类型和异常描述信息(不用)。
异常分类
- 编译时期异常:checked exception。在编译时期,就会检查,如果没有处理异常,则编译失败。(如SQLException,IOException,ClassNotFoundException)
- 运行时期异常:runtime exception。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。(如ClassCastException,ArrayIndexOutOfBoundsException)
异常的处理
- Java异常处理的五个关键字:try、catch、finally、throw、throws
简单粗暴 throws
声明异常:将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理(稍后讲解该方式),那么必须通过throws进行声明,让调用者去处理。若一直外抛不处理,最终由JVM采用中断处理,停止程序
声明格式:修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ }
public void throwMyException() throws 异常类名1,异常类名2…{ }多个异常以逗号“ , ”分隔
自己处理 try…catch{}
使用格式:
try{
// 会出现异常的程序代码
}catch(异常类型1 异常的变量名1){
// 出现异常类型1 情况下的处理程序代码
}catch(异常类型2 异常的变量名2){
// 出现异常类型2 情况下的处理程序代码
}catch(异常类型3 异常的变量名3){
// 出现异常类型3 情况下的处理程序代码
}finally{
//不管有没有异常都会执行的代码,,通常进行资源的释放。关闭文件、关闭IO、……
}
idea使用快捷键可以自动生成try..catch
可以用多个catch进行多重捕获,若多个异常中存在继承关系,要把父类放在下面,此执行过程相当于switch-case体系中加了break的单匹配,一旦匹配则进入处理,不再往下匹配。
- throw和throws
throws:一般使用在方法上,用于声明方法运行时可能产生的异常—- ↑ 声明格式
throw:手动抛出异常
使用格式:throw 异常对象 如—-> throw new NullPointerException()
用throw和throws实现自定义异常
根据需求选择继承哪个类:- 继承Exception:此类异常强制性处理;
- 继承RuntimeException:选择性进行处理。
class MyException extends RuntimeException{ public MyException(String msg) { super(msg); } } class Echo { public void say (String str) { if("试试".equals(str)) { throw new MyException("试试自己定义一个异常"); }esle{ System.out.println(str); } } } public class TestMyException { public static void main(String args[]) { Echo.say("试试");//RuntimeException不要求强制性的异常处理,可以不catch } }
throw和throws的区别
throw:表示手工进行一个异常类的实例化对象抛出;
throws:用于方法声明出,告诉方法调用者本方法有可能产生哪些异常,在该方法不进行异常处理,而将异常处理权抛给方法调用者。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1401362462@qq.com