2014-01-28 46 views
-3

我不知道,爲什麼你需要在java中拋出異常。我只能評估回報價值。這裏是一個例子:爲什麼你需要在java中拋出異常

int logic(int i){ 
     switch(i){ 
      case 0: 
      return 0; 
      case 1: 
      return 1; 
      default: 
      throw new Exception(); 
      // return -1; 
     } 
} 

在默認情況下,我可以拋出異常對象,但我也可以返回-1。這兩種方法可以捕獲它。爲什麼我需要拋出異常? 我的英語不是很好,因爲英語不是我的主要語言。如果有什麼你不明白的,請告訴我。謝謝。

+1

你拋出一個異常傳達,**的關鍵問題已發生**你的方法 – sanbhat

+0

的我不來電看看你爲什麼要拋出一個*例外*。 – Maroun

+0

這裏不需要使用異常....默認放入中斷 – Boopathi

回答

2

拋出異常,在合適的情況下,有以下幾個優點:

在一些情況下返回類型的每個可能的值是有意義的結果。沒有可用於表示錯誤的備用值。

一個異常可以傳達更多的信息。它可以包含一條消息,解釋發生了什麼問題。

捕獲異常可以針對一段代碼完成。測試返回值必須在每次調用後完成,使代碼混亂。

可以將調用堆棧傳遞給可以比直接調用方更好地報告或處理該方法的異常。

+0

好的總結。唯一缺少的是,如果不是鏈中的每個調用者都必須檢查錯誤標記的返回值,那麼效率更高。 – Holger

0

我不知道,爲什麼在java中需要異常。

異常用作運行時失敗的指示。例如:某些I/O操作無法執行或指定的資源不可用。在這種情況下,JVM將通過例外的方式指示失敗。

拋出異常是一回事,處理它們是另一回事。在你的情況下,你正在考慮你明確拋出異常的情況。但是如果JVM需要拋出一個呢。沒有機制可以通過返回值。 JVM。

在默認的情況下,我可以返回一個值

當你明確地拋出一個checked異常,調用者要麼處理它或把它。因此,調用者意識到該方法能夠生成異常,並且可以採取適當的操作來處理它。

0

實際上有兩種類型的例外,即CheckedUnchecked。無需擔心處理UncheckedException。但需要處理CheckedException

爲什麼我們需要在Java中檢查異常?

經過異常是作爲方法的 名稱和參數,以便例外是,你必須與客戶端的代碼 合同的一部分,你的方法簽名的儘可能多的部分。它們作爲 客戶端代碼的標記,表示您遇到了一個錯誤情況,即您 不知道如何處理或者您希望客戶端代碼知道 以便它能夠爲您處理問題。

Read more.

0

exception用來表示某物特殊,如果你願意,已經發生的,因此需要一些特別注意的情況。你可以返回不同的整數值來表示你擁有的不同方法的終止狀態,但是如果你有一個方法從文件中讀取一個對象並返回它呢?

你的方法將要求您:

  1. 有你的方法返回的項目列表,從而使你的代碼更加複雜。
  2. 有一些文檔來表示返回語句中的不同數字的含義。這可能很麻煩,特別是如果你不夠細心並採用某種標準。

總之,如果你有上述相同的方法和使用異常,可以返回剛纔你在同一時間點的這個名單可以去錯在方法簽名產生,而對象,從而使代碼更易於閱讀,遵循和維護。

簡而言之:

public List loadObjectFromFile(String path) 
{ 
    List returnList = new ArrayList(); 
    ... 
    //Something goes wrong in your code 
    returnList.add("1"); 
} 

然後調用它像這樣:

List loadFromFile = loadObjectFromFile("..."); 
if(list.get(0).toString().equals("1")) 
{ 
    System.out.println("Error ... has occured"); 
} 
... 
else if(list.get(0).toString().equals("0")) 
{ 
    MyObject obb = loadFromFile.get(1); 
} 

至於反對:

public MyObject LoadObject(String filePath) throws Exception 
{ 
    ... 
} 

然後調用它像這樣:

try 
{ 
    MyObject obj = LoadObject("..."); 
} 
catch (Exception e) 
{ 
    e.printStackTrace(); 
} 
0

首先,你應該從來沒有throw new Exception()。這是非常糟糕的做法,因爲它鼓勵捕捉Exception。這意味着所有的異常都被代碼以同樣的方式處理,即您可以捕獲您並不想要的異常。

所以你應該創建一個自定義的異常類型或使用現有的類型之一。也許像是IllegalArgumentException。關於何時拋出未檢查(例外情況擴展爲RuntimeException)與檢查異常之間存在爭議。我現在不會進入。

至於爲什麼你會拋出一個異常而不是return -1,這是由於異常的性質。他們「傳播」。你可以用一種方法拋出它們,並且它們會自動傳播到調用堆棧中,直到它們被捕獲。這意味着您可以在業務層中引發異常並將其傳播到GUI層,而不必明確return錯誤代碼。

此外,當誤差在void方法會發生什麼:

void logic(int i){ 
     switch(i){ 
      case 0: 
      doSomethingWonderFul(); 
      case 1: 
      doSomethingEvenMoreWonderFul(); 
      default: 
      //oops, what now? 
     } 
} 
相關問題