1、异常概述:
异常(不正常)的体系:
Throwable
Error:通常出现重大问题,如运行的类不存在或者内存溢出等;不编写针对代码进行处理;
Exception:在运行时出现的一起情况,可以通过try,catch,finally处理。
Exception和Error的子类名几乎都是以父类名作为后缀(除了Error类的ThreadDeath)。
详述
先来看一个异常的例子:除法运算4除以0(正常情况下除数不可为0)
package exceptionDemo; class Demo{ int div(int a,int b){ return a/b; } } public class ExceptionDemo1 { public static void main(String[] args){ Demo d=new Demo(); int x=d.div(4,0); System.out.println("x="+x); System.out.println("over"); } }
结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero at exceptionDemo.Demo.div(ExceptionDemo1.java:4) at exceptionDemo.ExceptionDemo1.main(ExceptionDemo1.java:10)
可以看到出现了ArithmeticException(运算异常),没有出现运算结果,也没有打印over,说明程序出现异常时就结束了。
异常是程序在运行时(注意是运行而不是编译,div(4,0)编译没有问题)出现不正常情况。要知道,问题也是现实生活中一个具体的事物,可以通过java类的方式对其进行描述,并将其封装成对象。异常其实就是java对不正常情况进行描述后的对象体现。
对于问题又划分为两类:
一种是严重的问题,java通过Error类进行描述,如运行的类不存(运行java haha,出现java.lang.NoClassDefFoundError)或者内存溢出(byte[] arr=new byte[1024*1024*600],需要占用1024*1024*600的内存,很容易超出虚拟机所管理的内存范围,从而出现java.lang.OutOfMemoryError),一般不编写针对性代码对其进行处理(已超出虚拟机的能力范围);
一种是非严重的问题,java通过Exception类进行描述,可以使用针对性的处理方式进行处理。
(想想一下疾病的可治愈:癌症;不可治愈:感冒发烧)
无论是Error还是Exception又有一些共性内容,如不正常情况的信息、引发原因等,可以向上抽取为Throwable.(可抛的)
详情查看JAVA API文档,(sun公司被甲骨文收购)文档地址https://docs.oracle.com/javase/8/docs/api/
Throwable(JAVA语言中所有错误或异常的父类,有自身的构造函数和getCause(),getMessage(),toString()等方法)
-----Error
-----Exception
2、异常的处理
java提供了下面特有的语句进行处理
try{ 需要被检测的容易出现问题的代码; } catch(异常类 变量){ 处理异常的代码;(处理方式) } finally{ 一定会执行的语句; }
a、
先介绍前两部分try、catch ,以上面的代码为例
try{ int x=d.div(4,0); System.out.println("x="+x); } catch(Exception e){ System.out.print("over"); }
在进行div(4,0)运算时,会抛出一个new ArithmeticException()对象,try可以检测到这个对象(若没有try语句,检测不到异常对象,主函数也无法处理该异常,虚拟机会进行默认处理,调用了默认异常处理机制,导致程序停止),并将之交给catch(捕获),此时
Exception e=new ArithmeticException(),然后是执行catch里的语句,即System.out.print("over")。
注意:System.out.println("x="+x)并没有执行,因为在div(4,0)处发生异常,进行了程序的跳转。
注意:已知Exception e=new ArithmeticException()(父类的引用接收子类对象),对捕获到的异常对象存在一些常见的操作方法:
String getMessage() 作用:获取异常信息,应用:System.out.print(e.getMessage()),输出:/zero;
String toString() 作用:打印异常对象的字符串表示形式 ,应用:System.out.print(e.toString)或System.out.print(e),输 出:java.lang.ArithmeticException: /zero(比getMessage()更全面,异常名字:异常信息);
printStackTrace() 作用:打印堆栈中的跟踪信息,应用:因其无返回值,所以不要放在输出语句中输 出System.out.print(e.printStackTrace())