java带资源的try语句

 jdk 1.7之后出现的一个新的语句,主要用于关闭资源。所谓资源,就是一个流,一个连接,一个数据库连接等。

     在原来关闭资源的时候,用 try-catch-finally 时如果try中的代码跑出了一个非 IOException,在执行finally调用close方法时close方法本身也会有可能抛出 IOException 异常。这种情况下,原始的异常将丢失,转而抛出close方法的异常。

     在jkd 1.7之前的处理方法较为繁琐,如下:

    package why;  
      
    import java.io.FileInputStream;  
    import java.io.InputStream;  
      
    public class Advice {  
          
        public static void main(String[] args) {  
            InputStream in = null;  
            Exception ex = null;  
            try{  
                try{  
                    //code…..;  
                } catch (Exception e) {  
                    ex = e;  
                    throw e;  
                }  
            } finally {  
                try {  
                    in.close();  
                } catch (Exception e) {  
                    if(ex == null)   
                        throw e;  
                }  
            }  
        }  
    }  

     在jdk 1.7之后出现了带资源的try语句,它允许在try关键字后紧跟一对圆括号,圆括号可以声明、初始化一个或多个资源(此处的资源是指那些必须在程序结束时显式关闭的资源,比如数据库连接,网络连接等),try-with-resources 是一个定义了一个或多个资源的try 声明,try语句在该语句结束时自动关闭这些资源。try-with-resources确保每一个资源在处理完成后都会被关闭。这些资源必须实现AutoCloseable或者Closeable接口,实现这两个接口就必须实现close() 方法。示例如下:

    package why;  
      
    import java.io.FileInputStream;  
    import java.io.PrintWriter;  
    import java.util.Scanner;  
      
    public class Xin {  
      
        public static void main(String[] args) throws Exception {  
      
            try(Scanner in = new Scanner(new FileInputStream(“d:\\haha.txt”));  
                    PrintWriter out = new PrintWriter(“d:\\hehe.txt”)) {  
                while(in.hasNext()) {  
                    out.println(in.next().toUpperCase());  
                }  
            }  
        }  
    }  

其基本语法是:try(资源){资源动作}比如

public static String processFile() throws IOException {
try (
	BufferedReader br = new BufferedReader(new FileReader("D:data.txt"))
    ) 
    { 
	return br.readLine();
    }
}

      一个try-with-resourcse如果在try中打开多个资源,用分号隔开(某些书里错写成了逗号)。和声明一个对象相同,会在结束后自动调用close方法。 此外,try-with-resources 可以跟catch和finally,catch和finally中的对象是在try-with-resources里声明的对象关闭之后才执行(并不建议这样)。如果try块和close块都抛出一个异常,那么close块的异常将会“被抑制”。这些异常将会自动捕获,并由addSuppressed方法增加到原来的异常。如果对这个异常感兴趣,可以调用getSuppressed方法,将会得到从close方法抛出并被抑制的异常列表。

        jdk1.7之后新增加了几个API:

        1)void addSuppressed(Throwable t)  为这个异常增加一个“抑制”异常。这出现在带资源的try语句块中,其中t是close方法抛出的一个异常。

        2)Throwable[ ] getSuppressed( )   得到这个异常的所有“抑制”异常。一般来说,这些是带资源的try语句中close方法抛出的异常。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,try-catch-finally 语句用于捕获和处理异常。它的基本语法如下: ```java try { // 可能会抛出异常的代码块 } catch (ExceptionType1 e1) { // 处理异常类型1的代码块 } catch (ExceptionType2 e2) { // 处理异常类型2的代码块 } finally { // 无论是否发生异常,都会执行的代码块 } ``` 在 try 块中,你可以放置可能会抛出异常的代码。如果在执行 try 块中的代码时发生了异常,那么就会跳到相应的 catch 块中进行异常处理。catch 块可以有多个,每个 catch 块用于捕获不同类型的异常,并提供相应的处理逻辑。catch 块中的参数 e1、e2 是异常对象,你可以使用它们来获取有关异常的信息。 无论是否发生异常,finally 块中的代码都会被执行。finally 块通常用于释放资源或执行清理操作,确保在任何情况下都会执行。 如果在 try 块中发生了异常,并且没有相应的 catch 块来处理该异常,那么该异常将被传递给上层调用栈,直到找到合适的 catch 块进行处理,或者如果没有找到任何 catch 块,则程序将终止。 以下是一个简单的示例: ```java try { int result = divide(10, 0); System.out.println("结果:" + result); } catch (ArithmeticException e) { System.out.println("除数不能为零!"); } finally { System.out.println("finally 块中的代码"); } public static int divide(int dividend, int divisor) { return dividend / divisor; } ``` 在上面的示例中,divide 方法会抛出一个 ArithmeticException 异常,因为除数为零。在 catch 块中,我们对该异常进行处理,并输出相应的信息。无论是否发生异常,finally 块中的代码都会执行,输出 "finally 块中的代码"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值