Java异常学习笔记
2015-03-30 20:48
281 查看
一、Java异常处理顺序与匹配原则
程序的大致执行顺序如下:
第一步:程序进入try块以后先从控制台获得一个字符串,这个过程可能会产生IOException,然后又抛出了FirstException,因而整个try块有可能抛出两种异常,但只能抛出一个异常。
第二步:抛出异常后,程序立马转到相应的异常处理块,所以"contiune running 1"永远不会执行,因而没法通过编译;即使程序产生的是IOException,其进入相应catch块后,也不会再返回到try块中去执行“throw new FirstException”。
第三步:程序进入第二个try块,抛出了SecondException异常,然后进入异常处理块。这里我们可以看出,异常处理并不要求同处理程序中所声明的异常完全匹配,派生类的对象也可以匹配其基类的的处理程序。由于SecondException就继承至Exception,所以其永远无法得到匹配,因而不能通过编译。
第四步:不管try块中有没有抛出异常,都一定去执行finally中的语句,所以"continue running2"得到执行;最后程序打印“continue running 3”;
二、如何屏蔽被检查异常
Java的异常处理机制虽然能提高程序的健壮性,但也有其弊端,它要求编程者在可能没有做好怎么处理异常的准备(或者根本不想处理)的时候被迫加上catch,这样可能会影响程序员的开发效率,因而我们可以采用一下方式来避免被检查异常:
方式一:将异常传递给控制台
通过在给main()函数加上异常声明Exception(所有被检查异常的基类),我们就不用在main里面写try-catch()语句,异常都会被传递到控制台
方式二:异常封装
对于不知道该如何处理的异常e,我们可以将它封装到RuntimeException中,e就是RuntimeException(cause)构造函数的cause,即e是造成RuntimeException的原因。
三、通过嵌套try块来释放系统资源
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; class FirstException extends Exception { public FirstException(String s){}; } class SecondException extends Exception { public SecondException(String s){}; } public class MultiException { public static void main(String[] args) { //一个try块中可能同时抛出多个类型的异常,可以在后面分别用catch语句捕获处理 try { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.println("please input a String"); String a = reader.readLine(); throw new FirstException("one"); //System.out.println("continue running 1"); 抛出异常后不会再返回到try块里面去执行throw后面的语句 } catch (FirstException e) { e.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } try { throw new SecondException("two"); //throw new FirstException("one"); 不可达语句,意味着永远也执行不了 } catch (Exception e) { e.printStackTrace(); } /**catch (SecondException e1) { //同样不可达,因为SecondException就是一个Exception,异常会始终会被上一个语句捕获 e1.printStackTrace(); }**/ finally { System.out.println("continue running 2"); } System.out.println("continue running 3"); } }
程序的大致执行顺序如下:
第一步:程序进入try块以后先从控制台获得一个字符串,这个过程可能会产生IOException,然后又抛出了FirstException,因而整个try块有可能抛出两种异常,但只能抛出一个异常。
第二步:抛出异常后,程序立马转到相应的异常处理块,所以"contiune running 1"永远不会执行,因而没法通过编译;即使程序产生的是IOException,其进入相应catch块后,也不会再返回到try块中去执行“throw new FirstException”。
第三步:程序进入第二个try块,抛出了SecondException异常,然后进入异常处理块。这里我们可以看出,异常处理并不要求同处理程序中所声明的异常完全匹配,派生类的对象也可以匹配其基类的的处理程序。由于SecondException就继承至Exception,所以其永远无法得到匹配,因而不能通过编译。
第四步:不管try块中有没有抛出异常,都一定去执行finally中的语句,所以"continue running2"得到执行;最后程序打印“continue running 3”;
二、如何屏蔽被检查异常
Java的异常处理机制虽然能提高程序的健壮性,但也有其弊端,它要求编程者在可能没有做好怎么处理异常的准备(或者根本不想处理)的时候被迫加上catch,这样可能会影响程序员的开发效率,因而我们可以采用一下方式来避免被检查异常:
方式一:将异常传递给控制台
通过在给main()函数加上异常声明Exception(所有被检查异常的基类),我们就不用在main里面写try-catch()语句,异常都会被传递到控制台
方式二:异常封装
try { ...... } catch (UnknowException e) { throw new RuntimeException(e); }
对于不知道该如何处理的异常e,我们可以将它封装到RuntimeException中,e就是RuntimeException(cause)构造函数的cause,即e是造成RuntimeException的原因。
三、通过嵌套try块来释放系统资源
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; public class ResourseRelease { public static void main(String[] args) { try { BufferedReader in = new BufferedReader(new FileReader("input.txt")); try { String s; int i=0; while ((s = in.readLine())!= null) { i++; System.out.println(s); } } catch (Exception e) { e.printStackTrace(System.out); } finally { in.close(); } } catch(Exception e) { System.out.println("open file failed"); } } }
相关文章推荐
- java学习笔记(七)----异常
- Java 学习笔记 (4) -异常 Exception
- JAVA异常学习笔记
- java学习笔记---第11章异常与调试
- 学习笔记_java.lang.reflect.Field_解决IllegalAccessException异常的方法
- java 异常和回调学习笔记-黑马
- Java异常处理学习笔记
- Java学习笔记(异常)
- 【Java学习笔记】自定义Java异常
- java学习笔记7 - Spring mvc 统一异常处理和静态文件的配置
- Java学习笔记005——异常、断言
- 云计算学习笔记---异常处理---hadoop问题处理ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.lang.NullPoin
- Java学习笔记之异常的定义和处理
- Java语言异常处理学习笔记
- Java学习笔记---其他类特性与异常处理
- java学习笔记---异常
- JAVA学习笔记(八)异常
- 学习java异常处理笔记
- java学习笔记16--异常
- java学习笔记16--异常