以简单而经典的 “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. svn设置外网访问

    1.设置路由器 默认协议为:https 端口号:443 服务器地址:https://主机名/svn/版本库 例:https://mleo-pc/svn/Share/ 也可就主机名用IP地址代替 如:h ...

  2. Stack与Queue

    一.Stack的方法 1. public void push(int node)  把项 压入栈顶.其作用与 addElement (node) 相同.   不一定是int,可以是节点 stack.p ...

  3. Fibonacci(斐波那契数列)的最佳实践方式(JavaScript)

    1)低级版本 var fibonacci = function(n) { if (n == 0 || n == 1) { return n; } else { return fibonacci(n - ...

  4. 遇到bug怎么办

    最近第一个完整的项目的第一期快完成了.期间,我怀疑过无数次人生,给难兄难弟辣椒相互吐槽过.被我师父点播后觉得人和人差距怎么可以这么大数次. 终于!基本功能实现了. 今天不总结具体问题了,说一下调试过程 ...

  5. MVC5+EF6 入门完整教程四

    上篇文章主要讲了如何配置EF, 我们回顾下主要过程: 创建Data Model à 创建Database Context à创建databaseInitializerà配置entityFramewor ...

  6. 程设大作业xjb写——魔方复原

    鸽了那么久总算期中过[爆]去[炸]了...该是时候写写大作业了 [总不能丢给他们不会写的来做吧 一.三阶魔方的几个基本定义 ↑就像这样,可以定义面的称呼:上U下D左L右R前F后B UD之间的叫E,LR ...

  7. 用Object字面量来代替swtich/if...else

    很多时候,if...else...有很多判断分支选项,就会见到: if (animal === 'dog') { // TO DO 'dog' } else if (animal === 'cat') ...

  8. 深入理解iOS开发中的BitCode功能

    前言 做iOS开发的朋友们都知道,目前最新的Xcode7,新建项目默认就打开了bitcode设置.而且大部分开发者都被这个突如其来的bitcode功能给坑过导致项目编译失败,而这些因为bitcode而 ...

  9. 【PCB】【项目记录】AWG任意波形产生器

    ———————————————————————————————————————————————————————————————————— 原理图V1.0 01.top 已完成原理图绘制,但有相当错误, ...

  10. iOS检测版本更新

    有时候为了需求,我们需要检测app版本更新今天在这里整合下 //获取当前版本号 NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDi ...