2012-07-31 95 views
0

我有一个构造函数在第一次调用new时失败,因为类javax.persistence.NoResultException的异常被捕获到一个类的方法中。类构造函数无法抛出类加载异常

编辑:它不是NoResultException,NoResultException是异常的消息。 stackTrace低于

如果我删除导入到javax.persistence.NoResultException并只捕获一般Exception e,代码工作。

我的问题是:

  1. 为什么一个方法里面的代码还没有被称为是影响构造? (也没有在构造函数中调用)
  2. 为什么ClassLoader抛出一个不应该抛出的异常?根据JavaDoc,ClassLoader.loadClass()抛出ClassNotFoundException

,对于javax.persistence.NoResultException赶上以及进口老代码管理版本之间生存,我删除它和它的固定的,但是我想现在这背后的原因。

堆栈跟踪:

java.lang.NoClassDefFoundError: javax/persistence/NoResultException 
    at xxx.xxxxxx.xxxxxxx.xxxx.xxxx.xxxxxxxxxxxx.xxxxxxxxxxxxxxx(ClassB.java) 
    ... 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:619) 
Caused by: java.lang.ClassNotFoundException: javax.persistence.NoResultException 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 
    ... 10 more 

走到尽头,看一步一个调试器中的步骤的图像和失败

失败CODE的时刻:

// ClassB.java 

import javax.persistence.NoResultException; // NOTICE THE IMPORT 

public ClassB{ 
    private UserInfo user; 
    private WebServiceBDelegate port; 
    private Connection conn; 

    public ClassB (UserInfo user, Connection conn) throws Exception { 
     System.out.println("CLASS B CONSTRUCTOR"); 
     this.user = user; 
     this.conn = conn; 
     this.port = new WebServiceBService().getForwardingPort(); 
    } 

    public boolean methodB(List<String> list){ 
     try{ 
      // Check some stuff on database using this.conn 
     } catch(NoResultException nre){   // NOTICE THE CATCH 
      String something = getSomething(); 
     } 
     // Get the values to invoke SOAP service using this.conn 
     status = port.operationB(values); 
     if(status > 0) 
      return true; 
     return false; 
    } 
} 

WORKING CODE:

// ClassB.java 

public ClassB{ 
    private UserInfo user; 
    private WebServiceBDelegate port; 
    private Connection conn; 

    public ClassB (UserInfo user, Connection conn) throws Exception { 
     System.out.println("CLASS B CONSTRUCTOR"); 
     this.user = user; 
     this.conn = conn; 
     this.port = new WebServiceBService().getForwardingPort(); 
    } 

    public boolean methodB(List<String> list){ 
     try{ 
      // Check some stuff on database using this.conn 
     } catch(Exception e){   // THIS IS THE CHANGED CATCH 
      String something = getSomething(); 
     } 
     // Get the values to invoke SOAP service using this.conn 
     status = port.operationB(values); 
     if(status > 0) 
      return true; 
     return false; 
    } 
} 

下面是调试器一步一步图片进入类的构造函数时,在JVM默认的ClassLoader的那一刻失败:

STEP INTO when calling new ClassB gets me to loadClassInternal(String) STEP INTO when calling new ClassB gets me to loadClassInternal(String)

STEP INTO loadClassInternal(String), gets me to loadClass(String,boolean) STEP INTO loadClassInternal(String), gets me to loadClass(String,boolean)

STEP INTO loadClass(String,boolean), as far as I can get, now STEP RETURN STEP INTO loadClass(String,boolean), as far as I can get, now STEP RETURN

STEP RETURN gets me to loadClass(StringSTEP RETURN gets me to loadClass(String)

STEP OVER gets me to loadClassInternal(String) STEP OVER gets me to loadClassInternal(String)

STEP OVER gives me javax.persistence.NoResultException STEP OVER gives me javax.persistence.NoResultException

STEP OVER把我带回到甲终于在我的代码,并结束EXECUTION

+0

可能重复http://stackoverflow.com/questions/2613113/javax-persistence-noresultexception-getsingleresult-did-not-retrieve-any-enti – amicngh 2012-07-31 10:59:38

+0

这不是重复的,一个人的交易,不同之处是抛出,这似乎是关于类加载/类路径问题。 – 2012-07-31 11:01:05

回答

2
  1. 该类在首次访问时加载到ClassLoader中。代码中的第一个'new'语句将类加载到ClassLoader中,随后检查它是否实际上可以访问类的所有依赖关系(即NoResultException)。
  2. 您没有清楚说明ClassLoader引发了什么,但是我的猜测是它引发了一个ClassNotFoundException异常,详细说明NoResultException不在您的类路径中,因此无法加载。这也是为什么当你删除违规导入和捕获时它的工作原理。
+0

我觉得你已经明白了,它随后检查它是否实际上可以访问你的类的所有依赖关系,尽管它只会在需要时检查依赖关系。让我查看究竟是什么引发的异常,我只是认为它是从图片6'javax.persistence.NoResultException' – hectorg87 2012-07-31 11:05:23

+0

谢谢!就是这样!我必须赶上Throwable才能检查异常情况,并花了我一段时间才意识到这一点。它没有捕捉到异常。我更新了我的问题以显示StackTrace – hectorg87 2012-07-31 12:50:53

相关问题