首页编程java编程java 类名为什么运行不了,java中能生成.class文件可是运行不了

java 类名为什么运行不了,java中能生成.class文件可是运行不了

编程之家2023-10-1385次浏览

其实java 类名为什么运行不了的问题并不复杂,但是又很多的朋友都不太了解java中能生成.class文件可是运行不了,因此呢,今天小编就来为大家分享java 类名为什么运行不了的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

java 类名为什么运行不了,java中能生成.class文件可是运行不了

java程序添上包就不能运行了,为什么

将生成的class文件放到文件夹wo下面

然后使用java wo/Helloword解释运行。。

下面是我在网络上看到的一篇文章,感觉不错!贴上来给你!

java 类名为什么运行不了,java中能生成.class文件可是运行不了

1,什么都别说,先跟着我来做一把

我们先找一个目录,比如C:\myjob

然后我们建立两个目录,一个叫做src,一个叫做bin

java 类名为什么运行不了,java中能生成.class文件可是运行不了

C:\myjob>md src

C:\myjob>md bin

C:\myjob>dir

驱动器 C中的卷是 LIGHTNING

卷的序列号是 3DD1-83D9

C:\myjob的目录

2005-12-25 14:33<DIR>.

2005-12-25 14:33<DIR>..

2005-12-25 14:34<DIR> src

2005-12-25 14:34<DIR> bin

0个文件 0字节

4个目录 305,123,328可用字节

C:\myjob>

然后我们在src目录中去写程序

C:\myjob>cd src

C:\myjob\src>

我们写这么4个java文件

////A.java

package com.lightning;

public class A{

{System.out.println("com.lightning.A");}

}

////B.java

package com.lightning;

public class B{

{System.out.println("com.lightning.B");}

}

////C.java

package com;

public class C{

{System.out.println("com.C");}

}

////Test.java

package net.test;

import com.lightning.*;

import com.*;

public class Test{

public static void main(String[] args)

{

new A();new B();new C();

System.out.println("net.test.Test");

}

}

写好之后就是这样

C:\myjob\src>dir

驱动器 C中的卷是 LIGHTNING

卷的序列号是 3DD1-83D9

C:\myjob\src的目录

2005-12-25 14:34<DIR>.

2005-12-25 14:34<DIR>..

2005-12-25 14:39 86 A.java

2005-12-25 14:40 86 B.java

2005-12-25 14:42 194 Test.java

2005-12-25 14:43 68 C.java

4个文件 434字节

2个目录 305,106,944可用字节

然后我们建立com目录,com\lightning\目录,net\test\目录

C:\myjob\src>md com

C:\myjob\src>md com\lightning

C:\myjob\src>md net\test\

我们将Test.java放入net\test\中去

将A.java,B.java放入com\lightning\中去

将C.java放入com\中去

C:\myjob\src>move Test.java net\test\

C:\myjob\src>move A.java com\lightning\

C:\myjob\src>move B.java com\lightning\

C:\myjob\src>move C.java com\

然后我们在c:\myjobs中发令:

C:\myjob\src>cd..

C:\myjob>javac-sourcepath src-d bin src\net\test\Test.java

然后我们看看bin目录中多了什么

C:\myjob>dir bin/s

驱动器 C中的卷是 LIGHTNING

卷的序列号是 3DD1-83D9

C:\myjob\bin的目录

2005-12-25 14:34<DIR>.

2005-12-25 14:34<DIR>..

2005-12-25 14:46<DIR> net

2005-12-25 14:46<DIR> com

0个文件 0字节

C:\myjob\bin\net的目录

2005-12-25 14:46<DIR>.

2005-12-25 14:46<DIR>..

2005-12-25 14:46<DIR> test

0个文件 0字节

C:\myjob\bin\net\test的目录

2005-12-25 14:46<DIR>.

2005-12-25 14:46<DIR>..

2005-12-25 14:46 520 Test.class

1个文件 520字节

C:\myjob\bin\com的目录

2005-12-25 14:46<DIR>.

2005-12-25 14:46<DIR>..

2005-12-25 14:46<DIR> lightning

2005-12-25 14:46 338 C.class

1个文件 338字节

C:\myjob\bin\com\lightning的目录

2005-12-25 14:46<DIR>.

2005-12-25 14:46<DIR>..

2005-12-25 14:46 354 A.class

2005-12-25 14:46 354 B.class

2个文件 708字节

所列文件总数:

4个文件 1,566字节

14个目录 305,057,792可用字节

然后我们执行,同样在c:\myjobs\下发令

C:\myjob>java-cp bin net.test.Test

com.lightning.A

com.lightning.B

com.C

net.test.Test

2,从实践到理论

刚才我用一个非常简单但是非常完整的例子给大家演示了java的package机制。

为什么以前脑海里面那么简单的javac会搞得这么复杂呢?

实际上它本就这么复杂,

并不是一个.java,一行javac一个当前目录中的class这么简单。

首先我要打破一些东西,然后才好建立一些东西。

javac并非只是给一个.java编译一个class的。javac自带有make机制,也就是说,如果在

javac的参数中java文件使用到的任何类,javac首先会去找寻这个类的class文件存在与否

,如果不存在,就会在sourcepath中找寻源代码文件来编译。

什么是sourcepath呢?sourcepath是javac的一个参数,如果你不加指定,那么sourcepath

就是classpath。

比如我们装好jdk之后,我说过不要设定classpath环境变量,因为大部分人一旦设定了

classpath,不是多此一举把什么dt.jar放进去。(我可以好好打击你一下,告诉你一个可

悲的事实——jre永远不会从你这个classpath中去寻找dt.jar。你完全是徒劳的!)就是

把"."搞不见了,搞得是冷水一盆盆的往自己身上泼,脑袋一点点的涨大。

不要设!classpath没有你想象中那么普适和强大,它只是命令行的简化替代品。

你不设的话它就是"."。

回到sourcepath,sourcepath指的是你源代码树的存放地点。

为什么是源代码树?而不是一个目录的平板源代码呢?

请大家将原本脑海中C的编译过程完全砸掉!

java完全不同,java没有头文件,每个.java都是要放在源代码树中的。

那么这颗树是怎么组织的呢?

对了,就是package语句。

比如写了package com.lightning;

那么这个.java就必须放在源代码树根\的com\lighting\之下才行。

很多浮躁的初学者被default打包方式宠坏了。自我为中心,以为java就是一套库,自己写

的时候最多import进来就行了,代码从不打包,直接javac,直接java,多么方便。

孰不知自己写的这个.java也不过是java大平台的其中一个小单元而已。如果不打包,

我写一个Point,你写一个Point,甚至更有甚者敢于给自己的类起名叫String等等。

全部都在平板式的目录中,那jre该选哪一个?

一旦要使用package语句,就要使用代码树结构,当然,你要直接javac,也行。

不过javac出来的这个class要放在符合package结构的目录中才能发挥正常作用,否则就是

废物一坨。

而且,如果你这个.java还用到其它自己写的有package语句的.java,那这个方法就回天乏

术了。

按照sun的想象,应该是写好的.java放在符合package结构的目录中,package语句保证了

正确放置,如果目录位置和package语句中指示的不同,则会出错。

所以按照刚才我们的那种package写法,我们必然要将那几个.java文件放入相应的目录中

才能让javac顺利找到他们来make。

有人说javac可不可以像java那样 java aaa.bbb.c...java?

不可以

javac中的那个.java文件参数必须是一个文件系统的路径文件名形式。

然后如果用到其它的.java,javac会根据目前的sourcepath出发寻找目录结构中的那些

java文件。

当然了,既然打了包,在使用的时候。

要么写全名——包名.类名

或者使用import

不得不提的是,import就好比c++的using,它不负责做文件操作,它只是方便你写代码。

另外import语句中的*代表的是类名,不代表包名片断。

你import com.*;

编译器仍然找不到com.lightning中的任何类。

反之亦然。

就好象你告诉编译器,我这里面要用到姓诸葛的人。

那么姓诸的人当然编译器不会认为也包含在内。

所以,如果程序一旦写到一定规模。

就不得不使用ant来管理这些。

或者使用IDE,否则jdk就真的变成了java developer killer。

但是对于初学者,在了解为什么会有ant之类的之前,还是要体会一下使用

jdk的艰辛。

这个和以前在unix上开发的人用gcc命令行到后来使用make之后使用ide

之类的时候的体会是类似的。

最后,javac的-d参数是指示编译出来的class文件放在哪里的,如果你不指定的话,它们

和.java混在一起。当然也符合目录结构。

java 中写出的类为什么编译不报错但是不能运行,代码没错啊

//看楼主问为什么能编译但不能运行,说明楼主应该是Java的初学者吧,Java程序其实编译和运行是两回事,没有必然联系的。刚才你的问题,在下面有注释的,这样就可以运行了,记得把类修改为test.java哦。运行下面

import java.util.*;

