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


package com.bruceeckel.simple;
public class Vector {
public Vector(){
System.out.println("com.bruceeckel.util.Vector");
}
public static void main (String[] args) {
Vector vector = new Vector();
}
}


> 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