JavaSE 11 异常处理

1、概念

运行中发生的不正常的现象,称为异常。注意要和编译错误区分开。
编译错误和编译时异常

2、异常的体系图

异常的体系图

3、异常的处理方式

⑴ 自行处理

语法

try {
    // 可能出现异常的代码 ①
    // 正常的代码 ②
} catch (Exception e) {
    // 处理异常的代码 ③
} finally {
    // 一定会执行的代码【不管出不出异常】 ④
}

执行顺序


⒈ 出现异常:①③④
⒉ 没有异常:①②④

注意事项

① catch和finally都可以被省略,但是不能同时省略
示例:
    try {
    } finally {
    }

    try {
    } catch (Exception e) {
    }

② 多个catch块可以同时存在,但是异常的父类异常需要放在最后。因为catch块的被执行顺序是自上而下判断的
③ 执行try块中的语句时,如果遇到了异常,则try 块中剩下的语句不会被执行
finally中的语句一定会被执行,不管出不出现异常
示例:

public class Test {
  public static void main(String[] args) {
    String name1 = new Test().getName1(); // 调用会出异常的方法
    String name2 = new Test().getName2(); // 调用没有异常的方法

    System.out.println(name1); // 王五
    System.out.println(name2); // 王五
  }

  private String getName1() {
    try {
      int i = 1 / 0; // 出现异常
      return "张三";
    } catch (ArithmeticException e) {
      return "李四";
    } finally {
      return "王五"; // 这里一定会被执行
    }
  }

  private String getName2() {
    try {
      return "张三";
    } catch (Exception e) {
      return "李四";
    } finally {
      return "王五"; // 这里一定会被执行
    }
  }
}

代码规范

① 尽量减少try块中的代码,把有可能出现异常的代码放在try块中,不容易出现异常的代码放在try块外。可以提高效率
② 尽量用多个catch块来代替多个try-catch
③ 在catch块中处理的语句可以为:
    catch(Exception e){
    }

    ⒈ 打印友好提示
        例如:System.out.println(“出错了…”);
    ⒉ 调用异常对象的getMessage( )方法
        例如:System.out.println(e.getMessage( ));
    ⒊ 打印错误的追踪信息。需要调用异常对象的printStackTrace( )方法
        例如:e.printStackTrace( );

⑵ 调用方处理


在可能出现异常的方法的声明处, 使用throws关键字,将异常所属的类型或异常所属类型的父类抛出。

示例:
    修饰符 返回值类型 方法名(形参列表) throws Exception {
    }

这会将异常向上抛给调用者,如果调用者自己不处理,还可以继续向上抛出,直到抛给main方法。这时如果main方法还不处理,则还可以继续抛出,这时就抛给了虚拟机。虚拟机将会打印异常错误的堆栈追踪日志的信息。

4、常见的运行时异常

RuntimeException


运行时异常。它是那些可能在 Java 虚拟机正常运行期间抛出的异常的父类。

NullPointerException


空指针异常。当试图调用空引用的属性或方法时,会报此异常。
示例:
    String str = null;
    System.out.println(str.length( ));

IndexOutOfBoundsException

下标越界异常。当试图访问超出范围的索引时,会报此异常。【索引的范围:0 到 长度 - 1】
直接已知子类:
    ArrayIndexOutOfBoundsException
    StringIndexOutOfBoundsException
示例:
    int[] numbers = new int[2];
    System.out.println(numbers[2]);

ClassCastException


类型转换异常。当试图将某对象强制转换为不是该对象所属的类型时,会报此异常。
示例:
    Object obj = 1.5;
    String str = (String) obj;

NumberFormatException

数字格式不正确。当试图将字符串转换为数值时,但该字符串不是适当的数值格式,则会报此异常。
示例:
    String str = “abc”;
    int i = Integer.parseInt(str);

AritmeticException

数学运算异常。当出现异常的运算条件时,会报此异常。例如,一个整数“除以零”时,抛出此类的一个实例。
示例:
    int i = 1 / 0;

5、自定义异常

步骤:⑴ 定义一个类,让其继承RuntimeException或Exception
⑵ 编写有参构造器,形参为String类型,显示调用父类的有参构造器。【用于指定错误信息】

示例:

class MyException extends RuntimeException {
  public MyException() {}

  public MyException(String message) {
    super(message);
  }
}

6、生成异常对象

⑴ 系统自动抛出异常对象


当运行时出现的异常,属于Throwable的子类实例。例如常见的运行时异常。

⑵ 手动抛出异常对象


使用throw关键字。多用于生成自定义异常。
语法:throw new 自定义异常类名(错误信息);
示例:throw new MyException(“出错了!”);

7、throw和throws的对比

                   throw                  throws

———————————————————————————
定义的位置                 方法中                             方法声明时

表达的功能           生成异常的对象               将异常抛给调用方
                                                                 (异常处理的方式之一)

关键字后跟什么         异常对象                            异常类型

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值