第十二章 迷迷糊糊的异常(一)
一、异常基本概念简介
1、“异常”的理解
异常和语法错误是不一样的,语法错误程序会马上又小红点,但是异常是可能会发生的不一定发生的“不好的事情”。
2、Java的异常机制
Java异常使用终止模型,即假设“不好的事情”非常非常“关键,一旦发生“不好的事情”,就不可以在回到异常抛出点继续执行。
Java异常:就是把“不好的事情”相关的信息进行报告。
java异常处理程序将程序从不好的状态中恢复,前提是这个“不好的状态可以恢复”。
3、异常的分类
从继承关系上分:
Throwable类有两子类:Error类 ,以及Exception类
Exception类的子类分为:RuntimeException类,和非RuntimeException类
Error类:用于JVM报告系统错误,和程序代码无关。例如,OutOfMemoryError(内存溢出)。此类一般不需要编码人员关心。
Exception类: ①RuntimeException类:很难预料、一个地方发生RuntimeException,往往会在另外一个地方发生错误。 RuntimeException所代表的就是编程错误,逻辑错误。由于编程错误,所以不应该对其捕获。
例如,NullPointerException(空指针),ArrayIndexOutOfBoundsException(数组下标越界)
②非RuntimeException类:需要捕获进行异常处理从不好的状态中恢复。例如,IOException,FileNotFoundException。
从编译器是否强制检查分:
被检查异常:包括所有非RuntimeException类,这些异常受编译器强制检查。即一旦抛出,要么try-catch捕获处理,要么throws进行声明
不被检查异常:包括RuntimeException类和Error类,其中Error类无需关心,RuntimeException类捕不捕获、声不声明编译器都不关心,也不应该对其捕获,以使得RuntimeException被吞,而发生难以察觉的错误,它是必须被改正的编程错误。
二、异常基本语法
try:用于监听异常
catch:捕获异常
finally:在离开try-catch-finally这一级之前总会被执行
throw:抛出异常
Throws:方法开始出声明异常
实例一:了解try-catch基本用法
public class Demo2 { public static void main(String[] args) { // TODO Auto-generated method stub try { throw new Exception("My Exception"); }catch(Exception e) { System.out.println("Caught Exception"); System.out.println("getMessage():" + e.getMessage()); System.out.println("getLocalizedMessage():" + e.getLocalizedMessage()); System.out.println("toString():" + e); System.out.println("printStackTrace():"); e.printStackTrace(); } } }
输出:
结果说明:这里都是一些返回打印异常消息的方法,可以看出前者是后者的子集。
实例二:在任何情况下都会得到执行的finally子句
情况一:涉及break与continue
public class Demo3 { public static void main(String[] args) { // TODO Auto-generated method stub int i = 0; while(true) { try { i++; if(i == 2) { throw new Exception("My Exception"); } }catch(Exception e) { e.printStackTrace(); break; }finally { System.out.println("finally executed"); } } } }
输出结果:
结果说明:finally一定会在离开try-catch-finally块之前被执行。
情况二:return中使用finally
public class Demo4 { public static void main(String[] args) { // TODO Auto-generated method stub try { return; }finally { System.out.println("clearup"); } } }
输出结果:
clearup
结果说明:finally会保证重要的清理工作一定执行
实例三:throws的基本用法
声明为throws + 非RuntimeException的方法,编译将强制要求在该方法的调处(调用此方法的方法中),要么捕获异常,要么throws声明。
public class Demo5 { public static void main(String[] args) { // TODO Auto-generated method stub try { test(); }catch(Exception e) { e.printStackTrace(); } } static void test() throws Exception{ throw new Exception("Myexception") {}; } }
输出结果: