更新时间:2022-09-16 来源:黑马程序员 浏览量:
编译时异常,是在编译成class文件时必须要处理的异常,也称之为受检异常,运行时异常,在编译成class文件不需要处理,在运行字节码文件时可能出现的异常。简单来说:编译时异常就是在编译的时候出现的异常,运行时异常就是在运行时出现的异常。
学习异常的目的就是避免异常的出现,同时处理可能出现的异常,让代码更稳健。
数组索引越界异常: ArrayIndexOutOfBoundsException
空指针异常 : NullPointerException,直接输出没有问题,但是调用空指针的变量的功能就会报错。
数学操作异常:ArithmeticException
类型转换异常:ClassCastException
数字转换异常: NumberFormatException
运行时异常:一般是程序员业务没有考虑好或者是编程逻辑不严谨引起的程序错误,自己的水平有问题!
继承自RuntimeException的异常或者其子类,编译阶段不报错,运行可能报错。
编译时异常不是RuntimeException或者其子类的异常,编译阶就报错,必须处理,否则代码不通过。
编译时异常示例
String date = "2015-01-12 10:23:21"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy=MM=dd HH:mm:ss"); Date d = sdf parce(date); System. out. println (d);
编译时异常的目的是提醒程序员的不要出错,在编译阶段发出的预警,编译时异常继承自Exception的异常或者其子类。出现编译报错,必须处理,否则代码不通过。但编译时异常通常很少,可遇不可求。
异常的默认处理流程:
①默认会在出现异常的代码那里自动的创建一个异常对象:ArithmeticException。
②异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机。
③虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据。
④直接从当前执行的异常点干掉当前程序。
⑤后续代码没有机会执行了,因为程序已经死亡。
(public class ExceptionDemo { public static void main(String[] args) { System.out.printLn("程序开始。。。。。。。。。。"); chu( a: 10, b: 0); System.out.println("程序结求。。。。。。。。。。"); } public static void chu(int a , int b){ System.out.println(a); System.out.println(b); int c = a / b;//出现了运行异常,自动创建异常对象:ArithmeticException System.out.println("结果是:"+c); } }
编译时异常是编译阶段就出错的,所以必须处理,否则代码根本无法通过.
编译时异常的处理形式有三种:出现异常直接抛出去给调用者,调用者也继续抛出去。 出现异常自己捕获处理,不麻烦别人。前两者结合,出现异常直接抛出去给调用者,调用者捕获处理。
throws:用在方法上,可以将方法内部出现的异常抛出去给本方法的调用者处理。
这种方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡。
抛出异常格式:
方法 throws 异常1 ,异常2 ,异常3 ..{ }
规范做法:
方法 throws Exception{ }
监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。这种方式还可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行。
try{ // 可能出现异常的代码! }catch (Exception e){ e.printStackTrace(); // 直接打印异常栈信息 } Exception可以捕获处理一切异常类型!
方法直接将异通过throws抛出去给调用者,调用者收到异常后直接捕获处理。
在开发中按照规范来说第三种方式是最好的:底层的异常抛出去给最外层,最外层集中捕获处理。实际应用中,只要代码能够编译通过,并且功能能完成,那么每一种异常处理方式似乎也都是可以的。
运行时异常的处理形式
运行时异常编译阶段不会出错,是运行时才可能出错的,所以编译阶段不处理也可以。
按照规范建议还是处理:建议在最外层调用处集中捕获处理即可。