A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 邵阳 于 2012-6-6 13:31 编辑

2为什么在dos命令窗里输入
出现        D:\java\zuoye\1day>java Demo.class
错误: 找不到或无法加载主类 Demo.class
而输入      D:\java\zuoye\1day>java  Demo
出现        hello  java
我的java文档是
class Demo
{
    public static void main (String[] args)
    {  
           System.out.println("hello  java");
   
    }

}

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

11 个回复

倒序浏览
java命令后面跟上类名就可以了
回复 使用道具 举报
本帖最后由 吴小铁你好 于 2012-6-3 19:43 编辑

应该先输 javac Demo.java 编译
再输java Demo 执行
回复 使用道具 举报
我是这么理解的,Java 默认执行的是类名.class文件,后面的.class在命令中是隐藏的,也就是默认带的,
当你输入D:\java\zuoye\1day>java Demo.class
那么Java命令默认就将执行的是 Demo.class.class这个文件,那么就会出现错误: 找不到或无法加载主类 Demo.class,因为Java命令找的是Demo.class.class,但你只有Demo.class这个。
回复 使用道具 举报
有些东西已是墨守成规了的;  你就照打就是了;   不过,我还是说说我的看法;
我是这么理解的:    用编译器javac.exe 去编译某个文件(这里是肯定是*.java)文件; 得到*.class文件;      当你想要调用这个*.class文件的时候,   JVM就会调用类加载器去调用 你要执行的类,  这里就是Demo.class;      java就会去运行你要运行的类,  这里是类名,(个人理解:java.exe会自动 去识别 那些以.class为后缀的文件)   
回复 使用道具 举报
你的JAVA程序是:
class Demo
{
    public static void main (String[] args)
    {  
           System.out.println("hello  java");
   
    }

}

所以你首先要运行: D:\java\zuoye\1day>javac Demo.java
这是第一步,编译JAVA程序生成字节码文件
然后运行: D:\java\zuoye\1day>java Demo
这事第二步,运行你的JAVA程序


固定步骤
1、输入 javac Demo(程序名或者类名).java 编译生成字节码文件
2、输入java Demo(程序名或者类名) 运行JAVA程序

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1 赞一个!

查看全部评分

回复 使用道具 举报
编译Java程序生成“.class”文件,在DOS下,应用DOS命令找到你所编Java程序文件(假设文件名为Demo.java)的根目录下输入命令:javac Demo.java。如果生成。“.class”文件则编译成功。
执行Java程序:接着上步操作输入:java Demo         在命令提示符上会出现运行结果
回复 使用道具 举报
谁都是从这时候过来的! 提出针对性的问题很好,加油!
回复 使用道具 举报
古银平 发表于 2012-6-3 19:45
我是这么理解的,Java 默认执行的是类名.class文件,后面的.class在命令中是隐藏的,也就是默认带的,
当你 ...

靠谱不啊
回复 使用道具 举报
邵阳 发表于 2012-6-3 20:05
靠谱不啊

我问的就是这个意思,不知道你回答对不,不过理解对啦。
回复 使用道具 举报
    protected Class<?> findClass(final String name)
         throws ClassNotFoundException
    {
        try {
            return (Class)
                AccessController.doPrivileged(new PrivilegedExceptionAction() {
                    public Object run() throws ClassNotFoundException {
                        String path = name.replace('.', '/').concat(".class");
                        Resource res = ucp.getResource(path, false);
                        if (res != null) {
                            try {
                                return defineClass(name, res, true);
                            } catch (IOException e) {
                                throw new ClassNotFoundException(name, e);
                            }
                        } else {
                            throw new ClassNotFoundException(name);
                        }
                    }
                }, acc);
        } catch (java.security.PrivilegedActionException pae) {
            throw (ClassNotFoundException) pae.getException();
        }
    }
这是类加载器加载类的时候的源代码,可以看到,String path = name.replace('.', '/').concat(".class");
它将你输入的url手动的加了个.class,还将所有的点换成了/,所以我们才可以用包名.类名的方式来调用这个类,而实际上找的是文件系统中的.class文件。
前面古同学的理解是对的。
如果要实现你那样写还不报错的话,还需要些一大段代码
               if(path.endsWith(".class")){
                       StringBuffer sb = new StringBuffer();
                       sb.append(name.substring(0,name.lastIndexOf('.')).replace('.','/'));
                       sb.append(name.substring(name.lastIndexOf('.'),name.length()));
                       path= sb.toString();
               }
将这段加进去,重新编译JVM,应该能够解释.class的文件了。
老实说,我没具体试过。。但是原理就是在这里了
回复 使用道具 举报
本帖最后由 郭永岳 于 2012-6-4 17:45 编辑

首先,要明白Java与Javac的区别。

1、javac是把你写的java代码编译成计算机能识别的内部代码。2、java是执行这段内部代码。

简单易懂,不用多想。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马