不等不承认,距离Java SE 9 的发布只有2个月不到的时间了。但本人很low,直到最近才开始在实践中使用Java SE 7 给程序员们带来的一些新特性。更别说Java SE 8的lambda表达式, Stream API等高级特性了。所以,在本人未来的几篇博客里,会陆续介绍从Java SE 7 开始的一些新特性。写这些内容其实也是为了巩固自己所学,因为作者本人也是一个learner,不是什么大牛。好了,废话到此为止,接下来作者将介绍几个很实用的java 7特性,文中若有用词不当或专业术语不准的现象,望见谅!
几个实用的Java 7特性:
1. 异常处理的改进:
在Java SE7里,一个catch可以捕获多个异常,这样可以减少重复代码。每个异常之间用 | 隔开。比如下面的这种形式:
try {
//具体的处理代码
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
//捕获异常的处理方式
}
然而在Java SE 7之前,对应异常的捕获你必须采用如下形式:
try {
//具体的处理代码
}catch (InstantiationException ) {
//捕获异常的处理方式
}
catch (IllegalAccessException ) {
//捕获异常的处理方式
}
catch (ClassNotFoundException ) {
//捕获异常的处理方式
}
注意,如果一个catch处理了多个异常,那么这个catch的参数默认就是final的,你不能在catch块里修改它的值。
另外,用一个catch处理多个异常,比用多个catch每个处理一个异常生成的字节码要更小更高效。
2. try-with-resources语句:
注意:try-with-resources作者的理解就是在try语句块中书写打开资源的代码。Java 7之前需要在finally中关闭socket、文件、数据库连接等资源;Java 7中在try语句中申请资源,可以实现资源的自动释放(资源类必须实现java.lang.AutoCloseable接口,一般的文件、数据库连接等均已实现该接口,close方法将被自动调用)。 比如下面的代码:
try ( Scanner in = new Scanner(Paths.get("/user/share/dict/words"));
PrintWriter out = new PrintWriter("/tmp/out.txt")
) {
while (in.hasNext())
out.println(in.next().toLowerCase());
}
采用上述方式,不管代码块如何退出只要in和out对象之前已经被创建出来,他们都会被关闭。省去了主动关闭资源的繁琐代码。
3.NIO2,这个特性主要是指代对路径Path的使用。使用它只需要一行代码既可实现读取一个文件的全部内容:比如:
byte[] bytes = Files.readAllBytes(path);
倘若希望将文件内容读取为一个字符串,可以在readAllBytes后调用:
String content = new String(bytes, StandardCharses.UTF_8);
4.将字符串转为数字的的方法中,字符串可以带"+","-"号等:
比如: double x = Double.parseDouble("+1.0");是一句正确的代码,不会抛出异常。
5.对Null的检查:
Objects类提供了requireNonNull方法以便以检查参数是否为null,比如下面的例子:
public void process(String content) {
this.content = Objects.requireNonNull(content);
}
上述代码中,如果content为null,则会抛出一个空指针异常,这个貌似没多大作用的改进却有利于程序的提示,其实还可以给产生的异常提供一个消息字符串,就像下面这个形式:
public void process(String content) {
this.content = Objects.requireNonNull(content, "the content can not be null");
}