您的位置:首页 > 编程语言 > Java开发

Java疯狂讲义读书笔记第十章

2017-07-27 15:11 281 查看
Java异常处理机制主要依赖于try,catch,finally,throw,throws五个关键字,try里面放置可能引发异常的代码块,catch后对应异常处理的一个代码块,finally主用于回收在try里打开的物理资源,异常机制保证finall一定会被执行。throws用于方法签名中,声明该方法可能抛出的异常,throw用于抛出一个实际的异常。

只要执行代码出现了异常,系统就会自动生成一个异常对象,如果没有为这个异常定义cache块,程序就在此退出。

抛出异常:执行try里代码出现异常,系统自动生成一个异常对象,该对象提交到运行时环境的过程。

捕获异常:Java运行时环境收到异常后,寻找处理该异常的catch块,找到后交给catch处理的过程。父类异常的cache块应该在子异常后。

Java把所有非正常情况分为两种:异常(Exception)和错误(Error)。他们都继承父类Throwable。

IndexOutOfBoundsException // 数组越界异常
NumberFormatException     // 数字格式化转换异常,输入的不是数字字符串
ArithmeticException       // 算术异常,比如除0异常
NullPointerException      // 空指针异常,引用变量没有值


Java7提供多异常捕捉机制,一个catch可以响应多个异常,多个异常之间用 | 隔开,捕捉多个异常时,异常变量为隐式的final,所以不能重新赋值。

访问异常信息,访问cache块中异常对象的相关信息,通过访问cache块后异常形参获得。

getMessage();                    // 返回描述异常的字符串
printStackTrace();               // 将该异常的跟踪栈信息输出到标准错误输出
printStackTrace(PrintStream s);  // 将该异常的跟踪栈信息输出到指定输出流
getStackTrace();                 // 返回该异常的跟踪栈信息


程序在try里打开了一些物理资源,这些物理资源都必须显示回收。finally块用于回收在try里打开的物理资源。

Java的垃圾回收不会回收任何物理资源,只能回收堆内存中对象所占用的内存。

不管是否try是否引发异常,cache是否被执行,除非在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);
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: