以简单而经典的 “HelloWorld.java” 为例

不含包层次的HelloWorld.Java

  public class HelloWorld

{

public static void main(String[] args)

{

System.out.println("Hello World!");

}

}

  保存在E:\java\src下,命令行下,改变当前路径到:E:\java\src,使用javac命令编译:

  E:\java\src>javac HelloWorld.java

  运行:

  E:\java\src>JavaHelloWorld

  屏幕打印出:

  Hello World!

  初学者常犯的错误

  1. 运行时,带了.class后缀

  如果你试图使用如下命令:

  E:\java\src>java HelloWorld.class

   系统会误认为你运行的是HelloWorld包下的名为class的类文件,会到系统的CLASSPATH下(一般都包括当前目录)企图寻找 HelloWorld.class.class这样的类,这样的类当然不存在了;并且也不可能存在,因为class是关键字,不能作为一个类的名字。所以 会报如下错误信息:

  Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld/class

  2. 文件名大小写错误

  对于像Windows这样的系统,编译时可以不关心大小写。比如编译HelloWorld.java时,也可以使用:

  E:\java\src>javac helloworld.java

  也可以编译通过,但产生的类文件仍然是和源文件相符的:HelloWorld.class。

  但在运行时一定要注意大小写,比如试图使用如下命令运行:

  E:\java\src>java helloworld

  将报类似于1中的错误:

  Exception in thread "main" java.lang.NoClassDefFoundError: helloworld (wrong name: HelloWorld)

  包含包层次的HelloWorld.java

  比如上面的HelloWorld.java修改如下:

   package org.javaresearch;

public class HelloWorld

{

public static void main(String[] args)

{

System.out.println("Hello World!");

}

}

  编译时有两种方法

  1. 直接编译

  E:\java\src>javac HelloWorld.java

  此时在当前目录下输出HelloWorld.class。此时,运行不能使用上面相同的方法,使用:

  E:\java\src>java HelloWorld

  运行时,出现如下错误:

  Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: org/javaresearch/HelloWorld)

   从上述错误信息你也可以看到,系统可以找到HelloWorld类(因为当前路径包含在CLASSPATH中,具体为什么会提示wrong name,有兴趣的朋友参见Java语言规范),但这个类属于org.javaresearch包。所以,你要做的就是按照上述包层次,相应的创建目录层 次,把上面生成的HelloWorld.class放到E:\java\src\org\javaresearch\目录下。运行(这时候是在包层次的最高层目录下运行的):

  E:\java\src >java org.javaresearch.HelloWorld

  系统打印出:

  Hello World!

  这儿要注意的是,不能使用java org\javaresearch\HelloWorld来运行,此时同样会出现如下错误:

  Exception in thread "main" java.lang.NoClassDefFoundErrorrg\javaresearch\HelloWorld (wrong name: org/javaresearch/HelloWorld)

  因为类名的书写是用句点来分割包名的层次的,引用java类库里面的类也可以这样写:java.util.List  类的全名就是这样的,我们如果在 import 语句里写上 import java.util.List;

那么,就不用写全名了,直接写 List list = new ...;java 编译器就可以知道是 List 什么类.但是,由于,java.util 这个包 和 java.sql 这个包都有一个 Date 类,所以,如果 同时导入这两个包,那么会

导致java 编译器不知道引用那个类,有两种解决办法:

a. 用全名来引用类:java.util.Date date1 = ...;java.sql.Date date2 = ...;

b. 不要导入整个包,只导入所需要的类,如果你同时需要这两个 Date 类,那么只能写全名了,如果

你不是同时需要这两个类,你可以只导入需要的包:

比如:import java.util.List; import java.sql.Date;这样就不会冲突,因为编译器可以十分清楚的区分

这个 Date 类是 java.sql 包中的, java.util 包中的 Date 类根本就没有导入进来。

这一点,可以按照常理来理解,还是比较好理解的。

  2. 使用 -d <directory>编译选项

  是不是觉得上面的编译方法有点麻烦,能不能自动在当前路径(或任意指定的路径)下生成包层次呢?有!使用-d <directory>编译选项就能做到。

  E:\java\src >javac


(其中的点表示当前目录。d 和 . 之间有空格, .和后面的java文件名之间也有空格)

  此时,在当前目录下就生成了一个org\javaresearch目录,并且输出的.class文件也在里面。运行:

  E:\java\src >java org.javaresearch.HelloWorld

  系统打印:Hello World!

  如果你想把生成的类文件集中存放在一个目录中,比如:E:\java\classes下,那么你首先创建这个目录,然后编译时:

  E:\java\src >javac -d E:\java\classes HelloWorld.java

   就可以把生成的类文件放到E:\java\classes目录下,并且按照包层次相应的创建目录路径。你可以在E:\java\classes\org \ javaresearch下找到HelloWorld.class文件。此时使用如下命令可以正确运行(注意如果要用到其它类,请在CLASSPATH中 设好):

  E:\java\classes >java org.javaresearch.HelloWorld

