JAVA捕获和抛出异常

JAVAException和Error及其捕获和抛出

Throwable

  • Throwable 是 Java 语言中所有错误或异常的超类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。
  • 实例分为 Error (错误)和 Exception(异常) 两种。
    在这里插入图片描述

Error(错误)

  • Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。
  • 这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。

Exception(异常)

1、什么是Exception

  • Java 中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行程序的正常指令流。

2、Exception的种类

在这里插入图片描述

  • CheckedException需要捕获或抛出。
  • 由于RuntimeException可能发生的情况太普遍,几乎每行代码都会有RuntimeException的风险,因此反而无需去捕获。

3、自定义异常

  • 如果 Java 提供的内置异常类型不能满足程序设计的需求,这时我们可以自己设计 Java 类库或框架,其中包括异常类型。
  • 实现自定义异常类需要继承 Exception 类或其子类,如果自定义运行时异常类需继承 RuntimeException 类或其子类。
  • 自定义异常类一般包含两个构造方法:一个是无参的默认构造方法,另一个构造方法以字符串的形式接收一个定制的异常消息,并将该消息传递给超类的构造方法。
  • 使用try-catch时需手动抛出自定义异常,而非自定义异常不需要抛出。
语法形式:<class><自定义异常名><extends><Exception>{}
  • 在代码体内抛出自定义异常(throw)
public class ThrowAndThrows {
    public void method(int i)  {
        try{
            if(i<0){
                throw new MyException();
            }
        } catch(MyException e1){
            e1.myException();
        } finally{
            System.out.println("无论正常执行还是抛出异常均执行的代码块");
        }
        return;
    }

}
class MyException extends Exception{
    public MyException(){
        super();
    }
    public MyException(String s){
        super(s);
    }
    public void myException(){
        System.out.println("输入的数字小于0");
    }
}
  • 在方法上抛出自定义异常(throws)
public class ThrowAndThrows {
    public static void method(int i) throws MyException {
        if(i<0){
            throw new MyException();
        }
    }

    public static void main(String[] args) {
        int i = 0;
        try{
            method(i);
        }catch(MyException e){
            e.myException();
        }catch (NullPointerException e){
            System.out.println("更高一级异常");
        }finally {
            System.out.println("无论正常执行还是抛出异常均执行的代码块");
        }
    }

}
class MyException extends Exception{
    public MyException(){
        super();
    }
    public MyException(String s){
        super(s);
    }
    public void myException(){
        System.out.println("输入的数字小于0");
    }
}

Exception(异常)处理机制

1、抛出

  • 遇到异常问题不进行具体处理,而是继续抛给调用者 (throw,throws)
  • 抛出异常有三种形式,一是 throw,再就是 throws,还有一种系统自动抛异常。
  1. throw:用在方法内,后面跟可处理该异常的实例异常对象,该对象反射的类一般为Exception类的子类,或自定义异常类(同样继承Exception类)。
public class ThrowAndThrows {
    String str = "字符变量";

    public void main(String[] args) {
        if(this.str.equals("字符变量")){
            System.out.println(str);
        }else {
            /*
            手动抛出一个数字格式化异常;
            throw用于方法内,且抛出至可处理该异常的实例异常对象
             */
            throw new NumberFormatException();
        }
    }
}
  1. throws:用在方法上,后面跟的是异常类,且可以跟多个异常类;
语法:(修饰符)(方法名)([参数列表])[throws(异常类)]{……}
public void method(int a) throws Exception1,Exception3{……}
详细代码:
public class ThrowAndThrows {
    String str = "字符变量";
    /*
    抛出异常
    throws用于方法上,且抛出至异常类
     */
   public void method(String s) throws Exception, IOException, NumberFormatException{
       if (s.equals(this.str)){
           System.out.println(s);
       }
   }
}
  1. throws和throw区别
  • throws E1,E2,E3只是告诉程序这个方法可能会抛出这些异常,方法的调用者可能要处理这些异常,而这些异常E1,E2,E3可能是该方法体产生的。
  • throw则是明确该地方要抛出这个异常。

2、捕获

  • try{…}catch(Exception e){…}fianlly{…}
  1. 使用try{…}catch{Exception e}fianlly{…},且有多个catch(Exception e){…}时,catch抛出的异常依次递增,即后面catch抛出异常比前面的异常范围大,若前面异常范围大于后面异常,则后面异常捕获不到。
  2. 使用try-catch时需手动抛出自定义异常,而非自定义异常不需要抛出。
try{
    //代码块
}catch(Exception e){
    //抛出异常后所要进行的操作
}fianlly{
    //无论正常执行还是抛出异常均执行的代码块
}
详细代码:
public class ThrowAndThrows {
    public void method(){
        try{
            int i = 1/0;//发生异常立即跳往catch语句中执行,不执行异常代码下面的代码
            System.out.println("输出结果为:" + i);
        }catch(ArithmeticException e){
            e.printStackTrace();
            System.out.println("编译报错,除数不能为0");
        }finally {
            System.out.println("无论正常执行还是抛出异常均执行的代码块");
        }
        return;
    }
}
详细代码:
public class ThrowAndThrows {
    public void method(){
        try{
            int i = 1/0;//发生异常立即跳往catch语句中执行,不执行异常代码下面的代码
            System.out.println("输出结果为:" + i);
        }catch(ArithmeticException e){
            e.printStackTrace();
            System.out.println("编译报错,除数不能为0");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("无论正常执行还是抛出异常均执行的代码块");
        }
        return;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值