DefFoundError与ClassNotFoundException的区别

相同点: 
1、NoClassDefFoundError和ClassNotFoundException都是类运行时出错。 

2、都和classpath有关。 

不同点: 
1、ClassNotFoundException继承java.lang.Exception,是一种受检异常(checked exception),需要显式地使用try/catch来进行处理。通常需要确保需要的类已经在classpath上了。 

-------------------------------- 
而NoClassDefFoundError继承java.lang.LinkageError,是一种错误(Error)。 

2、ClassNotFoundException发生在类加载器在classpath上找不到相关类的时候,通常会使用Class.forName()或ClassLoader.loadClass()或ClassLoader.findSystemClass()。 

有时我们会主观地认为类已经在classpath上了,但其实不是,例如jar包中的manifest文件的优先级比当前classpath或-cp选项指定的classpath的优先级都要高,就有可能发生ClassNotFoundException。 

还有一种也会发生ClassNotFoundException的场景就是使用两个类加载器,一个类加载器尝试着访问已经被另一个类加载器加载的类也会导致ClassNotFoundException。 

-------------------------------- 
而NoClassDefFoundError相对来说更难诊断出原因。 

有时会发生在运行期依赖的类变更了或被删除了,例如下面这个例子,Test类中依赖Test1类,在编译时Test1存在, 
 
编译成功后,删除Test1.class文件,再运行Test类时,就会报错: 
Exception in thread "main" java.lang.NoClassDefFoundError: Test 
        at Test1.main(Test1.java:5) 
Caused by: java.lang.ClassNotFoundException: Test 
        at java.net.URLClassLoader$1.run(Unknown Source) 
        at java.net.URLClassLoader$1.run(Unknown Source) 
        at java.security.AccessController.doPrivileged(Native Method) 
        at java.net.URLClassLoader.findClass(Unknown Source) 
        at java.lang.ClassLoader.loadClass(Unknown Source) 
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
        at java.lang.ClassLoader.loadClass(Unknown Source) 
        ... 1 more 

NoClassDefFoundError还可能发生在类的静态代码块中抛出了异常,例如: 

配置文件中没有PROM_REDIS_MAXACTIVE项,是null,导致类的静态代码块出错,从而引起NoClassDefFoundError: 
java.lang.NoClassDefFoundError: com.jag.StringSingleCacheClient (initialization failure) 

at java.lang.J9VMInternals.initialize(J9VMInternals.java:140) 


转自:http://jag522.iteye.com/blog/2119369

ClassNotFoundException:

01-13

问题描述:rn昨天下午开始复习javaweb时候 准备重温一遍LoginServlet 遇到了一个之前没遇到的问题rn点击登陆按钮后 提示错误500rnrnMyeclipse 错误信息如下:rnrn严重: Allocate exception for servlet Loginrnjava.lang.ClassNotFoundException: com.servlet.Loginrn at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285)rn at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)rn at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:520)rn at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:501)rn at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:118)rn at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1050)rn at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:779)rn at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:133)rn at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)rn at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)rn at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)rn at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)rn at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)rn at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)rn at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)rn at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783)rn at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)rn at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:789)rn at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1437)rn at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)rn at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)rn at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)rn at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)rn at java.lang.Thread.run(Thread.java:745)rn rnrn 问题已经解决 根源是class没有立刻生成 XML文件配置正确 但是class在servlet创建后没有生成rn 解决方法 在Myeclipse 界面的 projecet 选项里面的 Build Automatically 打上对勾即可rn rn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