黑马程序员技术交流社区

标题: 我是新手,问个简单的但我不懂啊!已解决 [打印本页]

作者: 邵阳    时间: 2012-6-3 19:38
标题: 我是新手,问个简单的但我不懂啊!已解决
本帖最后由 邵阳 于 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");
   
    }

}

作者: 丰亚彬    时间: 2012-6-3 19:40
java命令后面跟上类名就可以了
作者: 吴小铁你好    时间: 2012-6-3 19:41
本帖最后由 吴小铁你好 于 2012-6-3 19:43 编辑

应该先输 javac Demo.java 编译
再输java Demo 执行
作者: 古银平    时间: 2012-6-3 19:45
我是这么理解的,Java 默认执行的是类名.class文件,后面的.class在命令中是隐藏的,也就是默认带的,
当你输入D:\java\zuoye\1day>java Demo.class
那么Java命令默认就将执行的是 Demo.class.class这个文件,那么就会出现错误: 找不到或无法加载主类 Demo.class,因为Java命令找的是Demo.class.class,但你只有Demo.class这个。
作者: 杜俊彪    时间: 2012-6-3 19:53
有些东西已是墨守成规了的;  你就照打就是了;   不过,我还是说说我的看法;
我是这么理解的:    用编译器javac.exe 去编译某个文件(这里是肯定是*.java)文件; 得到*.class文件;      当你想要调用这个*.class文件的时候,   JVM就会调用类加载器去调用 你要执行的类,  这里就是Demo.class;      java就会去运行你要运行的类,  这里是类名,(个人理解:java.exe会自动 去识别 那些以.class为后缀的文件)   
作者: 金鑫    时间: 2012-6-3 19:56
你的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程序

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

靠谱不啊
作者: 邵阳    时间: 2012-6-3 20:07
邵阳 发表于 2012-6-3 20:05
靠谱不啊

我问的就是这个意思,不知道你回答对不,不过理解对啦。
作者: 闾丘日月    时间: 2012-6-4 11:50
    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:43
本帖最后由 郭永岳 于 2012-6-4 17:45 编辑

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

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

简单易懂,不用多想。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2