本文是学习Java时所记录的学习笔记,本节包含了异常的相关知识,是从《疯狂Java讲义第四版》中学习。欢迎留言、私信交流~~
异常处理简介
- 异常机制可以使程序中的异常处理代码和正常业务代码分离。
- Java的异常机制主要依赖于try、catch、finally、throw和throws五个关键字。
- 父类异常应该放在子类异常的后面。
- 不要过度使用异常处理,不能替代流程控制。对不能确定和不能预知的运行时错误才应使用异常。
- try块不要过于多的内容,应更加细化,分别捕获并处理异常。
- 避免使用“catch(throwable t)”(Catch All)语句。该语句会导致无法对不同的异常分情况处理。该条语句作用主要是通过避免错误处理而加快变成进度的机制。
- 不要忽略捕获到的异常,需要对异常做出反应。
异常语法说明
-
捕捉多种类型的异常时,多种异常类型之间用竖线(|)隔开。
-
使用多种类型异常时,异常变量有隐式的final修饰。
-
语法
try{ //业务实现代码 } catch(Exception e){ alert 输入不合法 goto retry }
-
常见异常
常名称 说明 ndexOutOfBoundsException 数组越界异常。 umberFormatException 数字格式异常。 rithmeticException 除0异常。 xception 是“其他”异常的父类 ullPointerException 调用null对象的实例方法或者实例变量产生的异常。 -
异常处理常用方法
对象常用方法 说明 etMessage() 返回该异常的详细描述字符串。 rintStackTrace() 将该异常的跟踪栈信息输出到标准错误输出。 rintStackTrace(PrintStream s) 将该异常的跟踪栈信息输出到指定输出流。 etStackTrace() 返回该异常的跟踪栈信息。
异常相关知识
finally回收资源
- finally块总会被执行,用于回收在try块里打开的一些物理资源。
- finally块必须位于catch之后。
- 如果在异常处理代码中使用System.exit(1),则finally块将会失去执行的机会。
- 自动关闭资源的try语句(在try后面跟上圆括号,圆括号中包含一个或多个资源,try语句在该语句结束时自动关闭这些资源)。
try(bufferedReader br = new BufferedReader( new FileReader("AutoCloseTest.java")); PrintStream ps = new PrintStream(new FileOutputStream("a.txt"))){}
throws声明自动抛出异常
- 当方法不知道如何处理这种类型的异常,该异常应该由上一级调用者处理。方法签名中抛出异常。
- 方法重写时,子类使用throws声明抛出的异常需要是父类的方法声明抛出的异常子类或相同。
throws ExceptionClass1 , ExceptionClass2...
throw声明手动抛出异常
- 可根据业务需要来决定是否抛出异常。单个抛出异常。
- 语法
throw ExceptionInstance;
Runtime和Checked的区别
-
Checked异常:如IO异常、SQL异常。
-
Runtme异常:如类型转换、数组越界异常。
-
checked异常:要么throw处于try块里,要么放在带throws声明抛出的方法中。
-
runtime异常:无需放在try块和带throws声明抛出的方法中,可以显示使用try-catch处理,也可以不理会。
异常链
- 把捕获一个异常然后抛出另一个异常,把原始异常信息下来是一种典型的链式处理,也被称为“异常链”。
- JDK1.4以后,所有Throwable的子类在构造器中都可以接收一个cause对象作为参数,这个cause用来表示原始异常,这样可以把原始异常传递给新的异常,能够通过异常链追踪到异常最初发生的位置。
- 例子
业务代码中: //传入了一个Exception对象 catch(Exception e) { throw new SalException(e); } SalException extends Exception类的代码: //接收了Throwable的参数构造器 public SalException(Throwable t) { super(t); }