Java junit无法捕获一般异常

Java junit无法捕获一般异常,java,exception,junit,Java,Exception,Junit,java代码: public static <T extends Throwable> void checkNotNull(Object value, String name, Class<T> exceptionClass) throws T, SecurityException, IllegalArgumentException, NoSuchMethodException, InstantiationException, IllegalAccessException

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;
}
然后编译器说:不能在catch块中使用类型参数T

那么如何解决这个问题呢

Constructor<T> constructor = exceptionClass.getConstructor(String.class);
T result = constructor.newInstance(message);
仍然
T
是一种类型,而不是可以捕获的类,例如
Exception
。正如您在错误中发现的,您将无法捕获
类型

因为您知道,Type
T
表示扩展了
Throwable
的类,use可能希望在catch块中使用
Throwable

        } catch (Throwable e) {

因为T在编译时是未知的,所以不能在这样的catch块中使用它。编译器根本不支持它,因此出现了错误

如果您的目的是验证抛出了正确的异常,我建议您修改测试代码,如下所示:

@Test
public void testCheckNotNull() {
    try {
        ValidationUtility.checkNotNull(null, "valuename", exceptionClass);
    } catch (Throwable e) {
        assertEquals(exceptionClass, e.getClass());
    } 
}

正如前面的回答中指定的,您无法捕获T。这是因为擦除。如果您期望出现异常,我建议使用JUnit4

@Test(expected = Throwable.class)
public void testCheckNotNull() throws Throwable {
     ValidationUtility.checkNotNull(null, "valuename", exceptionClass);
}
您的测试代码也有一个bug。如果没有抛出异常,那么测试仍然会通过。你也需要有一个失败

@Test
public void testCheckNotNull() {
    try {
      ValidationUtility.checkNotNull(null, "valuename", exceptionClass);
      fail("expected to throw")
    } catch (Throwable e) {}
}

用Throwable替换T,因为您的类型参数可能没有在junit代码中声明。我还有一个问题。如何在调用ValidationUtility.checkNotNull(null,“valuename”,exceptionClass)时在测试用例中创建exceptionClass,因为exceptionClass类型是Class。只是“Class exceptionClass;”OK?通过声明
Class exceptionClass
,exceptionClass不能作为参数传递给
checkNotNull
方法,因为它未初始化。如果您正在做其他事情来初始化它,请分享它是如何初始化的?我只是不知道如何初始化它,因为它的类型是java.lang.Class。这是我之前猜测的。您的异常类必须是从
thowable
扩展而来的某个类,例如
java.lang.NullPointerException
。在这种情况下,您可以调用
checkNotNull
作为
ValidationUtility.checkNotNull(null,“valuename”,java.lang.NullPointerException.class)。非常感谢您的帮助。我知道怎么做。
@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) {}
}