【学习笔记】Java基础知识点——第6章·异常

第6章  异常

6.1  Java的异常处理机制

6.1.1 异常处理机制

Java中异常的作用是:增强程序健壮性。

Java中异常以类和对象的形式存在。

6.1.2 Java异常的继承结构

派生于RuntimeException的异常包括以下问题(如果出现此种异常就一定是你的问题):

  • 错误的强制类型转换——ClassCastException。
  • 数组访问越界——ArrayIndexOutOfBoundsException。
  • 访问null指针——NullPointerException。

不是派生于RuntimeException的异常包括:

  • 试图超越文件末尾继续读取数据。
  • 试图打开一个不存在文件。
  • 试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在。

6.1.3 编译时异常和运行时异常的区别

编译时异常和运行时异常,都是发生在运行阶段。编译阶段异常是不会发生的。

编译时异常必须在编译(编写)阶段预先处理,如果不处理编译器报错。所有异常都是在运行阶段发生的。因为只有程序运行阶段才可以new对象,异常的发生就是new异常对象。编译时异常一般发生的概率比较高。

6.1.4 编译时异常其他名字:

受检异常(受控异常)、检查型异常(CheckedException)。

6.1.5 运行时异常其它名字:

未受检异常(非受控异常)、非检查型异常(UnCheckedException)。

6.1.6 声明检查型异常

在自己编写方法时,不必声明这个方法可能抛出的所有异常,,需要记住在遇到下面4种情况时会抛出异常:

  • 调用了一个抛出检查型异常的方法,例如:FileInputStream构造器。
  • 检测到一个错误,并且利用throw语句抛出一个检查型异常。
  • 程序出现错误,例如,a[-1]=0会抛出一个非检查型异常(这里会抛出ArrayIndexOutOfBoundsException异常)。
  • Java虚拟机或运行时库出现内部错误。

如果出现前两种情况,则必须告诉调用这个方法的程序员有可能抛出异常。因为任何一个抛出异常的方法如果没有处理器捕获这个异常,当前执行的线程就会终止。

6.1.7 创建异常类

throw关键字虽然可以用于抛出Exception类中的子类异常(throw相当于return语句),但更重要的用途是抛出自定义异常。使用throw关键字抛出异常的语法如下:throw new 异常类型名(异常信息)。

创建自定义异常时,需继承RuntimeException类或者Exception类。例如:

class 自定义类型异常名 extends Exception{
    public 自定义类型异常名 (){}
    public 自定义类型异常名 (String message){
        super(message);
    }
}

6.2  捕获异常

6.2.1 Java语言中对异常处理的两种方式

  1. 在方法声明的位置上,使用throws关键字,抛给上一级。谁调用我,我就抛给谁。抛给上一级。
  2. 使用try...catch语句进行异常的捕捉。这件事发生了,谁也不知道,因为我给抓住了。

注意:Java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了调用者JVM,JVM知道这个异常发生,只有一个结果:终止java程序的执行。

6.1.2 捕捉处理异常

try-catch-finally的语法,其中try中的“程序代码块指的是可能产生异常的代码”;catch中的“对Exceptiontype的处理”的作用是捕捉并处理已产生的异常类型相匹配的异常对象e;finally中的代码块是异常处理过程中最后被执行的部分,无论程序是否产生异常,finally中的代码块都将被执行。实际应用中,finally中通常放置一些释放资源,关闭对象的代码。

程序在捕捉完异常信息之后,会执行finally代码块中的代码。另外,在以下3种特殊情况下,finally块不会被执行:

  • 在finally代码块中产生了异常。
  • 在前面的代码中使用了System.exit()退出程序。
  • 程序所在的线程死亡。

需要注意,如果使用了多个catch代码块,则catch代码块中的异常类顺序是先子类后父类。

6.1.3 在方法中抛出异常

如果某个方法可能会产生异常,但不想在当前方法中处理这个异常,则可以使用throws和throw关键字在方法中抛出异常。

1.使用throws关键字抛出异常

throws关键字常被应用于方法上,表示方法可能抛出的异常,当方法抛出多个异常时,可用逗号分隔异常类型名。使用throws关键字将方法产生的异常抛给上一级后,如果上一级不想处理该异常,那么可以继续向上抛出,但最终要有能够捕捉并处理这个异常的代码。

2.使用throw关键字抛出异常

假设一个名为readData的方法正在读取一个文件,文件承诺长度为1024个字符,然而读到733个字符后文件就结束了。你可能认为这是一种不正常的情况,希望抛出一个异常。首先要决定抛出什么类型的异常下面是抛出这个异常的语句:

throw new EOFException();

下面将这些代码放在一起:

StringreadData(Scanner in) throws EOFException{
    ...
    throw new EOFException();
}

EOFException类还有一个字符串参数的构造器,可以用来更细致地描述异常:

throw new EOFException("未达到文件承诺长度便结束");

3.throws关键字和throw关键字的区别

  1. throws用在方法声明后面,表示抛出异常,由方法的调用者处理,而throw用在方法体内,用来制造一个异常,由方法体内的语句处理。
  2. throws是声明这个方法会抛出这种类型的异常,以便使它的调用者知道要捕捉这个异常,而throw是直接抛出一个异常实例。
  3. throws表示出现异常的一种可能性,并不一定会产生这些异常,但如果使用throw,就一定会产生某种异常。

6.1.4 获取异常信息

取得异常描述信息:getMessage()

取得异常的堆栈信息(比较适合于程序调试阶段):printStackTrace();

获得异常对象的实际类型:e.getClass().getName()

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值