2013-11-09 45 views
0

我有一個接口類,一個實現類,一個異常類和Main類。我不確定我是否有效地在代碼中使用try catch塊。我在網上搜索,發現類似的主題和問題,但我找不到我的問題的答案。我用主要和實施文件中的try catch。有意義嗎? 能否請您提供有效性建議?下面的關於try-catch的邏輯是對的還是不對?有效使用try-catch塊&我們應該在哪裏找到它們?

Interface Class: 

public void createDatabase() throws DatabaseAlreadyCreated; 


Implementation Class: 

public void createDatabase() throws DatabaseAlreadyCreated 
{ 
try 
{ 
    // Create Database 
     //if database is already exist 
     throw new DatabaseAlreadyCreated(); 
}   
catch (SQLException e) {e.printStackTrace();} 
catch (ClassNotFoundException e) {e.printStackTrace();} 

} 

Exception Class: 

public class DatabaseAlreadyExist extends Exception 
{ 

    public DatabaseAlreadyExist(String str) 
    { 
     System.out.println("database exist exception"); 
    } 
} 



Main Class: 

public static void main(String args[]) 
{ 
     try 
     { 
     x = ops.createDatabase(); 
     } 
     catch (DatabaseAlreadyExist e) 
     { 
     e.printStackTrace(); 
    } 
} 

回答

1

該代碼有些破碎....除非你有非常具體的原因,你不應該直接擴展Throwable類,而應該擴展Exception而不是(或像RuntimeException的異常的後代)。

有了這樣的代碼是你是不是有可能會OT能夠捕獲異常,除非你有catch (DatabaseAlreadyExistsException e)

除了抓住它明確,你有沒有推薦的一些錯誤處理問題...做一個'printStackTrace'不是一個有效的方法來處理一個問題,但我不確定你是否這樣做只是爲了表明你已經處理它,或者不是(即你的真實代碼是否做了printStackTrace ?)......


編輯:評論後更新...

好的,我明白你現在問的是什麼,比以前更多。使用在其他的答案和評論描述的機制,我會建議做這樣的事情:

public boolean checkDatabaseExists(...) { 
    try { 
     ... do the things you need to check the database exists. 
     return true; 
    } catch (Exception e) { 
     return false; 
    } 
} 

然後,在你的主要方法,您可以:

if (!checkDatabaseExists(...)) { 
    createDatabase(...); 
}  
+0

沒有。我寫它只是爲了顯示我一直在處理 – oiyio

+0

我添加了可拋類並理解你的意思。更重要的是我明確地搜索數據庫是否已經存在或沒有。我用http://stackoverflow.com/questions/12414596/how-to-check-if-a-particular-database-in-mysql-already-exists-using-java中的問題代碼 – oiyio

0

一般情況下,你只拋出一個異常,如果你不能處理你是現在水平的錯誤,你只抓住你可以在這一級處理錯誤。

+0

除非發生SQLException或ClassNotFoundException,否則我會查找數據庫是否存在,如果存在,則拋出異常。有沒有更好的方法來查找數據庫是否存在。我使用鏈接中的代碼http://stackoverflow.com/questions/12414596/how-to-check-if-a-particular-database-in-mysql -already-exists-using-java – oiyio

1

一般來說try/catch塊比使用if/else塊更加昂貴。

所以只有使用try/catch實際的錯誤可能發生,例如,當與服務器或數據庫通信時,try/catch塊將是適當的。

如果應該測試一個變量是否爲「null」,那麼使用try/ctach會很昂貴。 在這些情況下,您應該使用像if/else這樣的邏輯。

+0

我已經在努力與數據庫,所以它是可以接受的使用try catch而不是if else;) – oiyio

1

簡單的方法來在任何編程開始一場宗教戰爭論壇是:「處理錯誤的最佳方式是什麼?」 :)但這是一個完全有效的問題。

