java7語法新特性
阿新 • • 發佈:2019-01-22
1. switch中增加對String型別的支援。
public void getType(String type){ switch(type){ case "1": System.out.println("type1"); break; case "2": System.out.println("type2"); break; case "3": System.out.println("type3"); break; default: System.out.println("type error"); } }
編譯器的編譯的時候先做處理:
1) case只有一種情況,直接轉成if;
2) 如果只有一個case和default,則直接轉換為if...else;
3) 有多個case,先將String轉換為hashCode,然後對應的進行處理,JavaCode在底層相容Java7以前版本。
2. 數字字面量的改進
① 增加二進位制表示
Java7前支援十進位制(123)、八進位制(0123)、十六進位制(0X12AB)
Java7增加二進位制表示(0B11110001、0b11110001)
② 數字中可新增分隔符
Java7中支援在數字量中間增加'_'作為分隔符,更直觀,如(12_123_456),下劃線只能在數字中間,編譯時編譯器自動刪除數字中的下劃線。
3. 異常處理
① Throwable類增加addSuppressed方法和getSuppressed方法,支援原始異常中加入被抑制的異常。
異常抑制:在try和finally中同時丟擲異常時,finally中丟擲的異常會在異常棧中向上傳遞,而try中產生的原始異常會消失。
在Java7之前的版本,可以將原始異常儲存,在finally中產生異常時丟擲原始異常:
public void read(String filename) throws BaseException { FileInputStream input = null; IOException readException = null; try { input = new FileInputStream(filename); } catch (IOException ex) { readException = ex; //儲存原始異常 } finally { if (input != null) { try { input.close(); } catch (IOException ex) { if (readException == null) { readException = ex; } } } if (readException != null) { throw new BaseException(readException); } } }
在Java7中的版本,可以使用addSuppressed方法記錄被抑制的異常:
public void read(String filename) throws IOException {
FileInputStream input = null;
IOException readException = null;
try {
input = new FileInputStream(filename);
} catch (IOException ex) {
readException = ex;
} finally {
if (input != null) {
try {
input.close();
} catch (IOException ex) {
if (readException != null) { //此處的區別
readException.addSuppressed(ex);
}
else {
readException = ex;
}
}
}
if (readException != null) {
throw readException;
}
}
}
②catch子句可以同時捕獲多個異常
public void testSequence() {
try {
Integer.parseInt("Hello");
}
catch (NumberFormatException | RuntimeException e) { //使用'|'分割,多個型別,一個物件e
}
}
③ try-with-resources語句
Java7之前需要在finally中關閉socket、檔案、資料庫連線等資源;
Java7中在try語句中申請資源,實現資源的自動釋放(資源類必須實現java.lang.AutoCloseable介面,一般的檔案、資料庫連線等均已實現該介面,close方法將被自動呼叫)。
public void read(String filename) throws IOException {
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
StringBuilder builder = new StringBuilder();
String line = null;
while((line=reader.readLine())!=null){
builder.append(line);
builder.append(String.format("%n"));
}
return builder.toString();
}
}
try子句中可以管理多個資源:
public void copyFile(String fromPath, String toPath) throws IOException {
try ( InputStream input = new FileInputStream(fromPath);
OutputStream output = new FileOutputStream(toPath) ) {
byte[] buffer = new byte[8192];
int len = -1;
while( (len=input.read(buffer))!=-1 ) {
output.write(buffer, 0, len);
}
}
}
4. 變長引數方法的優化
Java7之前版本中的變長引數方法:
public int sum(int... args) {
int result = 0;
for (int value : args) {
result += value;
}
return result;
}
當引數為不可具體化的型別時,如List,編譯器將產生警告,需要使用@SuppressWarnings("unchecked")註解宣告;Java7中使用@SafeVarargs註解抑制編譯器警告。
@SafeVarargs
public static <T> T useVarargs(T... args) {
return args.length > 0 ? args[0] : null;
}
VarargsWarning.useVarargs(new ArrayList<String>());