2014-12-02 26 views
-2

我有拋出異常的代碼。在下面的代碼中,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]  
+2

你確定它是從'try'塊中的這些方法拋出的嗎?在大多數情況下,該錯誤信息應該是正確的。如果是這樣,請添加'if(false)拋出新的InvocationTargetException(null);'誘使編譯器相信try塊可以拋出它。 – zapl 2014-12-02 23:28:11

+0

'公共生成器setIsDefault(boolean isDefault){this.isDefault = isDefault;返回這個; } - 什麼讓你覺得這是拋出一個'InvocationTargetException'? – 2014-12-02 23:30:37

+1

您可以在塊的底部放置語句'throw new InvocationTargetException(「fake exception」);'假設代碼每次都拋出它,並且您不必多次遍歷該塊來捕獲錯誤。如果你真的想得到很好的幫助,可以發佈整個班級(w /行號?)和整個堆棧跟蹤,而不是一半解釋錯誤消息。這給了我們一個解釋發生的事情的機會,而不僅僅是猜測。 – arcy 2014-12-02 23:32:44

回答

1

這裏最可能發生的問題是異常實際上不是TargetInvocationException,而是另一個異常包裝它。

更新您的catch塊是:

}catch (RuntimeException e) 

,看看會發生什麼。

+0

它不工作。 – anand 2014-12-02 23:40:09

+0

@ Alien01然後嘗試捕獲'Throwable',它捕獲可以在Java中拋出的任何東西。 – zapl 2014-12-02 23:42:11