我有拋出異常的代碼。在下面的代碼中,container.setIsDefault(true)引發InvocationTargetException。我想知道異常的真正原因,所以我在try ... catch塊中封裝了這段代碼。 但使用try catch塊是給我編譯時錯誤 InvocationTargetException的無法訪問catch塊
任何想法,我怎麼能弄清楚異常的真正原因「爲的InvocationTargetException無法到達的catch塊。這個異常是永遠不會從try語句的身體扔」。
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和代碼假的InvocationTargetException。但它不會進入任何那些抓blocks.Its直接進入下面的功能,其中的目標是空
public InvocationTargetException(Throwable target) {
super((Throwable)null); // Disallow initCause
this.target = target;
}
下面是堆棧跟蹤,現在異常在行container.addEntitySets(entitySets)到來;
InvocationTargetException.<init>(Throwable) line: 72
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43
Method.invoke(Object, Object...) line: 606
JavaMethodInvokerFactory$1.invoke(Method, Object, Object...) line: 60
AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(Object, HttpContext) line: 205
AbstractResourceMethodDispatchProvider$ResponseOutInvoker(ResourceJavaMethodDispatcher).dispatch(Object, HttpContext) line: 75
HttpMethodRule.accept(CharSequence, Object, UriRuleContext) line: 288
ResourceClassRule.accept(CharSequence, Object, UriRuleContext) line: 108
RightHandPathRule.accept(CharSequence, Object, UriRuleContext) line: 147
RootResourceClassesRule.accept(CharSequence, Object, UriRuleContext) line: 84
WebApplicationImpl._handleRequest(WebApplicationContext, ContainerRequest) line: 1469
WebApplicationImpl._handleRequest(WebApplicationContext, ContainerRequest, ContainerResponse) line: 1400
WebApplicationImpl.handleRequest(ContainerRequest, ContainerResponse) line: 1349
WebApplicationImpl.handleRequest(ContainerRequest, ContainerResponseWriter) line: 1339
ServletContainer$InternalWebComponent(WebComponent).service(URI, URI, HttpServletRequest, HttpServletResponse) line: 416
ServletContainer.service(URI, URI, HttpServletRequest, HttpServletResponse) line: 537
ServletContainer.service(HttpServletRequest, HttpServletResponse) line: 708
ServletContainer(HttpServlet).service(ServletRequest, ServletResponse) line: 848
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 303
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 208
WsFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 52
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 241
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 208
StandardWrapperValve.invoke(Request, Response) line: 220
StandardContextValve.invoke(Request, Response) line: 122
Authenticator(AuthenticatorBase).invoke(Request, Response) line: 501
Authenticator.invoke(Request, Response) line: 197
StandardHostValve.invoke(Request, Response) line: 170
ErrorReportValve.invoke(Request, Response) line: 98
TenantValidationValve.invokeNextValve(Request, Response) line: 255
TenantValidationValve.invoke(Request, Response) line: 101
RequestTracingValve.invoke(Request, Response) line: 24
RequestTracingValve.invoke(Request, Response) line: 27
StandardEngineValve.invoke(Request, Response) line: 116
CoyoteAdapter.service(Request, Response) line: 408
Http11Processor(AbstractHttp11Processor<S>).process(SocketWrapper<S>) line: 1040
Http11Protocol$Http11ConnectionHandler(AbstractProtocol$AbstractConnectionHandler<S,P>).process(SocketWrapper<S>, SocketStatus) line: 607
JIoEndpoint$SocketProcessor.run() line: 315
ThreadPoolExecutor(ThreadPoolExecutor).runWorker(ThreadPoolExecutor$Worker) line: 1145
ThreadPoolExecutor$Worker.run() line: 615
TaskThread(Thread).run() line: 745 [local variables unavailable]
你確定它是從'try'塊中的這些方法拋出的嗎?在大多數情況下,該錯誤信息應該是正確的。如果是這樣,請添加'if(false)拋出新的InvocationTargetException(null);'誘使編譯器相信try塊可以拋出它。 – zapl 2014-12-02 23:28:11
'公共生成器setIsDefault(boolean isDefault){this.isDefault = isDefault;返回這個; } - 什麼讓你覺得這是拋出一個'InvocationTargetException'? – 2014-12-02 23:30:37
您可以在塊的底部放置語句'throw new InvocationTargetException(「fake exception」);'假設代碼每次都拋出它,並且您不必多次遍歷該塊來捕獲錯誤。如果你真的想得到很好的幫助,可以發佈整個班級(w /行號?)和整個堆棧跟蹤,而不是一半解釋錯誤消息。這給了我們一個解釋發生的事情的機會,而不僅僅是猜測。 – arcy 2014-12-02 23:32:44