Java中如何释放资源呢?
下文笔者讲述java中释放资源的两种方式分享,如下所示
try-catch-finally的缺点:
java释放资源的方法: 1.try catch finally中 将释放代码写在finally中 2.try (申明对象) catch 申请对象的代码,会最终得到释放例
1.try-catch-finally
package example; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; //使用 try-catch-finally 释放资源的模板 public class Example01 { public static void main(String[] args) { //声明在外面,如果在try里面声明,finally中访问不到is InputStream is = null; try { is = new FileInputStream("D:\\test123.txt"); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { try { // 在这里判断是否为空,是因为可能在 FileInputStream 实例化之前 就发生了异常 if (is != null) is.close(); } catch (IOException e) { e.printStackTrace(); } } } }
finally运行时刻分析
package example; public class Example02 { public static void main(String[] args) { try { System.out.println(10/0); } catch (Exception e) { System.out.println("catch 执行了"); } finally { System.out.println("finally 执行了"); } } } ----运行以上代码,将输出以下信息----- catch 执行了 finally 执行了
注意事项: 发生异常时 先运行catch 再运行finally
当try或catch中return,finally还会运行吗?
package example; public class Example03 { public static void main(String[] args) { System.out.println(chu(10, 0)); } public static int chu(int a, int b) { try { System.out.println("try 执行了"); return a / b; } catch (Exception e) { System.out.println("catch 执行了"); return -1; } finally { System.out.println("finally 执行了"); return Integer.MAX_VALUE; } } } ----运行以上代码,将输出以下信息---- try 执行了 finally 执行了 2147483647
try或cantch中使用了return finally也会运行例2
package example; public class Example04 { public static void main(String[] args) { System.out.println(chu(10, 0)); } public static int chu(int a, int b) { try { System.out.println("try 执行了"); return a / b; } catch (Exception e) { System.out.println("catch 执行了"); return -1; } finally { System.out.println("finally 执行了"); } } } ----运行以上代码,将输出以下信息---- try 执行了 catch 执行了 finally 执行了 -1
注意事项: 当finally中没有return 那么在执行完finally后 仍然会执行原来代码块中的return
try-catch-finally的缺点:
代码量大,改进方法
try-with-resources(jdk7提供)
优化try catch finally代码量大的缺点 try(定义资源1;定义资源2;...){ 可能出现异常的代码; }catch(){ 异常的处理代码; } 当资源试使用结束后,会自动调用close方法
package example; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; //使用 try-with-resources 释放资源的模板 public class Example01 { public static void main(String[] args) { try (InputStream is = new FileInputStream("D:\\test123.txt")) { //具体操作 } catch (IOException e) { e.printStackTrace(); } } }
注意事项: try后面的小括号里只能声明资源文件 所有资源都实现了AutoCloseable接口 并且都用close方法 模拟一个资源
package example; public class Resource01 implements AutoCloseable{ @Override public void close() throws Exception { System.out.println("释放了 Resource01 的资源"); } }
package example; //使用 try-with-resources 释放资源的模板 public class Example01 { public static void main(String[] args) { try (Resource01 resource01 = new Resource01()) { //具体操作 } catch (Exception e) { e.printStackTrace(); } } } ----运行以上代码,将输出以下信息------- 释放了 Resource01 的资源 结论: 自动调用了close()方法关闭资源
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。