《疯狂 JAVA 讲义》读书笔记 第十章
-
Java异常处理机制主要依赖于try,catch,finally,throw,throws五个关键字,try里面放置可能引发异常的代码块,catch后对应异常处理的一个代码块,finally主用于回收在try里打开的物理资源,异常机制保证finall一定会被执行。throws用于方法签名中,声明该方法可能抛出的异常,throw用于抛出一个实际的异常。
只要执行代码出现了异常,系统就会自动生成一个异常对象,如果没有为这个异常定义***块,程序就在此退出。
-
抛出异常:执行try里代码出现异常,系统自动生成一个异常对象,该对象提交到运行时环境的过程。
- 捕获异常:Java运行时环境收到异常后,寻找处理该异常的catch块,找到后交给catch处理的过程。父类异常的***块应该在子异常后。
-
Java把所有非正常情况分为两种:异常(Exception)和错误(Error)。他们都继承父类Throwable。
IndexOutOfBoundsException // 数组越界异常 NumberFormatException // 数字格式化转换异常,输入的不是数字字符串 ArithmeticException // 算术异常,比如除0异常 NullPointerException // 空指针异常,引用变量没有值
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
- Java7提供多异常捕捉机制,一个catch可以响应多个异常,多个异常之间用 | 隔开,捕捉多个异常时,异常变量为隐式的final,所以不能重新赋值。
-
访问异常信息,访问***块中异常对象的相关信息,通过访问***块后异常形参获得。
getMessage(); // 返回描述异常的字符串 printStackTrace(); // 将该异常的跟踪栈信息输出到标准错误输出 printStackTrace(PrintStream s); // 将该异常的跟踪栈信息输出到指定输出流 getStackTrace(); // 返回该异常的跟踪栈信息
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
- 程序在try里打开了一些物理资源,这些物理资源都必须显示回收。finally块用于回收在try里打开的物理资源。
- Java的垃圾回收不会回收任何物理资源,只能回收堆内存中对象所占用的内存。
- 不管是否try是否引发异常,***是否被执行,除非在try、catch块中退出虚拟机(return也会执行finally),否则finally总是会被执行。
- Java7提供自动关闭资源的try,在try后紧跟一对圆括号,括号里声明、初始化一个或多个资源(这些资源类必须实现AutoCloseable或Closeable接口,必须实现close()方法)。try语句在该语句结束时自动关闭这些资源。
- Java的异常分为两大类,Checked和Runtime异常。Checked异常在程序编译时就会发生错误,无法通过编译。
- 如果当前方法不知道如何处理方法本身会引发的异常,则使用throws 声明 抛出。让上一级调用者处理。若main方法也无法处理则抛出给JVM虚拟机,虚拟机会打印异常的跟踪栈信息,并终止程序运行。
-
方法一旦使用throws抛出,本身就不需要使用try…catch来捕获了。在调用该方法时,要么放在try中捕获,要么放在另一个带throws声明抛出的方法中。
- 对于程序中的Checked异常,Java要求必须显式捕获并处理该异常,或者显式声明抛出该异常。
- 如果早方法中显示声明抛出Checked异常,将会导致方法签名与异常耦合,如果该方法是重写父类的方法,则该方法抛出的异常还会受到被重写方法抛出的异常限制。
-
在程序中自行抛出异常,使用throw。
throw与throws的比较
- throws出现在方法函数头;而throw出现在函数体。
- throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
- 两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
-
自定义异常,继承Exception。
public class MyException extends Exception{ public MyException(String msg){ super(msg); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6