程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> [Java開發之路](20)try-with-resource 異常聲明

[Java開發之路](20)try-with-resource 異常聲明

編輯:JAVA綜合教程

[Java開發之路](20)try-with-resource 異常聲明


Try-with-resources是java7中一個新的異常處理機制,它能夠很容易地關閉在try-catch語句塊中使用的資源。

在java7以前,程序中使用的資源需要被明確地關閉,過程有點繁瑣,如下所示:


  1. package com.qunar.lectures.tryResource;
  2.  
  3. import java.io.*;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6.  
  7. /**
  8. * Created by xiaosi on 16-3-4.
  9. */
  10. public class TryResourceDemo {
  11. // 獲取資源數據
  12. public static List readLines(String resourcePath) {
  13. String path = TryResourceDemo.class.getResource(resourcePath).getPath();
  14. File file = new File(path);
  15.  
  16. if (!file.exists()) {
  17. throw new RuntimeException("Can not find file + " + resourcePath);
  18. }//if
  19.  
  20. if (!file.isFile()) {
  21. throw new RuntimeException(resourcePath + " is not a regular file");
  22. }//if
  23.  
  24. FileInputStream fis;
  25. InputStreamReader isr;
  26. BufferedReader br = null;
  27. try {
  28. fis = new FileInputStream(file);
  29. isr = new InputStreamReader(fis, "UTF-8");
  30. br = new BufferedReader(isr);
  31. List lines = new ArrayList();
  32. String line;
  33. while ((line = br.readLine()) != null) {
  34. lines.add(line);
  35. }//while
  36. return lines;
  37. }
  38. catch (IOException e) {
  39. throw new RuntimeException("Read file failed , file=" + resourcePath, e);
  40. }
  41. finally {
  42. if(br != null){
  43. try {
  44. br.close();
  45. } catch (IOException e) {
  46. e.printStackTrace();
  47. }
  48. }//if
  49. }//finally
  50. }
  51. public static void main(String[] args) {
  52. List lines = readLines("/a.txt");
  53. for(String line : lines){
  54. System.out.println("line:" + line);
  55. }//for
  56. }
  57. }

假設try語句塊拋出一個異常,然後finally語句塊被執行。同樣假設finally語句塊也拋出了一個異常。那麼哪個異常會根據調用棧往外傳播?即使try語句塊中拋出的異常與異常傳播更相關,最終還是finally語句塊中拋出的異常會根據調用棧向外傳播。


  1. private static void printFileJava7() throws IOException {
  2. try(FileInputStream input = new FileInputStream("file.txt")) {
  3. int data = input.read();
  4. while(data != -1){
  5. System.out.print((char) data);
  6. data = input.read();
  7. }
  8. }
  9. }

我們看到第一行:


  1. try(FileInputStream input = new FileInputStream("file.txt")) {

這就是try-with-resource 結構的用法。FileInputStream 類型變量就在try關鍵字後面的括號中聲明並賦值。在這聲明的變量我們可以在下面的代碼中直接使用,即同一個作用域中。當try語句塊運行結束時,FileInputStream會被自動關閉。這是因為FileInputStream 實現了java中的java.lang.AutoCloseable接口。所有實現了這個接口的類都可以在try-with-resources結構中使用。

當try-with-resources結構中拋出一個異常,同時FileInputStreami被關閉時(調用了其close方法)也拋出一個異常,try-with-resources結構中拋出的異常會向外傳播,而FileInputStreami被關閉時拋出的異常被抑制了。這與文章開始處利用舊風格代碼的例子(在finally語句塊中關閉資源)相反。

在JDK7中只要實現了AutoCloseable或Closeable接口的類或接口,都可以使用try-with-resource來實現異常處理和資源關閉。

你可以在塊中使用多個資源而且這些資源都能被自動地關閉:


  1. package com.qunar.lectures.tryResource;
  2.  
  3. import java.io.*;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6.  
  7. /**
  8. * Created by xiaosi on 16-3-4.
  9. */
  10. public class TryResourceDemo {
  11. // 獲取資源數據
  12. public static List readLines(String resourcePath) {
  13. String path = TryResourceDemo.class.getResource(resourcePath).getPath();
  14. File file = new File(path);
  15.  
  16. if (!file.exists()) {
  17. throw new RuntimeException("Can not find file + " + resourcePath);
  18. }//if
  19.  
  20. if (!file.isFile()) {
  21. throw new RuntimeException(resourcePath + " is not a regular file");
  22. }//if
  23. // try-with-resource方式 自動釋放資源
  24. try (FileInputStream fis = new FileInputStream(file);
  25. InputStreamReader isr = new InputStreamReader(fis);
  26. BufferedReader br = new BufferedReader(isr)){
  27. List lines = new ArrayList();
  28. String line;
  29. while ((line = br.readLine()) != null) {
  30. lines.add(line);
  31. }//while
  32. return lines;
  33. }
  34. catch (IOException e) {
  35. throw new RuntimeException("Read file failed , file=" + resourcePath, e);
  36. }
  37. }
  38. public static void main(String[] args) {
  39. List lines = readLines("/a.txt");
  40. for(String line : lines){
  41. System.out.println("line:" + line);
  42. }//for
  43. }
  44. }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved