java7里新增的內(nèi)容。
1 try-with-resources
比如這樣的情況:
需要從一個文件里讀出所有內(nèi)容。代碼如下:
public static void readAll() throws IOException {
FileReader fileReader = new FileReader("test");
BufferedReader bufferedReader = new BufferedReader(fileReader);
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
fileReader.close();
bufferedReader.close();
}
如果我們不希望在函數(shù)接口中拋出異常珍德,需要自己做try泣矛,catch處理。大概是這樣的:
public static void readAll() {
FileReader fileReader = null;
BufferedReader bufferedReader = null;
try {
fileReader = new FileReader("test");
bufferedReader = new BufferedReader(fileReader);
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
fileReader.close();
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
但是這種方式并不是很好齿风,因?yàn)樵谥虚g的bufferedReader.readLine()處也可能拋出異常药薯,造成fileReader和bufferedReader無法關(guān)閉。因此更安全的方式是在finally中關(guān)閉文件救斑,類似這樣:
try {
...
} catch(...) {
} finally {
file.close();
}
但是果善,file.close()也會拋出異常,所以最終的安全代碼如下:
public static void readAll() {
FileReader fileReader = null;
BufferedReader bufferedReader = null;
try {
fileReader = new FileReader("test");
bufferedReader = new BufferedReader(fileReader);
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
fileReader.close();
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileReader != null) {
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
這樣寫是沒有問題了系谐,但是過于繁瑣巾陕,將原本很清晰簡單的邏輯無端的復(fù)雜化了。為了解決這個問題纪他,java引入了類似python with的方式鄙煤,try-with-resources,我們使用try-with-resources的方式改寫這段代碼如下:
public static void readAll() {
try (
FileReader fileReader = new FileReader("test");
BufferedReader bufferedReader = new BufferedReader(fileReader)
) {
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
由java從語言層面保證fileReader和bufferedReader一定關(guān)閉茶袒,代碼也非常簡潔清晰梯刚。
如果需要使用try-catch-resource,需要保證你的資源實(shí)現(xiàn)了:
public interface AutoCloseable {
public void close() throws Exception;
}
2 multi-catch
正常的try薪寓,catch多個異常如下:
public static void multiCatch() {
try {
if (System.currentTimeMillis() % 2 == 0) {
throw new IOException();
} else {
throw new ClassNotFoundException();
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
兩種異常的處理邏輯大致相同亡资,因此可以使用multi-catch澜共,將代碼簡化為:
public static void multiCatch() {
try {
if (System.currentTimeMillis() % 2 == 0) {
throw new IOException();
} else {
throw new ClassNotFoundException();
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
注意:multi-catch語法時的異常不能有相交。如IOException是Exception的子類, 所以以后用 | 分隔開的異常不能有父子關(guān)系锥腻。例如:
catch (IOException | Exception e) 將報錯嗦董。
3 開啟編譯支持。
為了使用java7和8的新特性瘦黑,建議將maven-compiler-plugin的configuration修改為1.8京革,如下: