我曾尝试编写一个接收错误并返回相同的方法,但在消息末尾添加了感叹号,但是java中的错误是不可变的并且由于局限性而存在问题对于泛型,它不可能创建新的错误实例 通过使用新的T(e,消息):
public static <T extends Throwable> T withExclamationMark(T error) {
return new T(error.getMessage() + "!", error);
}
是否有任何简单的解决方案不需要反射等?
答案 0 :(得分:1)
您可以使用BiFunction
:
public static <T extends Throwable> T withExclamationMark(
T error,
BiFunction<String, T, T> factory) {
return factory.apply(error.getMessage() + "!", error);
}
然后,您可以按如下方式使用此方法:
RuntimeException original = new RuntimeException("Message");
RuntimeException decorated = withExclamationMark(original, RuntimeException::new);
System.out.println(decorated.getMessage()); // Message!
答案 1 :(得分:0)
public static void main(String[] args) throws Exception {
Throwable t = new Throwable("my message");
Throwable t2 = withExclamationMark(t);
t2.printStackTrace();
}
public static <T extends Throwable> T withExclamationMark(T error)
throws Exception {
Constructor c = error.getClass().getConstructor(String.class,
Throwable.class);
return (T) c.newInstance(error.getMessage() + "!", error);
}
答案 2 :(得分:0)
如果您想不惜一切代价避免反思,您将不得不为此付出代价。所提出的解决方案将牺牲精度w.r.t。 Throwable
的类型。要在消息中附加内容,我们将通过部署构造函数Exception(String, Throwable)
Throwable
包装在Exception
中
public static <T extends Throwable> Exception withExclamationMark(T t) {
return new Excpetion(t.getMessage() + "!", t);
}
正如我已经提到的,此方法仅返回类Exception
的实例,因此当您尝试catch
这些Exception
时,您必须检查cause
}:
try {
...
} catch (Exception e) { // let's assume you would normally catch an IOException here
Exception cause = e.getCause();
if ((cause != null) && (cause instanceof IOException) {
IOException ioEx = ((IOExcpetion) cause);
// handle excpetion
} else {
throw e; // or System.exit(42) or halt and catch fire or ...
}
}
有关部署反射的解决方案,请参阅@sanit's answer。也许两种答案的结合可以带来令人满意的解决方案。