Java SE 7 異常處理

Java SE 7 在日常編程中對一些內容進行了優化
具體有以下幾種
1、switch 語句中支持字符串String
     如:switch(“a")
2、更好的整型字符串
3、泛型改進類型推斷<>
4、優化了異常處理
5、簡化了可變參數方法調用
我這次主要說的是優化的異常處理具體內容是:多重捕獲、重新拋異常和try -with -resources。
1、多重捕獲異常
     JAVA SE7中新增了多重捕獲異常,以便更輕鬆更簡潔的處理異常。以後淘寶線上服務器都切換到JAVA 7的時候,我們新代碼就可以使用這種特性了。
     現在我們寫一段代碼進行多重捕獲異常是這樣的
     示例1
     public class Test1 {
publicstaticvoid main(String[] args) {
try{
XXX()xx =
newXXXX();
    xx.xxx();
}
catch(ParseException exception){

}
catch(IOException exception){

}
catch(ProduceExceptionexception){

}
}
}
 比如我們這三個異常中,ParseException異常和IOException的業務處理是一致的情況下,要麼拷貝同樣的代碼一份寫在一個異常中,要麼就使用不同的業務邏輯。如果是在偷懶或者不考慮資源消耗的情況下直接使用
     class Test2 {
publicstaticvoid main(String[] args) {
try{
XXX()xx = newXXXX();
    xx.xxx();
}
catch(Exception exception){

}
}
}
那麼在Test2這個類中,存在的最大問題就是try代碼塊中的任何代碼都會出現異常,而該異常將被一個覆蓋式的catch Exception 子句吞掉了。如果拋出的異常不是ParseException異常和IOException,而是其他的異常,在Test2中仍然會捕獲它,而上游調用代碼不知道實際發生了什麼。而這種異常吞併會很難對問題進行處理活着調試(如果業務不確定異常或者異常可以統一處理時,可以直接使用的)
那麼在JAVA 7中,就允許開發者將catch子句組合在一起,而無需在讓存在一致的異常處理進行copy了。
class Test3 {
publicstaticvoid main(String[] args) {
try{
XXX()xx = newXXXX();
    xx.xxx();
}
catch(ParseException | IOException exception){

}
}
}
Test3類中顯示的將兩條語句合併成一個catch塊,那麼在catch時將同時捕獲這兩種異常;因此,如果業務出現兩種異常使用同一處理時就可以使用此方法了。
語法時:ParseException | IOException exception
2、重新拋出異常
     在執行異常處理時,有時會重新拋出已經處理過的異常或者當前不處理這個異常直接拋出。通常在偷懶或者經驗不足的時候會這麼寫
class Test4 {
publicstaticvoid main(String[] args) {
try{
createTest();
}
catch(IOException exception){
System.
err.println(exception.getMessage());
}
}

publicstaticvoid createTest() throws Exception{
try{
Test4
test = new Test4();
test.notifyAll();
}
catch(Exception e){
throw e;
}
}
}
     在執行Test4是無法編譯的
class Test5 {
publicstaticvoid main(String[] args) {
try{
createTest();
}
catch(RuntimeException exception){
System.
err.println(exception.getCause().getMessage());
}
}
publicstaticvoid createTest() throws Exception{
try{
thrownew IOException("Error");
}
catch(IOException e){
thrownew RuntimeException(exception);
}
}
}

Test5中顯示了一種處理異常然後將其重新拋出的方法,當然在Test5中也是有問題的,是沒有把最原始的異常拋出來,而是嵌套在另一個異常中,這意味着下游調用或者依賴方在使用該方法時需要知道原始異常被嵌套的。
所以這樣處理也是不夠友好的。如果要給調用方原始異常,那麼就需要做一下改動,看下面的例子:
class Test6 {
publicstaticvoid main(String[] args) {
try{
createTest();
}
catch(IOException exception){
System.
err.println(exception.getCause().getMessage());
}
}
publicstaticvoid createTest() throws Exception{
try{
thrownew IOException("Error");
}
catch(IOException e){
thrownew RuntimeException(exception);
}
}
}
3、Try-with-Resources 
      在使用異常處理時,經常會發現一個問題,就是對資源關閉的時候,如jdbc需要關閉Connection鏈接;
   如例子(這個代碼是我用來給測試做批量的報名數據時使用的)
public class Test {
publicstaticvoid main(String[] args) {
Connection
conn = null;
        String
sql;
        String
url = "jdbc:mysql://XXXXX:XXXXX/XXXXX?" + "user=root&password=root&useUnicode=true&characterEncoding=GBK";
       
try {
            Class.forName(
"com.mysql.jdbc.Driver");//
           
conn = DriverManager.getConnection(url,"XXXX","XXXX");
            Statement
stmt = conn.createStatement();
               
for(inti=0;i<10000;i++){
                 
sql = "INSERT INTO bop_libra_00.bm_application_0093 "
                  +
"(application_id) "
                  +
"VALUES "
                  +
"(10228"+i+"0605)";
                 
intresult = stmt.executeUpdate(sql);
                  System.
out.println(result);
            }
        }
catch (SQLException e) {
           
e.printStackTrace();
        }
catch (ClassNotFoundException e) {
e.printStackTrace();
}
finally {
           
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
        }
}
}
     在上面的代碼中,是JAVA SE 7之前的處理關閉資源的一種方式。
         大家看到這裏也注意到了一個問題,那就是conn在關閉的時候其實是在try catch外在加了一層處理邏輯,如果我們只想做之事在發送SQLException時對conn進行關閉呢?那麼是不是需要寫很多的邏輯代碼?
  那麼在JAVA SE 7的時候我們該怎麼做呢?是可以更簡潔的完成,可以使用JAVA SE 7中新的語法,可以聲明作爲try塊的組成部分的資源。這樣其實也意味着預先考慮到資源的消耗,在程序運行時將在執行try 代碼塊後自動關閉資源,前提是如果尚未關閉等。
     public class Test1 {
publicstaticvoid main(String[] args) {
Connection
conn = null;
        String
sql;
        String
url = "jdbc:mysql://XXXXX:XXXXX/XXXXX?" + "user=root&password=root&useUnicode=true&characterEncoding=GBK";
       
try(conn = DriverManager.getConnection(url,"XXXX","XXXX")){
            Class.forName(
"com.mysql.jdbc.Driver");//
            Statement
stmt = conn.createStatement();
               
for(inti=0;i<10000;i++){
                 
sql = "INSERT INTO bop_libra_00.bm_application_0093 "
                  +
"(application_id) "
                  +
"VALUES "
                  +
"(10228"+i+"0605)";
                 
intresult = stmt.executeUpdate(sql);
                  System.
out.println(result);
            }
        }
catch(SQLException | ClassNotFoundException e) {
           
e.printStackTrace();
        }
}
}
    Test1類的實際的打開操作是發生在try (….) 語句中。當然實現這個代碼的前提是需要實現AutoCloseable接口纔可以
總結
     JAVA SE 7中的異常處理更改不僅可以使開發的代碼更簡潔,還允許對部分異常進行預處理,然後再出現異常的時候進行調用。還能使得在異常清理操作時減少再次異常的出現,新的異常處理可以使得開發人員的效率提高和避免一些特殊的業務處理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章