疯狂java第十章——异常

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);
    }
}
 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值