我想从这篇文章开始,总结一下我学习的JAVA7的一些特性。java7也是比较重要的一个java版本,新的语言特性,新的java语法,JVM新特性的增加等,都是我们值得这些java老人回头重新学习的知识点。
这是一个每一个java程序员都会用的try catch 处理异常,后面几个是java7为我们带来的新的变化
try { FileInputStream input = new FileInputStream(""); } catch (FileNotFoundException e1) { //捕获并处理异常 e1.printStackTrace(); }finally{ }
在java7之前,我们在catch代码块中的重抛
try { FileInputStream input = new FileInputStream("file.txt"); int data = input.read(); while (data != -1) { System.out.print((char) data); data = input.read(); } input.close(); } catch (Exception e) { e.printStackTrace(); throw e;//我们可以重抛异常,但是我们捕获的是Exception ,所以新抛出的异常为Exception类型 }
java7中的异常重抛
try { FileInputStream input = new FileInputStream("file.txt"); int data = input.read(); while (data != -1) { System.out.print((char) data); data = input.read(); } input.close(); } catch (final Exception e) { e.printStackTrace(); throw e;//可以捕获到异常的原理类型, 是FileNotFound?还是IOException }
// try with resource try (FileInputStream input = new FileInputStream("file.txt")) { int data = input.read(); while (data != -1) { System.out.print((char) data); data = input.read(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }java在处理外部资源的时候,IO流一直都是需要我们手动关闭的。
但是程序不可能总是按我们预想的运行,你在读取文件的时候,文件消失了,等各种异常情况总会发生。
下面是我们以前的关闭流的代码:try { FileInputStream input = new FileInputStream("file.txt"); int data = input.read(); while (data != -1) { System.out.print((char) data); data = input.read(); } input.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
Java以前的资源关闭的代码是有很多漏洞的, 即使你将流的关闭操作放到finally里,也不能保证一定关闭。
但是java7的新机制,当代码离开代码块的时候,资源是会自动关闭的
当一个异常被抛出的时候,可能有其他异常因为该异常而被抑制住,从而无法正常抛出。这时可以通过addSuppressed方法把这些被抑制的方法记录下来。被抑制的异常会出现在抛出的异常的堆栈信息中,也可以通过getSuppressed方法来获取这些异常。这样做的好处是不会丢失任何异常,方便开发人员进行调试
public class ReadFile { public void read(String filename) throws IOException { FileInputStream input = null; IOException readException = null; try { input = new FileInputStream(filename); } catch (IOException ex) { readException = ex; } finally { if (input != null) { try { input.close(); } catch (IOException ex) { if (readException != null) { readException.addSuppressed(ex); } else { readException = ex; } } } if (readException != null) { throw readException; } } } }