java异常机制

一。JAVA异常

• 异常( Exception  也称例外)就是在程序的运行过程中所发生的不正常的事件,它会中 断正在运行的程序 。

• 当Java程序出现以上的异常时,就会在所处的方法中产生一个异常对象。这个异常对象 包括异常的类型,异常出现时程序的运行状态以及对该异常的详细描述。

    Java异常类层次结构图:


• Error

Error类层次描述了Java运行时系统内部错误和资源耗尽错误,一般指与JVM或动态加载等相关的 问题,如虚拟机错误,动态链接失败,系统崩溃等。

• Exception 

Exception类是所有异常类的父类,其子类对应了各种各样可能出现的异常事件。

    • Exception分类 

        • 运行时异常Runtime Exception(unchecked Exception) 

            一类特殊的异常,可不必对其处理,系统自动检测处理,如被 0 除、数组下标超范围等,其产生比较频繁,处理麻烦,如果显式的声 明或捕获将会对程序可读性和运行效率影响很大 

        • 检查异常 Checked  Exception 

  ·         必须捕获进行处理,否则会出现编译错误

       注意:只有Java提供了Checked异常,体现了Java的严谨性,提高了Java的健壮性。同时也是一个 备受争议的问题 

二。异常处理

• Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws


1.使用try-catch块或try-catch-finally块

try块:可能产生异常的代码块

 • 情况1:try块中代码没有出现异常

            • 不执行catch块代码,执行catch块后边的代码

 • 情况2:try块中代码出现异常,catch中异常类型匹配(相同或者父类)

             • 执行catch块代码,执行catch块后边的代码

 • 情况3:try块中代码出现异常, catch中异常类型不匹配 

            • 不执行catch块代码,不执行catch块后边的代码,程序会中断运行 

 • 注意 

        • 出现异常后,Java会生成相应的异常对象,Java系统,寻找匹配的catch块,找到后将异常对象付给catch块异常参数 

        • 出现异常后,try块中尚未执行的语句不会执行 

        • 出现异常后并处理后,catch块后面的语句还会执行

catch块中如何处理异常

     • 输出用户自定义异常信息 

             • 例如  System.err.println("除数不能为零。");   System.err.println("被除数和除数必须是整数。");等

    • 调用异常对象的方法输出异常信息 

            • toString ( )方法,显示异常的类名和产生异常的原因

             • void printStackTrace()   输出异常的堆栈信息 

            • String getMessage()返回异常信息描述字符串,是printStackTrace()输出信息的一部分

    • 继续向上抛出异常 

            • throw e

finally块:

• 在try-catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行

• 通常在finally中关闭程序块已打开的资源,比如:文件流、释放数据库连接等。

• finally块中语句不执行的唯一情况

     • 异常处理代码中执行System.exit(1)退出Java虚拟机 

• Finally块的具体执行过程

    • 无异常  try-finally 

    • 有异常   try-catch-finally

    • 如果遇到return/throw,先执行finally中语句块,再执行return/throw

• 多重catch

    • 一段代码可能会引发多种类型的异常

     • 当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个与异常类型匹配的catch语句

     • 执行其中一条 catch 语句后,其后 catch 语句将被忽略 

       所以,在捕获异常时,首先应该捕获最特殊的异常,  然后再逐渐一般化(即先子类后父类 )

2. 使用throws 声明异常(用于在方法定义时声明该方法要抛出的异常类型

• 声明异常throws

    • 当Checked Exception产生时,不一定立刻处理它,可以再把异常Throws出去,由方法的调用者进行处理或继续抛出。

    • 如果一个方法抛出多个已检查异常,就必须在方法的首部列出所有的异常,之间以逗号隔开。

• 子类声明的异常范围不能超过父类声明范围

     • 父类没有声明异常,子类也不能。

     • 不可抛出原有方法抛出异常类的父类或上层类 。

3.使用throw手动抛出异常

• Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要手工创建 并抛出。

• 在捕获一个异常前,必须有一段代码先生成异常对象并把它抛出。这个过程我们可以手工做, 也可以由JRE来实现,但是他们调用的都是throw子句。

• 注意抛出运行时异常和Checked异常的区别 

     • 抛出Checked异常,该throw语句要么处于try块中,要么方法声明中是由throws抛出。

     • 抛出运行时异常,没有以上要求(因为运行时异常可以由系统抛出)

三。自定义异常

• 在程序中,可能会遇到任何标准异常类都没有充分的描述清楚的问题,这种情况下可以 创建自己的异常类
• 继承Exception类或者它的子类即可 

• 习惯上,定义的类应该包含2个构造器:一个是默认构造器,另一个是带有详细信息的 构造器


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值