第七章 异常

第七章 异常

1.异常处理

Java编程语言使用异常处理机制为程序提供了错误处理的能力

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

2.try-catch

  • 正常
public void method(){
         try {
                  // 代码段(此处不会产生异常)
         } catch (异常类型 ex) {
                 // 对异常进行处理的代码段
         }
         // 代码段
}
  • 出现异常
public void method(){
    try {
	        // 代码段 1
	        // 产生异常的代码段 2
            // 代码段 3
    } catch (异常类型 ex) {
            // 对异常进行处理的代码段4
    }
         // 代码段5
}

异常是一种特殊的对象,类型为java.lang.Exception或其子类

**printStackTrace()**的堆栈跟踪功能显示出程序运行到当前类的执行流程

异常堆栈信息:
java.util.InputMismatchException(异常类型)
at java.util.Scanner.throwFor(Scanner.java:840)
at java.util.Scanner.next(Scanner.java:1461)
at java.util.Scanner.nextInt(Scanner.java:2091)
at java.util.Scanner.nextInt(Scanner.java:2050)
at cn.jbit.exception.Test3.main(在此方法中抛出了异常)(Test3.java:15(出现异常的位置
))
  • 异常类型不匹配
public void method(){
        try {
                 // 代码段 1
                // 产生异常的代码段 2
               // 代码段 3
        } catch (异常类型 ex) {
               // 对异常进行处理的代码段4
        }
        // 代码段5
}
程序中断运行

在catch块中处理异常:

加入用户自定义处理信息

System.err.println("出现错误:被除数和除数必须是整数 ");

调用方法输出异常信息:

e.printStackTrace();

异常对象常用的方法:

方法说明
void printStackTrace()输出异常的堆栈信息
String getMessage()返回异常信息描述字符串,是printStackTrace()输出信息的一部分

3.常见的异常类型

异常类型说明
Exception异常层次结构的父类
ArithmeticException算术错误情形,如以零作除数
ArrayIndexOutOfBoundsException数组下标越界
NullPointerException尝试访问 null 对象成员
ClassNotFoundException不能加载所需的类
IllegalArgumentException方法接收到非法参数
ClassCastException对象强制类型转换出错
NumberFormatException数字格式转换异常,如把"abc"转换成数字

4.try-catch-finally

在try-catch块后加入finally块:

是否发生异常都执行

不执行的唯一情况:无异常,中断程序,退出Java虚拟机

存在return的try-catch-finally块:

public void method(){
         try {
               // 代码段 1
              // 产生异常的代码段 2
          } catch (异常类型 ex) {
              // 对异常进行处理的代码段3
               return;
          }finally{
                // 代码段 4
          }
}
try发生异常,产生异常对象,异常类型匹配,进入catch块,执行return保存数据,执行finally块,执行return退出方法

5.多重catch块

引发多种类型的异常

  • 排列catch 语句的顺序:先子类后父类
  • 发生异常时按顺序逐个匹配
  • 只执行第一个与异常类型匹配的catch语句

6.声明异常

throws声明某个方法可能抛出的各种异常,多个异常用逗号隔开

  • 方式1:调用者处理异常

  • 方式2:调用者继续声明异常

    main()方法声明的异常由Java虚拟机处理

7.抛出异常

除了系统自动抛出异常外,有些问题需要程序员自行抛出异常

  • 使用throw抛出异常

  • throw与throws

    throwthrows
    生成并抛出异常声明方法内抛出了异常
    位于方法体内部,可作为单独语句使用必须跟在方法参数列表后面,不能单独使用
    抛出一个异常对象,且只能是一个声明抛出异常类型,可以跟多个异常

异常体系结构:

Throwable:Exception和Error类的父类

Error:仅靠程序本身无法恢复的严重错误 Exception:由Java应用程序抛出和处理的非严重错误

Checked异常,程序必须处理该类异常 RuntimeException:运行时异常,不要求程序必须做出处理

8.自定义异常

使用自定义异常的步骤:

  1. 定义异常类(继承Throwable类、继承Excepion 或者RuntimeException)
  2. 编写构造方法,继承父类的实现类
  3. 实例化自定义异常对象
  4. 使用throw抛出

异常链:A方法调用B方法时,B方法却抛出了异常。

  • 抛出原有的异常:A方法与B方法进行了关联,不便于代码的修改和扩展
  • 抛出新的异常:异常链创建了新的异常但却保留了原有异常的信息

异常处理原则:

异常处理与性能

异常只能用于非正常情况

不要将过于庞大的代码块放在try中

在catch中指定具体的异常类型

需要对捕获的异常做处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值