关于NoClassDefFoundError

 

之前一直用Eclipse写程序,运行,没有出什么问题。今天突然想再试一下用cmd编译运行程序。可是发现javac的时候还好,java的时候总是显示错误如下:

E:\Study\Java>java TestScanner
Exception in thread "main" java.lang.NoClassDefFoundError: TestScanner
Caused by: java.lang.ClassNotFoundException: TestScanner
        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)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)

关键是那个Unknown Source,我查了一下,说是数据库没连接上。这就很奇怪,以前用命令行的时候没有出现过这种问题,而且我也没改环境变量什么的。我搜呀搜呀,终于发现了一篇文章!!!!!!

原文参见http://hi.baidu.com/liusha0007/blog/item/362be58106dbb5dfbd3e1e0a.html

原来是路径Path的问题。

因为最近我安装了许多程序,所以导致%JAVA_HOME%\bin;排在了中间,可能前面的d:\Program Files\MATLAB\R2010b\bin;影响?

(百度知道:path(环境变量)是dos以前的内部命令,windows继续沿用至今。用作运行某个命令的时候,本地查找不到某个命令或文件,会到这个声明的目录中去查找。一般设定java的时候为了在任何目录下都可以运行bin文件夹下的命令。就将java的bin目录声明到path中。
在dos下运行path命令就可以设定或查看。在windows中要在系统设置中设定。)

然后我就把%JAVA_HOME%\bin;移到PATH的开头,终于!!!!——

E:\Study\Java>java TestScanner
Exception in thread "main" java.lang.NoClassDefFoundError: TestScanner
Caused by: java.lang.ClassNotFoundException: TestScanner
        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:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

 

……………………………………

我哭了。

source找到了,可是类文件还是找不到。

检查来检查去,这个Class文件就在当前目录下,文件名也没错的啊,为什么找不到?(虽然这个类文件不在ClassPath中,但是似乎在当前目录下就可以被找到啊,以前试过,没问题啊啊啊啊啊)

再搜……

终于找到,有神人指出,在classpath最前面加个 .; 

追随着圣人的指点,我终于成功地运行了!流下激动的泪水……

---------------------------------------------------------------------------------------------------

原来,.; 代表当前目录。“如果我们在系统环境变量中设置了CLASSPATH的话,在命令行中通过java运行的时候如果再不指定CLASSPATH参数,那么就会导致java虚拟机只是按照CLASSPATH环境变量中的目录搜索类,而不在你的当前目录下搜索类。”(原文参见http://blog.sina.com.cn/s/blog_5198c7370100cxsk.html

这点我还是不确定,因为我之前的经验是不加.; ,也还会是在当前目录下搜索类的。而且我在书上似乎看过类似的话(支持我的观点)。不知道为什么突然不管用了。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值