Topic: 关于package 的使用疑问! |
Print this page |
1.关于package 的使用疑问! | Copy to clipboard |
Posted by: cocoa911 Posted on: 2005-08-05 09:11 谢谢,最近在学习 ,《java编程思想》过程中碰到 有关 package语句问题,希望各位给予答复,状况如下: package com.bruceeckel.simple; public class Vector { public Vector(){ System.out.println("com.bruceeckel.util.Vector"); } } 保存并命名为 Vector.java 启动命令提示符,显示如下: Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp. C:\Documents and Settings\Bluewater>cd\jt C:\jt>javac Vector.java C:\jt>java Vector Exception in thread "main" java.lang.NoClassDefFoundError: Vector (wrong name: c om/bruceeckel/simple/Vector) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:620) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12 4) at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) at java.net.URLClassLoader.access$100(URLClassLoader.java:56) at java.net.URLClassLoader$1.run(URLClassLoader.java:195) 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:268) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) 我的CLASSPATH=.;D:\jdk1.5.0\lib;C:\jt PATH=.;D:\jdk1.5.0\bin; 而且在我又建立了一个名为 C:\jt\com\bruceeckel\simple的路径,但是还是有如上错误, 我的疑问就是如何处理该故障,谢谢各位指教。 |
2.Re:关于package 的使用疑问! [Re: cocoa911] | Copy to clipboard |
Posted by: why Posted on: 2005-08-05 13:11 1. you need to add a main method for the class 2. javac -d . Vector.java java -cp . com.bruceeckel.simple.Vector |
3.Re:关于package 的使用疑问! [Re: why] | Copy to clipboard |
Posted by: cocoa911 Posted on: 2005-08-05 16:49 我还是不明白 您的意思啊!~ 谢谢了,您还是用中文吧! |
4.Re:关于package 的使用疑问! [Re: cocoa911] | Copy to clipboard |
Posted by: why Posted on: 2005-08-05 18:33
> javac -d . Vector.java > java -cp . com.bruceeckel.simple.Vector |
5.Re:关于package 的使用疑问! [Re: cocoa911] | Copy to clipboard |
Posted by: javalean Posted on: 2005-08-05 19:45 看一下我的这篇乱七八糟的文章吧。 java中包(package)的使用为名字空间的管理提供了方便,可以利用java中包技术来创建自己的类库,从而实现代码的复用。但是对于一名java初学者来说,如何创建自己的第一个包,和如何使用自己的第一个包,似乎还是一件不太容易的事情。笔者作为一名从c++转向java的程序语言学习者,在这篇文章了谈了一下自己的体会。 关于包的知识和包的命名方法请参考《java编程思考》或者其它的java基础书。 下面的代码创建了一个tools包(当然你也可以说它是com.bruceeckel.tools包): //下面的代码来自《java编程思考》中文版第三版第129页 package com.bruceeckel.tools;//创建一个tools包 public class P{ public static void rint(String s){ System.out.print( s ); } public static void rintln(String s){ System.out.println( s ); } }//程序结束 写完代码后,第一个问题来了,这段代码应该保存在哪里?随便放?当然不是。这个文本(因为我们还没有编译它)的保存位置应该是classpath位置开始的com.bruceeckel.tools的目录下。关于classpath的设置,我在《java环境变量的设置》中已经有了介绍。可以看到这个文本是个.java文件,然后编译它,如果你想运行它,这时是会出错的,因为它没有main()函数。你可以这样理解,它只是一个功能单元,是为别的文件提供服务的。 我想这个时候你已经看完了我的《java环境变量的设置》,但是我想你仍然会感到迷茫,因为你设置好后,编译这个程序,居然(呵呵,应该是理所当然)出错了。问题出在哪了呢?答案是classpath的设置不对。我想这个时候你的手上已经抓了一个烂西红柿。先别扔,听我说完。按照我在前面的介绍(其实这也是n多的java入门教程里面讲的),classpath的值为 .;d:\j2se\lib\dt.jar;d:\j2se\lib\tools.jar 而在这个时候所有的作者(包括我)都认为你不会用类库的。当然类库是个好东西,你应该拥有自己的良好的类库。 在上面的classpath值中,dt.jar和tools.jar中存放的是java的标准类库,当然我们要创建自己的类库,得另外设置classpath,下面以我的机器为例子,结合上面的代码段来讲。 首先将classpath的值改为 .;d:\j2se\lib\dt.jar;d:\j2se\lib\tools.jar;d:\j2se\lib 因为我想把自己的类库建在d:\j2se\lib的子目录中。所以,上面的P.java文件的存放路径是d:\j2se\lib\com\bruceekel\tools 然后编译,这次不会出错了。呵呵。 我曾经看了一些java的初级教材讲到这些问题时,作者常用的话是“在我的机器上”。这是一句让人费解的话,也容易成为推却责任的借口。下面我再举一个例子,假设你的jdk安装的目录是c:\jdk1.2,你创建的包名是com.joelean.toolslibrary,那么你的classpath可相应改成 .;c:\jdk1.2\lib\dt.jar;c:\jdk1.2\lib\tools.jar;c:\jdk1.2\lib 这时候的你的类库将存放在c:\jdk1.2\lib目录下,以后你想增加新的类库,只需要在这个目录下创建你的包就可以,不需要再修改classpath。 下面的代码检验刚才创建的包是不是可以使用。 import com.bruceeckel.tools.*;//import你需要的文件 public class ToolTest{ public static void main(String [] args){ P.rint("This is 1st line."); P.rint("This is 1st line."); P.rintln("This is 1st line too."); P.rintln("This is the 2nd line."); } }//程序结束 程序运行结果为 This is 1st line.This is 1st line.This is 1st line too. This is the 2nd line. |
6.Re:关于package 的使用疑问! [Re: cocoa911] | Copy to clipboard |
Posted by: cocoa911 Posted on: 2005-08-05 22:59 首先对javalean 和why两为前辈表示感谢。 下面对此问题进行如下总结: (1.)我重新设置了环境 具体设置 PATH=.;c\java\bin CLASSpath=.;c:\java\lib;c:\jt /*c:\jt 文件夹是我学习JAVA编程存放CLASS之用,这里只是一个代号*/ 而且在c:\jt下又建立路径名为c:\jt\com\bruceeckel\simple (2.)本人习惯在C:\jt中编写并运行程序,首先生成 Vector.class & List.class,然后将以上两个CLASS剪切,并粘贴到c:\jt\com\bruceeckel\simple中,然后再回到 c:\jt 删除 Vector.java & List.java 两个JAVA文件。 (3.)在(2.)基础上 javac LibTest.java,并且java LibTest ,二者皆通过. 下面附上代码: //:Vector.java package com.bruceeckel.simple; public class Vector{ public Vector() { System.out.println("com.bruceeckel.util.Vector"); } } ///:~ ------------------------------------------------------------------------------------------------- //:List.java package com.bruceeckel.simple; //class List(){ public class List{ public List() { System.out.println("com.bruceeckel.util.List"); } }///::~ ------------------------------------------------------------------------------------------------- //:LibTest.java import com.bruceeckel.simple.*; public class LibTest{ public static void main(String[] args) { Vector v = new Vector(); List l = new List(); } }///::~~ ------------------------------------------------------------------------------------------------- Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp. C:\Documents and Settings\Bluewater>cd\jt C:\jt>javac LibTest.java C:\jt>java LibTest com.bruceeckle.util.Vector com.bruceeckle.util.list C:\jt> 证明可行,以上代码来自 《JAVA编程思想 2nd Edition》第175页~~176页 要记忆的事项: 1)。要确保c:\jt 中没有 类库的.JAVA文件。 2)。要确保c:\jt\com\bruceeckel\simple中有已编译的.class文件 作者意愿:希望能有更多的人看到此帖,尽量避免初学者走弯路,加快学习进度。 我们一起努力为祖国的IT业多贡献力量。 |
7.Re:关于package 的使用疑问! [Re: cocoa911] | Copy to clipboard |
Posted by: why Posted on: 2005-08-05 23:45 1. I have corrected the line package class List(){ to package com.bruceeckel.simple; //class List(){ 2. > PATH=.;c\java\bin . is unnecessary > CLASSpath=.;c:\java\lib;c:\jt c:\java\lib is not necessary for newer JDK 3. > c:\jt 删除 Vector.java & List.java 两个JAVA文件 > 1)。要确保c:\jt 中没有 类库的.JAVA文件。 It is troublesome to do so I always use an IDE and put the java source files in a separate folder. Well, one could put Vector.java and List.java under .\com\bruceeckel\simple\ then >javac .\com\bruceeckel\simple\Vector.java >javac .\com\bruceeckel\simple\List.java >javac LibTest.java 4. //:LibTest.java import com.bruceeckel.simple.*; |
8.Re:关于package 的使用疑问! [Re: cocoa911] | Copy to clipboard |
Posted by: cocoa911 Posted on: 2005-08-06 07:51 哦,果然有很多错误,对不起啦 |
9.Re:关于package 的使用疑问! [Re: cocoa911] | Copy to clipboard |
Posted by: xiaoqiang806 Posted on: 2005-08-07 19:30 应该与包没什么关系吧! 主要是在定义的类中没有主函数main 所以不能用java直接运行的 |
10.Re:关于package 的使用疑问! [Re: cocoa911] | Copy to clipboard |
Posted by: javalean Posted on: 2005-08-08 12:22 回楼上的话,包中的一些.java文件中是可以不包含main()方法的。 这些.java文件可以编译成功,但是不可以运行,但是它们却为别的.java文件提供了支持。 |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |