当前位置: 技术问答>java相关
请教一个小问题!请解答,谢谢!
来源: 互联网 发布时间:2015-01-24
本文导语: 在win2K中,已安装jdk1.2.2于c盘下,设置路径如下:path=c:jdk1.2.2bin classpath=.;%classpath%;d:test_java 其中d:test_java是工作目录, 在d:test_java下有package1和package2目录,在package1目录下有MyClass1类,其中MyClass1类如下: package package...
在win2K中,已安装jdk1.2.2于c盘下,设置路径如下:path=c:jdk1.2.2bin
classpath=.;%classpath%;d:test_java 其中d:test_java是工作目录,
在d:test_java下有package1和package2目录,在package1目录下有MyClass1类,其中MyClass1类如下:
package package1;
public class MyClass1 {
private int counts;
public MyClass1()
{
setcounts(0);
}
public MyClass1(int i)
{
setcounts(i);
}
protected void setcounts(int i)
{
counts=i;
}
public int getcounts()
{
return counts;
}
public static void main(String[] args){
MyClass1 c1=new MyClass1(9);
System.out.println("counts="+c1.counts);
}
}
在d:test_javapackage1下编译通过,但是执行时出现问题如下:
Exception in thread "main" java.lang.NoClassDefFoundError: MyClass1 (wrong name:package1/MyClass1)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:477)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:10
9)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:249)
at java.net.URLClassLoader.access$1(URLClassLoader.java:217)
at java.net.URLClassLoader$1.run(URLClassLoader.java:198)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:192)
at java.lang.ClassLoader.loadClass(ClassLoader.java:298)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:285)
at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:314)
但是把package package1;注释了就不出错了!
why?
classpath=.;%classpath%;d:test_java 其中d:test_java是工作目录,
在d:test_java下有package1和package2目录,在package1目录下有MyClass1类,其中MyClass1类如下:
package package1;
public class MyClass1 {
private int counts;
public MyClass1()
{
setcounts(0);
}
public MyClass1(int i)
{
setcounts(i);
}
protected void setcounts(int i)
{
counts=i;
}
public int getcounts()
{
return counts;
}
public static void main(String[] args){
MyClass1 c1=new MyClass1(9);
System.out.println("counts="+c1.counts);
}
}
在d:test_javapackage1下编译通过,但是执行时出现问题如下:
Exception in thread "main" java.lang.NoClassDefFoundError: MyClass1 (wrong name:package1/MyClass1)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:477)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:10
9)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:249)
at java.net.URLClassLoader.access$1(URLClassLoader.java:217)
at java.net.URLClassLoader$1.run(URLClassLoader.java:198)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:192)
at java.lang.ClassLoader.loadClass(ClassLoader.java:298)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:285)
at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:314)
但是把package package1;注释了就不出错了!
why?
|
$
第二:为什么一定要用java package1.MyClass1,而不能用java MyClass1?
$
这就是固定的用法,根据我的理解,在你运行java package1.MyClass1时,“package1.MyClass1”是你所运行的类的完整包名,他会和你写在MyClass1.java中的"package package1;"作比较,如果不同,就会Exception in thread "main" java.lang.NoClassDefFoundError: MyClass1 (wrong name:
package1/MyClass1)!
第二:为什么一定要用java package1.MyClass1,而不能用java MyClass1?
$
这就是固定的用法,根据我的理解,在你运行java package1.MyClass1时,“package1.MyClass1”是你所运行的类的完整包名,他会和你写在MyClass1.java中的"package package1;"作比较,如果不同,就会Exception in thread "main" java.lang.NoClassDefFoundError: MyClass1 (wrong name:
package1/MyClass1)!
|
你編譯生成的MyClass1.class文件
是不是不在d:test_javapackage1下
而在d:test_java下?
是不是不在d:test_javapackage1下
而在d:test_java下?
|
还有一个问题大家注意没有,那就是使用package语句将类文件打包是直接用javac classname.java时并没有生成相应的目录结构,例如你在d:test_java下有MyClass1.java,而在该类中有package package1;
当你在d:test_java下使用javac MyClass1.java 时并没有自动生成目录d:test_javapackage1,而是将MyClass1.class直接生成在d:test_java下了,而当你使用
javac -d . MyClass1.java 时自动生成了package1目录,并将生成的类文件放在了该目录下。
当你在d:test_java下使用javac MyClass1.java 时并没有自动生成目录d:test_javapackage1,而是将MyClass1.class直接生成在d:test_java下了,而当你使用
javac -d . MyClass1.java 时自动生成了package1目录,并将生成的类文件放在了该目录下。
|
archeror,我看你已经被盘得有点糊涂了 :(
其实在d:test_java下执行java package1.MyClass1是对的,而在d:test_javapackage1下执行java package1.MyClass1是不对的,执行java MyClass1也是不对的,这样应该清楚点了。
其实在d:test_java下执行java package1.MyClass1是对的,而在d:test_javapackage1下执行java package1.MyClass1是不对的,执行java MyClass1也是不对的,这样应该清楚点了。
|
package package1;
一般是用來其它的java程序調用該程序用到的呀
一般是用來其它的java程序調用該程序用到的呀
|
在d:test_java下輸入:
java package1.MyClass1
就行了呀,你把包的概念還沒有理解清楚呀
java package1.MyClass1
就行了呀,你把包的概念還沒有理解清楚呀
|
在d:test_javapackage1下编译通过?是否应在d:test_java下编译
|
在java 编程思想中有详细的说法,以上的朋友用的
java package1.MyClass1 方法是对的。·!
java package1.MyClass1 方法是对的。·!
|
to:提问者
你应该看看是不是在你的d:test_javapackage1下面还有一个叫package1的目录,我没看明白你的目录层次关系。其实,在.class所在的目录下执行java MyClass1是不回有问题的。
你应该看看是不是在你的d:test_javapackage1下面还有一个叫package1的目录,我没看明白你的目录层次关系。其实,在.class所在的目录下执行java MyClass1是不回有问题的。
|
d:test_java>javac -d Myclass1.java
d:test_java>java package1.Myclass1
d:test_java>java package1.Myclass1
|
up
|
重建一個整齊的環境