2015-02-11 71 views
0

遵循Joshua Bloch的Effective Java中使用的樣式並與this問題的答案一致,在過去的Java SE環境中,我使用了AssertionErrors來實現永遠不可能執行的代碼路徑。我可以在EJB方法中拋出一個AssertionError嗎?

看着Java EE中,在EJB 3.1規範說

如果bean方法遇到系統異常或錯誤,就應該從bean方法錯誤簡單地傳播到容器(即bean方法不必捕捉異常)。

並且稍微向下,它表示在非ApplicationException的情況下必須丟棄相關的EJB實例。據我所知,如果在後續請求中需要該EJB的另一個實例,那麼容器會從池中取出一個,或者在必要時創建一個新的實例,因此應該沒有與此關聯的問題(當然,除非是一個@Singleton EJB)。

在會話bean方法中使用AssertionError來指示編程錯誤是否合適/好用?還是有更適合的Throwable子類型?

回答

1

投擲AssertionError我真的沒有看到任何錯誤。容器應該能夠執行回滾,就像它對於任何未被克隆的異常一樣。

話雖如此,我從來沒有丟棄過AssertionError。一對夫婦的常見的例子,我會拋出的RuntimeException一個子類,這可能是比AssertionError更合適,分別是:

假設我們有一個enum

public enum TestEnum { 
    TEST1, TEST2; 
} 

我要趕在默認情況下,這個我拋出一個IllegalArgumentException

public class TestClass { 

    public void doSomethingWithTestEnum(TestEnum testEnum) { 
    switch (testEnum) { 
    case TEST1: 
     // do something here 
     break; 
    case TEST2: 
     // do something here 
     break; 
    default: 
     throw new IllegalArgumentException("Unknown enum type: " + testEnum); 
    } 
    } 

} 

另一個例子是參數驗證:

public class TestClass { 

    private String testString; 

    public TestClass(String testString) { 
    this.testString = Objects.requireNonNull(testString); 
    } 

} 

這裏,如果testString爲空,則拋出NullPointerException

有可能的情況下斷言會更合適,但老實說,我從來沒有遇到過它們。

+0

我最擔心的是一個錯誤可能會以某種方式對容器產生負面影響,但正如你所說,這應該不成問題。 至於使用'AssertionError's,開啓Enum's其中一個值的情況是缺少的情況實際上是Joshua Bloch使用它的一個例子。 ;-)我猜這取決於Enum的種類,但是如果它具有很多「語義」含義,那麼不考慮其中一個可能的值可能會被視爲更多的編程錯誤。 – 2015-02-16 07:45:13

相關問題