2017-07-29 90 views
0

最近,我可以在一些代碼,讓我有些迷惑:不同的使用情況

我一直的印象是,這樣做的回報這種方式是不好的做法下。首先,除了查看日誌以外,沒有辦法知道是否有問題。我問了一下,普遍的觀點似乎是拋出一個異常會導致錯誤的代碼,因爲人們可能會發現異常並且無所作爲。這真的是不引發異常的好理由嗎?如果是這樣,有沒有其他辦法可以處理?

public void checkThisOut() { 
    String str = null; 
    str = someMethodThatCanReturnNull(); 
    if(str == null) { 
     //log error 
     return; 
    } 
} 

另一個例子如下:在這種情況下,break和return有什麼區別?一個比另一個更好嗎?

public void update() { 
    List<Object> objects = SomeClass.findObjects(); 
    for(Object o : objects) { 
     if(o.getSomething().equals("some value")) { 
      o.doSomething(); 
      return; 
     } 
    } 
} 
+0

對於第一個示例,返回null的內容並不一定表示發生了錯誤的錯誤。它可能只是用來表示一些東西。在第二個例子中,他們會有相同的行爲。如果它是一個2D循環,則會有所不同。 – Carcigenicate

+0

對於爲什麼投擲不好的解釋是可怕的。適當時投擲。不要避免這樣做,因爲某些麻煩的牛仔可能會誤用「catch」。 – Carcigenicate

+0

@Carcigenicate在第一個例子中發生了一些不好的事情 - 我應該讓這個更清楚,對不起。感謝您的回答 – BigBug

回答

1

拋出異常並不是錯誤的代碼。你不應該使用例外的規則控制流。

對於你的第二個例子,breakreturn是相等的,但我會使用return,因爲它確實使意圖更清楚。如果您想在循環後執行某些操作,則可以將其更改爲break

2

拋出異常的意圖,它是用來控制流(例如,如果(A),然後做B,否則,如果異常然後做C)在您的應用程序通常被認爲是不好的做法。

但是,在第一個示例中,如果您希望結果不爲null,並且您接收到空值,並且如果這是您無法繼續的意外錯誤情況,那麼這是一個很好的示例何時拋出異常。

2

當代碼拋出異常時,調用者有選擇如何反應。如果錯誤只記錄了但不傳播給調用者 - 那麼調用者甚至不知道錯誤。

因此,不扔的論據是無稽之談。當你害怕別人寫錯碼時 - 那麼你就教育他們做得更好。你不會自己開始編寫錯誤的代碼。但是,當正確地拋出異常時,記錄了爲什麼以及何時發生。

對於第二種情況:結果行爲沒有差異。所以風格只 - 做你的團隊通常做的事情。

1

拋出一個異常會導致糟糕的代碼,因爲人們可能會捕獲異常,並做到與它無關

我寫壞的代碼,以避免其他惡意代碼不同意。如果返回值爲null表示有錯誤,則應拋出異常。

0

對於第二個問題:break和return在這裏沒有任何區別,因爲for循環後沒有任何區別。 如果你在for循環之後添加代碼,在這種情況下return會完全退出該方法,而break循環在for循環結束時會有所作爲。

沒有比另一個更好,這取決於你的意圖。回報可能更加清晰和快速(更容易理解),但很多人認爲一種方法應該只有一個單一的回報,並且有兩個或更多的方法是不好的做法(因爲它使代碼更難理解)

如果你不得不返回一個值,以防萬一你找到的對象沒有找到,比如indexOf返回-1:將找到的項目存儲在一個變量中,打破循環,並有一個單一的最後返回,或者在方法中有兩個返回語句。兩者都是正確的途徑。