在Java中,正如您可能已經知道的,有兩種異常:運行時可檢測和編譯時可檢測。 (另一組標籤在運行時爲「未選中」,在編譯時爲「已檢查」。)編譯時檢測到的異常拋出了專門爲它們定義的異常,這是您對自定義數據庫異常的處理方式。檢查異常和未檢查異常(例如:空指針或索引超出範圍異常)之間的巨大差異在於,如果檢查異常,則需要使用進行處理,或者使用「throws」關鍵字從方法範圍中委託處理,強制調用方法來處理它。可以處理未經檢查的(通過try/catch塊),但不是必需的。未經檢查的異常還只會拋出特定的異常,這些異常來自類RuntimeException,後者本身是Exception的後代。(請參閱http://docs.oracle.com/javase/7/docs/api/java/lang/RuntimeException.html瞭解完整的自下而上)。雖然您可以使用try/catch塊來捕獲運行時異常,但您不能將這些類型的異常轉換爲除特定運行時異常之外的任何其他異常處理(例如,運行時的空指針引用只能由NullPointerException對象處理或其超類對象之一,而沒有其他)。

那麼爲什麼「例外評論課程」呢?因爲是否應該向調用方法「向上」拋出異常或者在其發生的方法中當場處理異常,這在很大程度上與處理異常生成代碼之後的代碼是否可以「生存」的問題有關成功完成try/catch塊中的任何內容。本質上,後續代碼是否可能存在未經檢查(運行時)異常,如空指針異常?通常情況就是這樣。或者,隨後的代碼可能是可執行的,但處於不可靠的狀態(例如,字段值未根據期望設置等)。或者,如果try/catch塊在數據庫調用周圍執行更新時,數據庫數據狀態可能不正確,無法完成您想要的操作。你需要決定基於上下文和目標(依賴)是否:

  1. 向上拋出異常不處理或報告在本地,在本質上把負擔調用方法來對付它。
  2. 在本地處理異常並記錄/報告(可能),然後使用catch(){}塊中的'return'退出該方法。
  3. 在本地處理異常並記錄/報告(可能),然後繼續在該方法中執行代碼。

正如我所說,您所做的取決於您需要做什麼。就我個人而言,我將異常處理視爲每個給定方法的問題,並在本地處理。拋出的異常實際上意味着該方法未能完成其預期的任務 - 除非調用方法可以彌補其失敗,或者在創建異常的方法中,後續代碼仍然可以實現期望的目標。把它扔到調用方法只是意味着你從桌子上拿走了這兩個選項中的一個,更糟糕的是,它發生時立即拋出,所以在退出使用方法之前,你拿掉了在異常之後拾取的任何選項'返回'或繼續使用該方法。現在有時可能需要使用try/catch來測試代碼中的條件;即使用某種方法的異常拋出特性作爲確定你的代碼將在下一步做什麼的手段。但是,這通常是皺眉,尤其是。如果有「更清潔」的方式。 [沒有像Java純粹主義者那樣的純粹主義者。 :)]

當然,向上拋出異常很可能有時間。但是,國際海事組織正是在這種情況下,調用方法不必太在意被調用方法邏輯影響的任何對象或數據的狀態。我把它看作是處理所產生的不那麼重要的例外的一種更爲概括的方式。在我自己的情況下,我更願意在使用可能爲null的對象之前檢查空對象引用。由於方法中的異常而將可返回對象賦值爲null,並在catch(){}塊中返回它,這是一種非常常用的方法,用於讓調用方法知道被調用的方法未能按照其意圖執行。例如:

public meth1() { 
    Object o = meth2(); 
    if (o != null) { 
     ... do what you need to ... 
     } else 
     { 
     ... deal w/ no valid o object ... 
     } 
    ... 
    } 

private Object meth2() { 
    Object retnme = new Object(); 
    ... 
    try { 
     ... give it yer best ... 
    } catch (Exception e) 
    { 
     logException(e); // a call to some logging method. 
     ... clean up bad karma ... 
     return null; 
    } 
    ... 
    return retnme; 
} 

所有這一切說,重新您的ABT你的代碼直接的問題:基於上述,並銘記我不完全知道你的情況,我不明白爲什麼你應該拋出定製你爲調用方法創建的異常,除非你特別想用這個異常來表示不管什麼原因發信號給調用方法,你要創建的db已經存在。如果知道這對調用方法沒有特別的用處 - 不需要這樣做。這個決定的一部分取決於你是否期望使用任何實現你的接口的類來知道數據庫是否存在。避免使用這種策略的一種方法是編輯接口和類文件,以便該方法返回布爾值而不是void。如果它返回'真',數據庫已創建。如果'虛假',那不是出於某種原因。你也可以讓它返回一個int值,並根據它的值指示數據庫創建是否成功。例如,值0可能意味着成功,而值1..n可能表示失敗的原因,當然一個值表示db已經存在的事實。

真的,天空的極限。 :)希望這有一些幫助。

相關問題