我正在从命令行运行maven
mvn exec:java -Dexec.mainClass=org.xmlcml.svg2xml.analyzer.DocumentListAnalyzer
-Dexec.args=.
当我的程序抛出一个RuntimeException时,maven不抛出它但抛出InvocationTargetException
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.RuntimeException: Only one primary allowed for 3 line textL
ineGroup
at org.xmlcml.svg2xml.text.TextLineGroup.createSuscriptTextLineList(Text
LineGroup.java:181)
at org.xmlcml.svg2xml.text.TextLineGroup.createHtml(TextLineGroup.java:2
40)
运行Eclipse时不会发生这种情况。
为什么会这样? (它使我感到困惑并使我的用户感到困惑)。
答案 0 :(得分:3)
Invoking Methods告诉我们如下: -
反射提供了一种在类上调用方法的方法。通常,只有在无法在非反射代码中将类的实例强制转换为所需类型时才需要这样做。
使用java.lang.reflect.Method.invoke()
调用方法。 第一个参数是
the object instance
,在其上调用此特定方法。 (如果方法是静态的,则第一个参数应为null。)后续参数是method's parameters
。如果基础方法抛出异常,则 将由 包裹
java.lang.reflect.InvocationTargetException
。可以使用异常链接机制的InvocationTargetException.getCause()
方法检索方法的原始异常。
由于堆栈跟踪也告诉我们exec:java
也使用了Reflection
。然后原始异常也被包装。请参阅org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297)的源代码以获取进一步的参考。
我希望这可能有所帮助。