异常

1. 异常

编译或运行时异常

Java代码把异常封装成了一个类。

出现问题时,就回创建异常类对象并抛出异常相关信息(异常出现的位置、原因等)。

2. Exception

Exception类及其子类是Throwable的一种形式。

  • Throwable常用方法:
    • String getMessage():原因
    • String toString():类型、原因
    • void printStackTrace():类型、原因、位置

它用来表示Java程序中可能出现的异常,并要求对产生的异常进行合理的异常处理。

2.1 Error

用来表示Java程序中可能会产生的严重错误。只能通过修改代码避免。

2.2 异常和错误的区别

2.2.1 异常

程序在编译和运行期间发生的,XXXException。

可对异常进行具体的处理。

若不处理,程序将结束运行。

eg.ArrayIndexOutOfBoundsException

2.2.2 错误

程序在运行期间发生某种错误XXXError。

通常无具体的处理方式,程序将运行结束。

往往是系统级别的,都是JVM所在系统发生的。

eg.OutOfMemoryError

2.3 异常分类

2.3.1 运行时异常

RuntimeException的子类就是运行时异常。

在编译时其可以自由选择处理或者不处理。

2.3.2 编译时异常

在编译时期必须进行处理。

是Exception的子类中非RuntimeException子类。

2.4 处理方式

2.4.1 JVM处理异常的方式

若出现我们未处理的异常,JVM会进行相应的处理。

它将异常的类型、原因以及位置显示在命令行,并且终止程序。

异常后面的代码不会执行。

2.4.2 捕获处理

try....catch语句

执行顺序:

  • 首先执行try语句,若发生异常,异常下面的代码不执行,直接跳入catch语句中;
  • catch语句结束后,整个try...catch结束
  • 若无异常发生,try结束后,try...catch结束,不执行catch语句。

2.4.3 声明 throws

不想或无法处理时,在方法声明处声明异常。

处理异常的是方法的调用者。

从main()中抛出的是JVM处理。

class ArrayTools{
    pubic static int getElement(int[] arr,int index){
        int element=arr[index];
        return element;
    }
}

class ExceptionDemo{
    public static void main(String[] args){
        int[] arr={34,12,67};
        int num=ArrayTools.getElement(arr,4);
        System.out.println("num="+num);
        System.out.println("over");
    }
}

3. 抛出异常 throw

当调用方法使用接收到的参数时,首先要对参数进行合法性判断。

数据若不合法,就告知调用者,传递合法的数据。

3.1 抛出异常的具体步骤

  1. 创建一个异常对象昂,封装一些信息。
  2. throw完成抛出
  • throw将异常对象传递到调用者处,并结束当前方法的执行。
  • throw new 异常类名(参数);
public static int getElement(itn[] arr,int index){
    if(arr==null)
        throw new NullPointerException("元素不存在");
    if(index<0||index>arr.length-1)
        throw new ArrayIndexOutOfBounds("下标错误");
    ...
}

4. 声明异常 throws

 

如果有方法内通过throw抛出了编译时异常,而没有捕获处理,那必须通过throws进行声明,让调用者处理

public void show(int x) throws Exception{
    if(x>0)
        throw new Exception();
    else
        System.out.println("show run");
}

多个异常用 , 隔开

public static int gerElement(int[] arr,int index) throws NullPointerException,ArrayIndexOutOfBoundsException{
    ...
}
    

5. 捕获异常

try...catch

try...catch...finally

try...catch...catch...catch...(多个catch)

try{
    ...
}catch(异常类 变量){
    //异常处理的语句
}finally{
    //一定会被执行的语句
}

产生异常时必须有处理方式,要么捕获要么声明

多个catch中,捕获的异常不能相同。若多个异常间有父子关系,则子类要求在上面的catch处理,父类异常在下面的catch处理。

6. 运行时异常

eg.NullPointerException、ArrayIndexOutOfBoundsException

6.1 特点

  • 方法中抛出运行时期异常,方法定义中无需throws声明,调用者也无需处理此异常
  • 运行时期异常一旦发生,需程序员修改源代码。
throw new RuntimeException();

6.2 细节

  • 子类覆盖父类方法时,如果父类方法中声明了异常,子类只能声明父类异常或者该异常的子类,或者不声明;
  • 当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集;
  • 当被覆盖的方法没有声明异常时,子类覆盖时无法声明异常

接口中没有声明异常,而实现的类覆盖方式时发生了异常,怎么办?

无法进行throws声明,只能catch捕获。

若处理不了,catch继续抛,但只能将异常转换成RuntimeException子类抛出。

7. 自定义异常

Java中的所有异常类都集成Throwable,或继承Throwable子类。这样该异常才可以被throw抛出。

特性:可抛性

可被throw关键字操作。

每个异常都调用了父类的构造方法,把异常的描述信息传递给了父类,让父类进行异常信息的封装。

class 异常名  extends Exception{
    public 异常名(){
        //无参
    }
    public 异常名(String s){
        super(s);
    }
}

继承自Exception还是RuntimeException?

  • 继承Exception:必须要throws声明,一声明就告知调用者进行捕获。一旦问题处理了,调用者的程序会继续执行
  • 继承RuntimeException:不需要throws声明,调用者无需编写捕获代码。一旦发生,调用者程序会停掉,并由JVM将信息显示到屏幕,让调用者修改代码。

8. 总结

  1. 自己解决:try...catch...finally
  2. 别人解决:throws
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值