Java1.7新特性
2016-09-27 11:02
453 查看
Java1.7新特性
1. switch语句支持字符串变量
public static void test(String str) { switch (str) { case "abc": System.out.println("abc"); break; case "def": System.out.println("def"); break; case "ghi": System.out.println("ghi"); break; default: System.out.println("default"); } }
2. 泛型实例化类型自动推断
以下两个语句等价:ArrayList<String> al1 = new ArrayList<String>(); // Old ArrayList<String> al2 = new ArrayList<>(); // New
3. 新的整数字面表达方式 - “0b”前缀和”_”连数符
表示二进制字面值的前缀0b:比如以下三个变量的值相同:
byte b1 = 0b00100001; // New byte b2 = 0x21; // Old byte b3 = 33; // Old
字面常量数字的下划线。用下划线连接整数提升其可读性,自身无含义,不可用在数字的起始和末尾:
Java编码语言对给数值型的字面值加下划线有严格的规定。如上所述,你只能在数字之间用下划线。你不能用把一个数字用下划线开头,或者已下划线结尾。这里有一些其它的不能在数值型字面值上用下划线的地方:
在数字的开始或结尾
对浮点型数字的小数点附件
F或L下标的前面
该数值型字面值是字符串类型的时候
float pi1 = 3_.1415F; // 无效的; 不能在小数点之前有下划线 float pi2 = 3._1415F; // 无效的; 不能在小数点之后有下划线 long socialSecurityNumber1 = 999_99_9999_L; //无效的,不能在L下标之前加下划线 int a1 = _52; // 这是一个下划线开头的标识符,不是个数字 int a2 = 5_2; // 有效 int a3 = 52_; // 无效的,不能以下划线结尾 int a4 = 5_______2; // 有效的 int a5 = 0_x52; // 无效,不能在0x之间有下划线 int a6 = 0x_52; // 无效的,不能在数字开头有下划线 int a7 = 0x5_2; // 有效的 (16进制数字) int a8 = 0x52_; // 无效的,不能以下划线结尾 int a9 = 0_52; // 有效的(8进制数) int a10 = 05_2; // 有效的(8进制数) int a11 = 052_; // 无效的,不能以下划线结尾
4. 在单个catch代码块中捕获多个异常,以及用升级版的类型检查重新抛出异常
在Java 7中,catch代码块得到了升级,用以在单个catch块中处理多个异常。如果你要捕获多个异常并且它们包含相似的代码,使用这一特性将会减少代码重复度。下面用一个例子来理解。Java 7之前的版本:
catch (IOException ex) { logger.error(ex); throw new MyException(ex.getMessage()); catch (SQLException ex) { logger.error(ex); throw new MyException(ex.getMessage()); }catch (Exception ex) { logger.error(ex); throw new MyException(ex.getMessage()); }
在Java 7中,我们可以用一个catch块捕获所有这些异常:
catch(IOException | SQLException | Exception ex){ logger.error(ex); throw new MyException(ex.getMessage()); }
如果用一个catch块处理多个异常,可以用管道符(|)将它们分开,在这种情况下异常参数变量(ex)是定义为final的,所以不能被修改。这一特性将生成更少的字节码并减少代码冗余。另一个升级是编译器对重新抛出异常(rethrown exceptions)的处理。这一特性允许在一个方法声明的throws从句中指定更多特定的异常类型。
让我们来看看一个小例子:
public class Java7MultipleExceptions { public static void main(String[] args) { try{ rethrow("abc"); }catch(FirstException | SecondException | ThirdException e){ //以下赋值将会在编译期抛出异常,因为e是final型的 //e = new Excepti 4000 on(); System.out.println(e.getMessage()); } } static void rethrow(String s) throws FirstException, SecondException, ThirdException { try { if (s.equals("First")) throw new FirstException("First"); else if (s.equals("Second")) throw new SecondException("Second"); else throw new ThirdException("Third"); } catch (Exception e) { //下面的赋值没有启用重新抛出异常的类型检查功能,这是Java 7的新特性 // e=new ThirdException(); throw e; } } static class FirstException extends Exception { public FirstException(String msg) { super(msg); } } static class SecondException extends Exception { public SecondException(String msg) { super(msg); } } static class ThirdException extends Exception { public ThirdException(String msg) { super(msg); } } }
如你所见在rethrow方法中,catch块捕获的异常并没有出现在throws从句中。Java 7编译器会分析完整的try代码块以检查从catch块中什么类型的异常被抛出和重新抛出。
需要注意一旦改变了catch块的参数,编译器的分析将不会被启用。
相关文章推荐
- Java 1.7的新特性
- Java 1.7的新特性
- java 1.7新特性
- java1.7新特性复习
- [笔记][Java7并发编程实战手册]5.Fork\Join(Java1.7新特性)框架
- Java 1.7的新特性
- Java JDK1.5、1.6、1.7新特性整理(转)
- (转载)Java 1.7的新特性
- Java JDK1.5、1.6、1.7新特性整理
- Java-1.7新特性之文件路径
- JAVA1.7的新特性
- java1.7的新特性
- java1.7 里的新特性有什么?
- [Java] 总结1.5/1.6/1.7版本的特性
- 【Java】JDK1.7的新特性。
- java1.7新特性
- Java 1.7的新特性
- java 1.7 1.5的新特性总结
- java jdk1.7-1.8新特性
- Java1.7/1.8新特性