java java.lang.NoClassDefFoundError 的解决办法的更多相关文章

  1. eclipse android 不会自动生成R.java文件和包的解决办法

    eclipse下编写android程序突然不会自动生成R.java文件和包的解决办法   我的eclipse原来是好好的,什么问题都没有的,结果今天一打开新建一个android程序,发现工程里不会自动 ...

  2. java 无法找到main类解决办法

    java   无法找到main类解决办法 如果Java类有包名,你必须建相应的包文件夹并把文件编译或拷贝到到相应的文件夹下: 如下: 1.源文件文件:          E:\test\src\tes ...

  3. JAVA联调接口跨域解决办法

    JAVA联调接口跨域解决办法 第一种代码: HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,HttpStatus. ...

  4. Eclipse 在启动发生错误异常:An internal error occurred during: "Initializing Java Tooling". java.lang.NullPointerException的解决办法

    异常现象: 打开Eclipse,出现 An internal error occurred during: "Initializing Java Tooling". java.la ...

  5. Android ADT插件更新后程序运行时抛出java.lang.VerifyError异常解决办法

    当我把Eclipse中的 Android ADT插件从21.1.0更新到22.0.1之后,安装后运行程序抛出java.lang.VerifyError异常. 经过调查,终于找到了一个有效的解决办法: ...

  6. (转)Android工程出现 java.lang.NoClassDefFoundError错误解决方法

    在Eclipse中,导入Android工程,工程没有报错,运行时,出现 java.lang.NoClassDefFoundError类没有找到的错误.从问题上可以看出是导入包出错的原因.遂百度加谷歌. ...

  7. 基于Web的Kafka管理器工具之Kafka-manager启动时出现Exception in thread "main" java.lang.UnsupportedClassVersionError错误解决办法(图文详解)

    不多说,直接上干货! 前期博客 基于Web的Kafka管理器工具之Kafka-manager的编译部署详细安装 (支持kafka0.8.0.9和0.10以后版本)(图文详解)   问题详情 我在Kaf ...

  8. Eclipse下执行main函数报java.lang.NoClassDefFoundError的解决

    今天执行eclipse下的一个java类,无论run还是debug,都报java.lang.NoClassDefFoundError.而且把main中函数都注释掉,执行还是报一样的错. 检查了一下这个 ...

  9. java.lang.NoClassDefFoundError 错误解决思路

    Process: com.oppo.reader, PID: 20472 java.lang.NoClassDefFoundError: com.zhangyue.iReader.PDF2.ui.PD ...

随机推荐

  1. Minimum Depth of Binary Tree [LeetCode]

    Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shor ...

  2. zend create project prepare

    1.php ini 安装pear 设置include_path 2.apache AllowOverride LoadModule rerwite去掉注释 <VirtualHost *:> ...

  3. jquery工具类函数

    1,获取浏览器的名称与版本信息 在jquery中,通过$.browser对象可以获取浏览器的名称和版本信息,如$.browser.chrome为true,表示当前为chrome浏览器,$.broese ...

  4. 1. Two Sum I & II & III

    1. Given an array of integers, return indices of the two numbers such that they add up to a specific ...

  5. ios中属性和对象的初始化

    属性和对象的初始化为了方便记忆, 我们可以都使用self.来初始化. 这样可以避免内存的过度释放.

  6. scalac 学习

    val logEnable = false def log(msg: => String) = if (logEnable) println(msg) val MSG = "progr ...

  7. 如何更换centos6源

    1.wget http://mirrors.163.com/.help/CentOS6-Base-163.repo 2.根据教程:http://mirrors.163.com/.help/centos ...

  8. PHP干货技巧文,一些PHP性能的优化

    PHP优化对于PHP的优化主要是对php.ini中的相关主要参数进行合理调整和设置,以下我们就来看看php.ini中的一些对性能影响较大的参数应该如何设置. # vi /etc/php.ini (1) ...

  9. Nuget包之间的依赖

    为什么我们使用依赖呢??原因是某些资源是基于某些资源的基础上才可以运行的,比如bootstrap基于Jquery,EntityFramework.zh-Hans基于EntityFramework,如果 ...

  10. Spring整合Ehcache管理缓存(转)

    目录 前言 概述 安装 Ehcache的使用 HelloWorld范例 Ehcache基本操作 创建CacheManager 添加缓存 删除缓存 实现基本缓存操作 缓存配置 xml方式 API方式 S ...