0

Java コード:

public static <T extends Throwable> void checkNotNull(Object value, String name, Class<T> exceptionClass) throws T, SecurityException, IllegalArgumentException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
    if (value==null)
      throw ExceptionHelper.constructException(exceptionClass, name + " should not be null");
}

static <T extends Throwable> T constructException(java.lang.Class<T> exceptionClass, String message) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
    Constructor<T> constructor = exceptionClass.getConstructor(String.class);
    T result = constructor.newInstance(message);
    return result;
}

Junit コード:

@Test
public void testCheckNotNull() {
    try {
    ValidationUtility.checkNotNull(null, "valuename", exceptionClass);
    } catch (T e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
      } 
}

次に、コンパイラは次のように言います: catch ブロックで型パラメーター T を使用できません

では、この問題を解決するにはどうすればよいでしょうか。

4

3 に答える 3

2

Tはコンパイル時に不明であるため、そのようなcatchブロックで使用することはできません。コンパイラでサポートされているものではないため、エラーが発生します。

正しい例外がスローされたことを確認することが目的の場合は、次のようにテストコードを変更することをお勧めします。

@Test
public void testCheckNotNull() {
    try {
        ValidationUtility.checkNotNull(null, "valuename", exceptionClass);
    } catch (Throwable e) {
        assertEquals(exceptionClass, e.getClass());
    } 
}
于 2012-10-05T14:50:01.673 に答える
0

以前の回答で指定されているように、Tをキャッチすることはできません。これは消去によるものです。例外が予想される場合は、予想されるJUnit4を使用することをお勧めします。

@Test(expected = Throwable.class)
public void testCheckNotNull() throws Throwable {
     ValidationUtility.checkNotNull(null, "valuename", exceptionClass);
}

テストコードにもバグがあります。例外がスローされない場合でも、テストは合格します。あなたもそこで失敗する必要があります

@Test
public void testCheckNotNull() {
    try {
      ValidationUtility.checkNotNull(null, "valuename", exceptionClass);
      fail("expected to throw")
    } catch (Throwable e) {}
}
于 2012-10-05T15:02:53.743 に答える
0

Constructor<T> constructor = exceptionClass.getConstructor(String.class);
T result = constructor.newInstance(message);

引数として渡されたクラスの結果オブジェクトを作成しています。ここで 'T' を使用するのは、 を拡張するクラスで結果を構築していることを意味するだけですThrowable

テストメソッドでは、このように宣言しても:

    @Test
    public <T extends Throwable> void testCheckNotNull() {
        try {
        ValidationUtility.checkNotNull(null, "valuename", exceptionClass);
        } catch (T e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
          } 
    }

Stillはタイプであり、キャッチできるTクラスなどではありません。Exceptionエラーで見つかったように、 をキャッチすることはできませんType

ご存じのように、 TypeTは を拡張するクラスを表しているため、使用は catch ブロックでThrowable使用することができます。Throwable

        } catch (Throwable e) {
于 2012-10-05T14:46:24.183 に答える