Java InvocationTargetException的不可访问捕获块
我有一个抛出异常的代码。在代码行下容器中。setIsDefault(true)正在引发InvocationTargetException。我想知道异常的实际原因,所以我将此代码包装在try..catch块中。 但使用try-catch块会给我带来编译时错误 “InvocationTargetException的捕获块不可访问。此异常从不从try语句体引发” 知道我该如何找出异常的实际原因吗Java InvocationTargetException的不可访问捕获块,java,exception,odata,Java,Exception,Odata,我有一个抛出异常的代码。在代码行下容器中。setIsDefault(true)正在引发InvocationTargetException。我想知道异常的实际原因,所以我将此代码包装在try..catch块中。 但使用try-catch块会给我带来编译时错误 “InvocationTargetException的捕获块不可访问。此异常从不从try语句体引发” 知道我该如何找出异常的实际原因吗 try{ EdmEntityContainer.Builder container
try{
EdmEntityContainer.Builder container= EdmEntityContainer.newBuilder();
container.setName(dataBase);
container.setIsDefault(true);
container.setLazyLoadingEnabled(true);
container.addEntitySets(entitySets);
}catch (InvocationTargetException e)
{
Throwable cause = e.getCause();
System.out.format("Invocation of failed because of: %s%n", cause.getMessage());
}
更新:
我在代码中添加了RuntimeException和fake InvocationTargetException。但它不会进入任何一个catch块,而是直接进入下面的函数,其中target为null
public InvocationTargetException(Throwable target) {
super((Throwable)null); // Disallow initCause
this.target = target;
}
这是stacktrace,现在异常出现在line容器中
InvocationTargetException.(可丢弃)行:72
NativeMethodAccessorImpl.invoke0(方法、对象、对象[])行:不可用[本机方法]
NativeMethodAccessorImpl.invoke(对象,对象[])行:57
DelegatingMethodAccessorImpl.invoke(对象,对象[])行:43
调用(对象,对象…)行:606
JavaMethodInvokerFactory$1.invoke(方法、对象、对象…)行:60
AbstractResourceMethodDispatchProvider$ResponseOutInvoker.\u调度(对象,HttpContext)行:205
AbstractResourceMethodDispatchProvider$ResponseOutInvoker(ResourceJavaMethodDispatcher).dispatch(对象,HttpContext)行:75
accept(CharSequence、Object、UriRuleContext)行:288
accept(CharSequence、Object、UriRuleContext)行:108
接受(CharSequence,Object,UriRuleContext)行:147
接受(CharSequence、Object、UriRuleContext)行:84
WebApplicationImpl.\u HandlerRequest(WebApplicationContext,ContainerRequest)行:1469
WebApplicationImpl.\u HandlerRequest(WebApplicationContext、ContainerRequest、ContainerResponse)行:1400
WebApplicationImpl.HandlerRequest(ContainerRequest,ContainerResponse)行:1349
WebApplicationImpl.HandlerRequest(ContainerRequest,ContainerResponseWriter)行:1339
ServletContainer$InternalWebComponent(WebComponent).服务(URI,URI,HttpServletRequest,HttpServletResponse)行:416
ServletContainer.service(URI、URI、HttpServletRequest、HttpServletResponse)行:537
ServletContainer.service(HttpServletRequest,HttpServletResponse)行:708
ServletContainer(HttpServlet).service(ServletRequest,ServletResponse)行:848
ApplicationFilterChain.internalDoFilter(ServletRequest,ServletResponse)行:303
ApplicationFilterChain.doFilter(ServletRequest,ServletResponse)行:208
doFilter(ServletRequest、ServletResponse、FilterChain)行:52
ApplicationFilterChain.internalDoFilter(ServletRequest,ServletResponse)行:241
ApplicationFilterChain.doFilter(ServletRequest,ServletResponse)行:208
StandardWrapperValve.invoke(请求、响应)行:220
StandardContextValve.invoke(请求、响应)行:122
验证器(AuthenticatorBase).调用(请求、响应)行:501
Authenticator.invoke(请求、响应)行:197
StandardHostValve.invoke(请求、响应)行:170
ErrorReportValve.invoke(请求、响应)行:98
TenantValidationValve.invokeNextValve(请求、响应)行:255
TenantValidationValve.invoke(请求、响应)行:101
RequestTracingValve.invoke(请求、响应)行:24
RequestTracingValve.invoke(请求,响应)行:27
StandardEngineValve.invoke(请求、响应)行:116
郊狼适配器。服务(请求、响应)线路:408
http11处理器(抽象http11处理器)。进程(SocketWrapper)行:1040
Http11Protocol$Http11ConnectionHandler(AbstractProtocol$AbstractConnectionHandler)。进程(SocketRapper,SocketStatus)行:607
JIoEndpoint$SocketProcessor.run()行:315
ThreadPoolExecutor(ThreadPoolExecutor).runWorker(ThreadPoolExecutor$Worker)行:1145
ThreadPoolExecutor$Worker.run()行:615
TaskThread(Thread).run()行:745[局部变量不可用]
这里最可能的问题是,异常实际上不是TargetInvocationException,而是包装它的另一个异常
将捕捉块更新为:
}catch (RuntimeException e)
然后看看会发生什么。您确定它是从
try
块中的那些方法中抛出的吗?在大多数情况下,该错误消息应该是正确的。如果是,添加例如If(false)抛出新的InvocationTargetException(null)
诱使编译器相信try块可以抛出它。公共生成器setIsDefault(boolean isDefault){this.isDefault=isDefault;return this;}
-是什么让你认为这是在抛出一个InvocationTargetException
?你可以把语句抛出新的InvocationTargetException(“伪异常”);代码>位于块的底部,假设代码每次都抛出它,并且您不必多次遍历块来捕获错误。如果您真的需要好的帮助,可以发布整个类(带行号?)和整个堆栈跟踪,而不是中途解释错误消息。这使我们有机会解释发生了什么,而不仅仅是猜测。编译错误已消失,但仍无法找到异常的根本原因。停止猜测并发布堆栈跟踪。摆脱你自己的InvocationTargetException
@Alien01,然后尝试捕获Throwable
,它捕获Java中可以抛出的任何东西。@Alien01与Throwable一起工作!RuntimeException将不起作用,它是Exception的一个子类。我打赌捕获Throwable并不是最优雅或技术上最准确的方法,但除非您尝试针对这种类型的异常执行一些非常具体的操作。。。它起作用了!它为我做的很好,谢谢!
}catch (RuntimeException e)