- 异常简介
有异于常态,和正常情况不一样,有错误出现,阻止当前方法或作用域,称为异常。
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