Java —异常

  • 异常简介

  有异于常态,和正常情况不一样,有错误出现,阻止当前方法或作用域,称为异常。

  Java中的异常类都继承Throwable类,它有两个子类:Error和Exception。Error很少接触,主要指虚拟机错误、线程死锁等。Exception异常,可能是编码、环境、用户操作输入出现问题。

  Exception有很多子类,主要有RuntimeException(非检查异常)和其他异常类(检查异常)。其中引起RuntimeException可能是NullPointerException(空指针异常)、ArrayIndexOutOfBoundsException(数组下标越界异常)、ClassCastException(类型转换异常)和ArithmeticException(算术异常)等,说明代码的逻辑有问题,需要改进代码,他们都是RuntimeException的子类。引起检查异常可能是IOException(文件异常)、SQLException(SQL异常)等。

  • 处理异常
try{
    //一些会抛出异常的方法  
} catch (Exception e) {
    //处理异常的代码块
}

  try抛出异常后,抛出异常的方法会终止执行,程序的控制权将被移交给catch块中的异常处理程序。try-catch语句块执行完之后,外面的语句会顺序执行。

  如果会出现多种类型的异常,这时用到了多重catch块,在try块后用多个catch块来捕获多种类型的异常,对其进行相应的处理。

try{
    //一些会抛出异常的方法  
} catch (Exception e) {
    //处理异常的代码块
} catch (Exception2 e) {
    //处理异常的代码块
} ...(n个catch块)...{
}

  注意先子类后父类的顺序编写catch语句块。

  用try-catch语句块处理完异常后,进行善后工作,可以用finally语句块。

try{
    //一些会抛出异常的方法  
} catch (Exception e) {
    //处理异常的代码块
} catch (Exception2 e) {
    //处理异常的代码块
} ...(n个catch块)...{
} finally {
    //最终将要执行的一些代码
}

  •  异常抛出

  throw — 将产生的异常抛出

  throws — 声明将要抛出何种类型的异常

public void 方法名(参数列表) throws 异常列表 {
    //调用会抛出异常的方法或者throw new Exception();
}

  可以抛出多种类型异常,每种异常类型中间用逗号隔开。如果某个方法调用了抛出异常的方法,那么这个方法必须添加try-catch语句去捕获这种异常,或者添加throws声明,将异常抛出给更上一层的调用者去进行处理。

package com.test;

public class Demo {
    public static void main(String[] args) {
        Demo demo = new Demo15();
        demo.complete();
        try {
            demo.complete1();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    public void devide(int one, int two) throws Exception {
        if (two == 0) {
            throw new Exception("两数相除,除数不能为0");
        } else {
            System.out.println("两数相除,结果为:" + one / two);
        }
    }
    
    public void complete() {
        try {
            devide(5, 0);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    
    public void complete1() throws Exception {
        devide(3, 0);
    }
}

  执行结果:

  两数相除,除数不能为0
  两数相除,除数不能为0

  • 自定义异常
class 自定义异常类 extends 异常类型 {

}
package com.test;

public class MyException extends Exception {
    public MyException () {
        
    }
    public MyException(String message) {
        super(message);
    }
}
  •  异常链
package com.test;

public class ExceptionChain {
    public static void main(String[] args) {
        ExceptionChain ec = new ExceptionChain();
        try {
            ec.test2();
            //ec.test3();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void test1() throws Exception {
        throw new Exception("抛出异常1");
    }
    public void test2() {
        try{
            test1();
        } catch (Exception e) {
            RuntimeException newExc = new RuntimeException("抛出异常2");
            newExc.initCause(e);
            throw newExc;
        }
        
    }
public void test3() { try{ test1(); } catch (Exception e) {
//处理异常的另一种形式 RuntimeException newExc
= new RuntimeException(e); throw newExc; } } }

  执行结果:

java.lang.RuntimeException: 抛出异常2
    at com.test.ExceptionChain.test2(ExceptionChain.java:20)
    at com.test.ExceptionChain.main(ExceptionChain.java:7)
Caused by: java.lang.Exception: 抛出异常1
    at com.test.ExceptionChain.test1(ExceptionChain.java:14)
    at com.test.ExceptionChain.test2(ExceptionChain.java:18)
    ... 1 more
原文地址:https://www.cnblogs.com/tianxintian22/p/6579853.html