马太效应 发表于 2017-8-8 21:39:18

Java暑期学习Day34

本帖最后由 马太效应 于 2017-8-8 21:39 编辑

昨天匆匆睡着了QAQ,今天是第34天,明天开始记录学习Collection ~


static/image/hrline/3.gif

①自动尝试关闭资源
在JDK7之后,新增了尝试关闭资源(Try-With-Resources)语法

package exception;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class FileUtil2 {
      public static String readFile(String name)throws FileNotFoundException{
                StringBuilder text=new StringBuilder();
                try(Scanner console=new Scanner(new FileInputStream(name))){
                        while(console.hasNext()){
                                        text.append(console.nextLine())
                                        .append('\n');
                              }

                        }

                return text.toString();
               
      }
}

StringBuilder 构造方法:
StringBuilder()
构造一个没有字符的字符串构建器,初始容量为16个字符。


StringBuilder的主要StringBuilder是append和insert方法,它们是重载的,以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入字符串构建器。 append方法始终在构建器的末尾添加这些字符; insert方法将insert添加到指定点。
例如,如果z引用当前内容为“ start ”的字符串构建器对象,那么方法调用z.append("le")将导致字符串构建器包含“ startle ”,而z.insert(4, "le")会将字符串构建器更改为包含“ starlet ”。

想要尝试自动关闭资源的对象,是撰写在try之后的括号中,如果无需catch处理任何异常,可以不用撰写,也不用撰写finally自行尝试关闭资源。

<div>package exception;</div><div>import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;</div><div>public class FileUtil3 {
public static String readFile(String name) throws FileNotFoundException {
StringBuilder text = new StringBuilder();
Scanner console = new Scanner(new FileInputStream(name));
Throwable localThrowable2 = null;
try {
   while (console.hasNext()) {
    text.append(console.nextLine()).append('\n');
   }
} catch (Throwable localThrowable1) { // 尝试捕捉所有错误
   localThrowable2 = localThrowable1;
   throw localThrowable1;
} finally {
   if (console != null) { // 如果console参考至Scanner实例
    if (localThrowable2 != null) { // 若前面有catch到其他异常
   try {
      console.close(); // 尝试关闭Scanner实例
   } catch (Throwable x2) { // 万一关闭时发生错误
      localThrowable2.addSuppressed(x2); // 在原异常对象中记录
   }
    } else {
   console.close(); // 若前面没有发生任何异常,就直接关闭Scanner
    }
   }</div><div>}</div><div>return text.toString();</div><div> }</div><div>}</div>若一个异常被catch后的处理过程引发另一个异常,通常会抛出第一个异常作为响应。

API之关于addSuppressed:


public final void addSuppressed(Throwable exception)将指定的异常附加到为了传递此异常而被抑制的异常。
该方法是线程安全的,通常由try -with-resources语句调用(自动和隐式)。
抑制行为启用,除非禁用via a constructor 。 当禁用抑制时,该方法除了验证其参数之外什么都不做。
-!-
注意当一个异常causes另外一个异常时,第一个异常通常被捕获,然后第二个异常被抛出来作为响应。 换句话说,这两个例外之间有因果关系。
与此相反,存在两个独立的异常可以在同级代码块在被抛出,在特定情况下try一个的块try -with资源语句和编译器生成的finally块封闭该资源。 在这些情况下,只能传播一个抛出的异常。
在try -with-resources语句,当有两个这样的例外,从始发异常try块被传播,并从异常finally块添加到从异常抑制例外列表try块。 作为一个例外展开堆栈,它可以累积多个抑制异常。
异常可能会抑制异常,同时也是由另一个异常引起的。 异常是否有原因在创建时是语义上已知的,与异常是否会抑制通常仅在抛出异常之后确定的其他异常不同。
请注意,程序员编写的代码还可以利用在存在多个兄弟异常并且只能传播一个异常的情况下调用此方法。

与之对应的getSuppressed
   public final Throwable[] getSuppressed()返回一个包含所有被抑制的异常的数组,通常由try -with-resources语句来传递这个异常。
如果没有例外被抑制或suppression is disabled ,返回一个空数组。这种方法是线程安全的。写入返回的数组不影响将来调用此方法。
结果:一个数组,其中包含所有被抑制以提供此异常的异常。


package exception;

public class AutoCloseableDemo {
        public static void main(String[] args) {

                try (Resource res = new Resource()) {
                        res.doSome();
                } catch (Exception ex) {
                        ex.printStackTrace();
                }

        }

}

class Resource implements AutoCloseable {
        void doSome() {
                System.out.println("做一些事");
        }

        @Override
        public void close() throws Exception {
                System.out.println("资源被关闭");
        }
}
结果是——


做一些事
资源被关闭


JDK7的尝试关闭资源语法可套用的对象,必须操作java.lang.AutoCloseable接口,这是JDK7新增的接口。尝试关闭资源语法也可以同时关闭两个以上的对象资源,只要中间以分号分隔。在try的括号中,越后面撰写的对象资源会越早被关闭。

package exception;

import static java.lang.System.out;

public class AutoCloseableDemo2 {
        public static void main(String[] args) {
                try (ResourceSome some = new ResourceSome();
                                ResourceOther other = new ResourceOther()) {
                        some.doSome();
                        other.doOther();
                } catch (Exception ex) {
                        ex.printStackTrace();
                }

        }

}

class ResourceSome implements AutoCloseable {
        void doSome() {
                out.println("做一些事");
        }

        @Override
        public void close() throws Exception {
                out.println("资源Some被关闭");
        }
}

class ResourceOther implements AutoCloseable {
        void doOther() {
                out.println("做其他事");
        }

        @Override
        public void close() throws Exception {
                out.println("资源Other被关闭");
        }
}结果是——
做一些事
做其他事
资源Other被关闭
资源Some被关闭






马太效应 发表于 2017-8-8 21:41:25

重新copy一遍代码

package exception;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class FileUtil3 {
      public static String readFile(String name) throws FileNotFoundException {
                StringBuilder text = new StringBuilder();
                Scanner console = new Scanner(new FileInputStream(name));
                Throwable localThrowable2 = null;
                try {
                        while (console.hasNext()) {
                              text.append(console.nextLine()).append('\n');
                        }
                } catch (Throwable localThrowable1) { // 尝试捕捉所有错误
                        localThrowable2 = localThrowable1;
                        throw localThrowable1;
                } finally {
                        if (console != null) { // 如果console参考至Scanner实例
                              if (localThrowable2 != null) { // 若前面有catch到其他异常
                                        try {
                                                console.close(); // 尝试关闭Scanner实例
                                        } catch (Throwable x2) { // 万一关闭时发生错误
                                                localThrowable2.addSuppressed(x2); // 在原异常对象中记录
                                        }
                              } else {
                                        console.close(); // 若前面没有发生任何异常,就直接关闭Scanner
                              }
                        }

                }

                return text.toString();

      }

}
页: [1]
查看完整版本: Java暑期学习Day34