JAVA(十五)异常处理

异常处理

异常处理概述

使用返回值状态标识异常

		public String abc(){
      ......
        returen str;
    }

异常处理机制

当程序中抛出一个异常后,程序从程序中导致异常的代码处跳出,Java虚拟机检测寻找try关键字匹配的处理异常的catch块。

异常的捕获和处理

Throwble / Error / Exception

Java异常结构中定义有Throwable类,Exception和Error是派生的两个子类。

Exception表示:网络故障、文件损坏、设备错误、用户输入非法等情况导致的异常,这类异常是可以通过Java异常捕获机制处理的。

Error表示:Java运行时环境出现的异常,例如JVM内存溢出等。

try_catch

try{…}语句指定类一段代码,该代码块可以一次捕获并处理范围内的多个异常。在程序执行过程中,该代码块可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句分别对这些异常作出相应的处理。

如果没有异常产生,所有的catch语句都将被略过不执行。

在catch语句块中是对异常进行处理的代码。catch中声明的异常对{catch(Exception e)}封装了异常事件发生的信息,在catch语句块中可以使用这个对象的一些方法获取这些信息。

  • 其语法结构为:

    ...
    try{
      ...//可能出现的异常
    }catch(Exception e){
      ...//处理该异常的代码块
    }
      ...
    

多个catch

每个catch语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常。catch捕获的异常类型由上至下的捕获异常类型的顺序应是子类到父类(即小到大)。

//例如
try{
  ...
}catch(NullPointerException e){		//子类异常应在上面捕获
  ...
}catch(RunTimeException e){				//父类异常在下面捕获
  ...
}catch(Exception e){							//捕获Exception的异常放最下面
  ...
}

通常在书代码写时,应当做最后一个catch中捕获Exception,这样可以保证代码不会因为出现一个未在catch中声明的异常而导致捕获失败使得程序终止。

finally的作用

finally语句为异常处理提供一个统一的出口,使得在控制流程到程序其他部分以前,能够对程序的状态统一管理。

无论try所指定的程序块中是否抛出异常,finally所指定的代码都要被执行,通常在finally语句中可以进行资源的消除工作,如:关闭打开的文件、删除临时文件等。

finally语句块只能定义在try语句块之后,或者是最后一个catch语句块之后,且只能定义一次。

throw关键字

当程序发生错误而无法处理时,会抛出对应的异常对象,除此之外,在某些时刻,会想要自行抛出异常,例如在异常处理结束后,再将异常抛出,让下一层异常处理区块来捕捉。若想自从抛出异常,可以使用“throw”关键词,并生成指定的异常对象。

//例如
public static void StringToDate(String str) throw PraseException{...}

throws方法的重写

当使用继承时,在父类的某个方法上生声明了throws抛出某些异常,而在子类中重写该方法时,我们可以使用以下的操作:

  1. 不处理异常(重写方法时不声明throws)
  2. 可仅在throws中声明父类中声明的部分异常
  3. 可以在throws中声明父类方法汇总抛出的异常的子类异常。

但是不能进行以下操作:

  1. 重写方法时在throws中声明抛出额外的异常
  2. 重写方法时在throws中声明父类方法中声明的抛出异常的父类异常

Java异常的API

RuntimeException

Java 异常可以分为可检测异常和非检测异常。

可检测异常:可检测异常经编译器验证,对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则,不捕捉这个异常编译器就不通过,不允许编译。

非检测异常:非检测异常不遵循处理或声明规则。在产生此类异常时,不一定非要采用任何适当操作,编译器不会检测是否已经解决了这样的一个异常。

常见RuntimeException

  • 常见的其异常包括:

    IllegalArgumentException; 抛出的异常表明方法传递了一个不合法或不正确的参数

    NullPointerException; 当应用程序试图在需要的地方使用 null 时,抛出该异常

    ArrayIndexOutOfBoundsException; 当使用的数组下标超出数组允许范围时,抛出该异常

    ClassCastException; 当时图将对象强制转化为不是实例的子类时,抛出该异常

    NumberFormatException; 当程序员试图将字符串转换成一种数值类型,但格式不适当时,抛出该异常

Exception常用API

printStackTrace

Throwable中定义了一个方法可以输出错误信息,用来跟踪异常事件发生时执行堆栈的内容。

  • 该方法的定义为:

    void printStackTrace();

//例如
try{
  ...
}catch(Exception e){
  e.printStackTrace();		//输出执行堆栈信息
}

getMessage

Throwbale中定义了一个方法可以得到有关异常事件的信息。

  • 该方法的定义为:
    String GetMessage();
try{
  ...
}catch(Exception e){
  System.out.println(e.getMessage());
}

getCause

很对时候,当一个异常由另一个异常导致异常而被抛出的时候,Java库和开放源代码会将一种异常包装成另一种异常。这时,日志记录和打印根异常就变的非常重要。Java异常提供了getCause()方法来检索导致异常的原因,这些可以对异常根层次的原因提供更多的信息。该Java功能对代码的调试或故障排除有很大的帮助。另外,如果要把一个异常包装成另一种异常,构造一个新异常就要传递源异常。

  • 该方法的定义为:

    Throwable getCause(); 获取该异常出现的原因

自定义Exception

自定义异常的意义

Java异常机制可以保证程序更安全和更健壮。虽然Java类库已经提供了很多可以直接处理异常的类,但是有时候为了更加精准地捕获和处理异常以呈现更好的用户体验,需要开发者自定义异常。

继承Exception自定义异常

创建自定义异常类,语法格式:

public class [自定义异常类名] extends Exception{...}

其构造方法的编写

当定义好自定义异常后,我们可以通过Ecplice来自动生成相应的构造方法。

具体步骤如下:

  1. 声明个类并继承自Exception
  2. 右键点击score
  3. 选择Generate Constructors form Superclass
  4. 选择父类中所有构造方法后确认生成
public class MyException exdents Exception{
  public MyException(){
    super();
  }
  
  public MyException(String message, Throwable cause){
    super(message, cause);
  }
  
  public MyException(String message){
    super(message);
  }
  
  public MyException(Throwable cause){
    super(cause);
  }
}

 


❤️ END ❤️
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JOEL-T99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值