try-with-resources和multi-catch的使用
1.首先说一下以前开发中我们在处理异常时,我们会使用try-catch-finally来处理异常。
//使用try-catch-finally
public static void main(String[] args) { File file = null; FileReader fr = null; try { file = new File("D://abc.txt"); fr = new FileReader(file); }catch(FileNotFoundException e){ e.printStackTrace(); }finally { try { fr.close(); } catch (IOException e) { e.printStackTrace(); } } }
通过上图的代码我们可以看到,这种处理方式使得代码过于繁琐,如果需要关闭的资源少一点还好,要是关闭超过三个,代码就会比较繁琐。
2.为了解决和优化这种问题,jdk7以后出了新的处理方式,下面我们一一介绍。
(1)使用try-with-resources 处理异常
public static void main(String[] args) { try(FileReader fr = new FileReader("D://abc.txt"); BufferedReader br = new BufferedReader(fr);){ //对文件的操作 } catch(FileNotFoundException e){ e.printStackTrace(); } catch (IOException e){ e.printStackTrace(); } }
这个try-with-resources的用法格式为:
try( 这里面的资源会自动关闭,前提是这些资源必须实现了Closeable接口或者AutoCloseable接口){ //这里面是你的其他代码 } catch(捕获的异常){ //打印异常信息 }
(2)在使用try-with-resources处理异常时,我们发现里面有两个catch捕捉异常,当需要捕获异常比较多的时候,代码也会变得繁琐,
所以我们使用multi-catch来解决和优化这种问题。
public static void main(String[] args) { try(FileReader fr = new FileReader("D://abc.txt"); BufferedReader br = new BufferedReader(fr);) { //这里只是为了演示 if (new Random().nextInt(10) == 0){ throw new ClassNotFoundException(); } } catch(IOException | ClassNotFoundException e){ //需要注意的是,这个catch里面的异常类不能存在子父类关系。如果存在子父类关系,只需捕获父类就可以了。 e.printStackTrace(); } }