java异常处理

软件程序在运行过程中,可能出现意外(Exception),运行中不期而至的问题。

  • 检查性异常:用户错误或问题引起的异常,程序员无法预见的
  • 运行时异常:可能被程序员避免的异常,可以在编译时被忽略
  • 错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如栈溢出

java把异常当做对象来处理,基于java.lang.Throwable

api定义了许多异常类,主要分为错误(Error)和异常(Exception)两类

部分如下图:

error类对象由java虚拟机生成抛出,大多数与执行者无关

例如:

  • OutOfMemoryError:虚拟机运行错误
  • NoClassDefFoundError:类定义错误
  • LinkageError:链接错误

异常:

运行时异常:

这些异常一般是程序逻辑错误引起的,和程序员有关

区别:

  • Error是灾难性的致命错误,程序无法控制,一般java虚拟机(jvm)会选择终止线程
  • Exception通常情况是可以被程序处理的

异常处理机制

五个关键词:

try,catch,finally,throw,throws

int a = 1;int b = 0;//捕获多个异常从小到大try {//监控区域    System.out.println(a/b);}catch (ArithmeticException e){//如果出现ArithmeticException错误    System.out.println("程序出现错误");    //打印错误跟踪    System.out.println(e.fillInStackTrace());    System.exit(0);}catch (Exception e){    System.out.println("程序出现错误11");    System.out.println(e.fillInStackTrace());        }finally {    //不论是否出现错误都执行    System.out.println("finally");}/*程序出现错误java.lang.ArithmeticException: / by zerofinally

选中代码块快捷键ctrl+alt+t(surround with)

int a = 1;    int b = 0;    if(b==0){        throw  new ArithmeticException();//主动抛出异常    }}/*out :Exception in thread "main" java.lang.ArithmeticException*///方法抛出异常 int a = 1; int b = 0; isZero(b);    //假设这个方法处理不了异常,向上抛出异常public static void isZero(int b) throws ArithmeticException{        if(b==0){            throw  new ArithmeticException();        }    System.out.println("aa");    }/* out:Exception in thread "main" java.lang.ArithmeticExceptionat com.xxx.Student.isZero(Student.java:12)at com.xxx.Student.main(Student.java:7)

自定义异常

继承Exception

public class MyException extends  Exception{    //传递数字大于10    private  int detail;    public MyException(int detail) {        this.detail = detail;    }    //打印异常信息    @Override    public String toString() {        return "MyException{" +                "detail=" + detail +                '}';    }}//b=11public static void isZero(int b) throws MyException {        if(b>10){            throw  new MyException(b);        }    }//out:MyException{detail=11}