首页 > 技术文章 > 异常(exception)

cyqf 2021-03-23 18:43 原文

异常(exception)

  • 异常指程序在运行过程中出现不起而至的状况(网络连接失败)(文件找不到)(非法参数)。

常见的异常类型:

  1. 检查性异常:用户错误或问题引起的异常。例如打开一个不存在的文件 ,异常就产生了
  2. 运行时异常:在编译时被忽略的问题产生的异常
  3. 错误:错误不是异常,而是脱离程序控制的问题。错误在代码中常被忽略。

java中异常当作对象来处理,并定义一个基类java.lang.Fhrowable作为所有异常的超类

java的异常体系结构

最大的异常类为Throwable,后面一层层为子类。

Error又java虚拟机生成抛出,大多数错误与代码编写者所执行的操作无关

java虚拟机运行错误,当jvm不再有执行操作所需的内存资源时,将出现OutOfMemoryError.这些异常发生时jvm一般会选择终止。

Exception分支中有一个重要的子类RuntimeException(运行时异常)

  • ArrayIndexOutofBoundsException(数组下标越界)
  • NullPointerException (空指针异常)
  • ArithmeticException (算数异常)
  • MissingResourceException (丢失资源)
  • ClassNotFoundException (找不到异常)

Error和Exception的区别:

Error通常是灾难性的错误,是程序无法控制和处理的,当出现这些异常时,java虚拟机一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且在程序应可能的去处理这些异常

异常的处理机制

  • 抛出异常

  • 捕获异常

  • **常用关键字 **

    • try catch finally throw throws

语法:

try{

//监控区域,运行代码

}catch(运行后捕获异常的类型 变量){ //变量用来存放抓到的异常

//捕获到异常时执行

}

finally{

//处理善后工作,一般用于关闭需要关闭的地方,一定后执行的部分

}

finally{}可以省略,catch(){}必须写

catch(){}可以写多个,类似if else,层层递进

注:当写多个catch时,上面的只能比下面的作用域更小,从小到大。

在IDEA中,选中相应的代码,Ctrl+Alt+D可以选中相应的作用域包裹它。

假设一个方法里无法处理一个异常,那么可以主动抛出这个异常,这样做的好处时,抛出异常后不会影响程序的继续执行。

在程序中主动抛出使用throw抛出

在方法上抛出使用throws

在方法里面:

if(b==0)
    throw new ArithmeticExcetion();

在方法上:

public void test(int a,int b) throws ArithmeticException{
    a=a/b;
}

package tip;

public class Demo02 {
    public static void main(String[] args) {
        try {
            new Demo02().test(1,0);
        } catch (ArithmeticException e) {
            e.printStackTrace();
        }

        try {
             new Demo02().test02(1,0);
        }catch (ArithmeticException e){
            e.printStackTrace();
        }
    }
    public void test(int a,int b){
        if (b==0){
             throw new ArithmeticException();
        }

    }
    public void test02(int a,int b) throws ArithmeticException{
    }
}

自定义异常

  • 使用java内置的异常类可以描述变成中出现的绝大多数异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需继承Exception类即可
  1. 创建自定义的类
  2. 在方法里通过throw关键字抛出异常
  3. 如果在当前抛出的方法里处理异常,可以使用try-catch语句捕获并处理;否则在方法里的声明处通过throws关键字指明要抛出给方法调用者的异常,继续下一步操作。
  4. 在出现异常的方法的调用者中捕获并处理异常

eg:


package tip;
public class MyException extends Exception {//继承Exception
    private int detail;
    //传递值大于10就会错误
    MyException(int a){ //构造器
           this.detail=a;
    }

    @Override

    public String toString() {  //输出信息

          return "您输入的值过大,应为"+this.detail+"-"+(this.detail-10)+"以下";
    }
}

调用类:

package tip;

import java.util.Scanner;

public class Application {
    public static void main(String[] args) {
          int a;
        Scanner scanner=new Scanner(System.in);
        System.out.println("输入传入的数");
        a=scanner.nextInt();
        new Application().test01(a);//调用方法
    }

    public void test01(int a){

        try{
            if (a>10)//数字大于10抛出
               throw  new MyException(a);//使用throw抛出
            System.out.println("ok");//抛出异常时不执行
           }catch (MyException e)
           {
               System.out.println("MyException:"+e);
           }
    }

}

推荐阅读