0

我有類似下面的Java方法:異常在Java中處理有Java的最佳實踐

private boolean getBooleanProperty(String property, String defaultValue) { 
     boolean result = false; 
     try { 
      result = Boolean.parseBoolean(properties.getProperty(property, defaultValue)); 
     } catch (IllegalArgumentException | NullPointerException e) { 
     } 
     return result; 
    } 

我知道我處理在上述方法中的例外情況的方式是不正確的,並尋找有辦法那些更符合Java標準和最佳實踐。

同樣,對於下面的方法:

public void getStatusAndAnnotation(ITestResult result) { 
     try { 
      HashMap<Object, Object> map = new HashMap<>(); 
      Method method = result.getMethod().getConstructorOrMethod().getMethod(); 
      TestInfo annotation = method.getAnnotation(TestInfo.class); 
      try { 
       //add id removing the first character of the annotation (e.g. for C12034, send 12034) 
       if(annotation!=null) { 
        map.put("id",annotation.id().substring(1)); 
       } 

      }catch (NullPointerException e){ 
       e.printStackTrace(); 
      } 
      if (result.getStatus() == ITestResult.SUCCESS) { 
       map.put("result", 1); 
      } else if (result.getStatus() == ITestResult.FAILURE) { 
       map.put("result", 9); 
      } else if (result.getStatus() == ITestResult.SKIP) { 
       map.put("result", 10); 
      } 
      if (annotation != null) { 
       if(annotation.trDeploy() && !map.get("id").equals(null) && !map.get("id").toString().isEmpty()) 
       { 
        ApiIntegration.addTestResult(map); 
       } 
       else System.out.println("Deploying result was canceled, because test has annotation \"trDeploy: false\" or \"id\" has no value"); 
      } 

     } catch (SecurityException | IOException 
       | ApiException | NullPointerException e) { 
      e.printStackTrace(); 
     } 
    } 

如何處理這些不同的異常與最佳做法看齊?

+0

你不應該捕獲運行時異常,如NullPointerException異常 – mariusz2108

+0

您應該刪除兩個第一異常,如果控制和最後一個catch只需使用 –

+0

永遠不會捕獲NullPointerException。它表明程序員錯誤 - 你應該修復一個,而不是繞過或壓制。 – VGR

回答

1

我通常所做的就是讓編譯器/ IDE告訴我需要捕捉哪些異常,除非您想爲特定原因捕獲異常。這樣,我就可以編寫代碼而不會產生不必要的異常,而且我的代碼更乾淨。

這些類型的異常被稱爲Checked Exceptions

「在Java類層次結構,一個例外是,如果 從java.lang.Exception的繼承檢查異常,但不能從 了java.lang.RuntimeException所有的應用程序或業務邏輯異常都應該檢查異常。「

try 
{ 
    // open a file (Compiler will force to either catch or throw) 
} 
catch (IOException ioe) 
{ 
    ioe.printStackTrace(); 

    // need to make a decision on what to do here 
    // log it, wrap it in a RuntimeException, etc. 
} 

至於Unchecked Exceptions

「未檢查,未捕獲的或運行時異常有例外,可以是 拋出而不被卡住或宣佈」

String x = null; 

// this will throw a NullPointerException 
// However, you don't need to catch it as stated in some the comments 
x.toString(); 

你應該做的是防止

if (x == null) 
{ 
    x = "some default value"; // prevent the exception from happening. 
} 
x.toString(); 

這是否意味着你永遠不應該捕獲RuntimeException的

不,當然不是。這取決於場景。

拿這個例子

String number = "12345"; 

// You don't know if number is a valid integer until you parse it 
// If the string is not a valid number, then this code will 
// throw an Exception 
int i = Integer.parseInt(number); 

相反,你可以搭乘NumberFormatException異常。再次,這是預防的一種形式。

int i = 0; // some default 
try 
{ 
    i = Integer.parseInt(number); 
} 
catch (NumberFormatException nfe) 
{ 
    // Good practice to log this, but the default int is fine. 
} 

一些最佳實踐

  • 不要捕捉,除非編譯器會強迫你例外。
  • 如果您正在捕獲檢查的異常,請將其記錄下來。如果你想讓它遍歷調用堆棧,你也可以將它封裝在一個RuntimeException中。
  • 如果你想捕獲一個RuntimeException,那麼這樣做的目的(即你可以設置一個默認值,並防止錯誤所有在一起。)
  • 沒有一個方法鏈都拋出一個檢查異常向上堆棧跟蹤。這非常混亂,並強制所有調用方法捕獲或拋出檢查的異常。
  • 捕獲一個RuntimeException只是爲了記錄它真的沒有太大的目的。除非你將它記錄在一個捕獲所有位置。

包羅萬象的實例

try 
{ 
    // entry point to application 
} 
catch (Throwable t) 
{ 
    // let all exceptions come here to log them 
} 
0

這些類型的異常被稱爲選中例外,他們不應該在開發階段處理。拋出時,通常會在代碼中指示錯誤。

雖然開發人員能夠以編程方式處理這些異常,但不建議從它們中恢復,因爲它們通常表示需要調查和技術解決的嚴重問題。

看看這篇文章對於瞭解常見的異常處理技術:

How to use exceptions effectively