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}