您的位置:首页 > 编程语言 > Java开发

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新特性