//这里不能用car,重新起一个名字,因为和下面的class Car冲突了。

public class test{

private static Scanner input;

public static void main(String args[]){

input= new Scanner(System.in);

System.out.println("请输入车主姓名,车速,方向盘角度");

Car car=new Car(input.next(),input.nextFloat(),input.nextFloat());

System.out.println("车主姓名为:"+car.getOwnerName());

System.out.println("当前车速为:"+car.getCurSpeed());

System.out.println("当前方向盘角度为:"+car.getCurDirInDegree());

System.out.println("修改车速");

System.out.println("新的车速为:");

car.changeSpeed(input.nextFloat());

System.out.println("在调用changeSpeed(80)后,车速为"+car.getCurSpeed());

car.stop();

System.out.println("在调用stop()后,车速为"+car.getCurSpeed());

}

}

class Car{

private String ownerName;//车主姓名

private float curSpeed;//当前车速

private float curDirInDegree;//当前方向盘转向角度

public Car(String ownerName){

this.ownerName=ownerName;

}

public Car(String ownerName, float speed, float dirInDegree){

this(ownerName);

curSpeed=speed;

curDirInDegree=dirInDegree;

}

public String getOwnerName(){//提供对车主姓名的访问

return ownerName;

}

public float getCurDirInDegree(){//提供对当前方向盘转向角度的访问

return curDirInDegree;

}

public float getCurSpeed(){//提供对当前车速的访问

return curSpeed;

}

public void changeSpeed(float curSpeed){//提供改变当前的车速

this.curSpeed=curSpeed;

}

public void stop(){//提供停车

curSpeed= 0;

}

}

Java class文件无法运行。

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

呵呵,这个嘛,就是著名的类路径(classpath)问题啦。实际上,类路径是在编译过程就

涉及的Java中的概念。classpath就是指明去哪里找用到的类,就这么简单。由于我们的

HelloWorld没用到其它的(非java.lang包中的)类,所以编译时没遇到这个问题。运行

时呢,就要指明你的类在哪里了。解决方法嘛,可以用下面的命令运行:

java -classpath .  HelloWorld

“.”就代表当前目录。当然这样做有点麻烦(是“太麻烦”!),我们可以在环境变量

中设置默认的classpath。方法就照上述设置path那样。将classpath设为:

classpath=.;c:\jdk1.2\lib\dt.jar;c:\jdk1.2\lib\tools.jar 后面的两个建议也设上

,以后开发用的着。

java -classpath .  HelloWorld(再不出来我就不学java了)

Exception  in  thread "main"  java.lang.NoSuchMethodError:  main

(//咣当)别,坚持住。看看你的代码,问题出在main方法的定义上,写对地方了吗,

是这样写的吗:

public  static  void  main(String  args[]) { //一个字都不要差,先别问为什么了...

对,包括大小写!

java -classpath .  HelloWorld (听天由命了!)

Hello  World!

(faint!终于...)

欢迎来到Java世界!所以说,无法运行HelloWorld 真的并不是一个“最简单的问题”。

附:HelloWorld.java

//  HelloWorld.java

public  class  HelloWorld {

public  static  void  main(String  args[]) {

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

}

}

java中能生成.class文件可是运行不了

你的程序首先有两个问题

第一个,Java明确规定,类名一定要大写,而你小写,虽然不会有错误,但是不规范。

第二个,System.out.println(isodd)地方不对,逻辑判断失误

但这两个错误都不会影响到程序正常运行。

而产生的错误是数组越界,为什么,因为你没有给数组传值啊,数组里面根本没东西。解决方法很简单,运行的时候,输入 java isodd 3,一定要给传值,可以传多个值,以空格分开,例如:java isodd 3 4 8 32,他只会判断第一个数是不是奇数或偶数

为什么main方法后面写(String[] args),就说明它要接受一些参数,只是平时都是有JVM传送的,不用我们在意。但是你完全可以自己传值进去,所以你没有传值,却引用数组,肯定会产生错误。

你的程序标准应该是如此:

class Isodd{

/**

*@param args

*/

public static void main(String[] args){

// TODO自动生成方法存根

int num= Integer.parseInt(args[0]);

String isodd="输入的是";

if(num%2==0){

isodd+="偶数";

}

else{

isodd+="奇数";

}

System.out.println(isodd);

}

}

如果你还想了解更多这方面的信息,记得收藏关注本站。

java对象的组成有什么作用是什么意思?java对象的作用java中的标识符是什么(什么是java的合法标识符)