黑马程序员技术交流社区

标题: 绝了,没主函数也能运行程序 [打印本页]

作者: 黑马肖凯骏    时间: 2012-3-6 20:19
标题: 绝了,没主函数也能运行程序
本帖最后由 黑马肖凯骏 于 2012-3-6 21:08 编辑

public class CodeDemo04 {
        CodeDemo04()
        {
                System.out.println("疯了");
        }
        {
                System.out.println("完蛋了");
        }
        static
        {
                System.out.println("我要疯了");
                System.exit(1);
        }
        }

没有主函数,编译没有错误,还输出结果了呢!!

嘿嘿,娱乐一把!


运行的结果,原因是static先于main()函数加载,当执行到System.exit(1);程序直接退出了,所以不会去找主函数,编译不会报错,运行也不会报错

作者: 许飞翔    时间: 2012-3-6 20:24
没有主函数怎么可以编译?楼主是不是用的JVM或者是没有保存,不是运行的这个代码、
作者: 小白    时间: 2012-3-6 20:26
能告诉我这个怎么运行么!
作者: 秦超    时间: 2012-3-6 20:33
static语句块会在加载类的时候加载,它在main函数之前运行。 当static语句块运行完毕后,会寻找main函数,如果没有找到,就会i抛出异常。但是在以上的代码中,static语句块执行后,我们终止程序的运行,所以异常就不会被抛出啦。

还有一个可能是java运行一次以后,会自动生成一些文件,没有把这些文件删掉的情况下,缺少main也能运行,但是运行的不是你想得到的结果,这是我玩C#的时候出现的情况,不知道lz的情况是不是和这个一样
作者: 秦超    时间: 2012-3-6 20:36
这是我所说的第一个没有main也能运行的代码
public class NoMainMethod
{   
  static   
  {        
     System.out.println("Hello word, no main method!");      
     System.exit(0);      
  }
}
作者: 段玉超    时间: 2012-3-6 20:40
确实可以编译通过,但是 无法执行 ,我使用的是1.7的jdk 和 虚拟机 。虚拟机报错  是
不知道,你是怎么运行的,能不能说清楚,是在别的类中调用的么,如果是,那这个应该是正常的,因为public 类只要求 类名与文件名一直,并不一定要求有主函数,如果是直接 运行的这个类,确实很稀奇,以为没有民函数,虚拟机一拿什么作为入口呢?

Error.jpg (15.38 KB, 下载次数: 109)

Error.jpg

作者: 泮和顺    时间: 2012-3-6 20:44
楼主把运行结果发来看看啊 呵呵
作者: 黑马肖凯骏    时间: 2012-3-6 20:54
秦超 发表于 2012-3-6 20:33
static语句块会在加载类的时候加载,它在main函数之前运行。 当static语句块运行完毕后,会寻找main函数, ...

嘿嘿 回答正确 就是因为加载了static中部分 输出结果是 绝了

不过输出结果的同时,它也报错提示没有主函数
作者: 黑马肖凯骏    时间: 2012-3-6 20:57
泮和顺 发表于 2012-3-6 20:44
楼主把运行结果发来看看啊 呵呵



嘿嘿,运行的结果就是这个!
作者: 黑马肖凯骏    时间: 2012-3-6 21:00
段玉超 发表于 2012-3-6 20:40
确实可以编译通过,但是 无法执行 ,我使用的是1.7的jdk 和 虚拟机 。虚拟机报错  是
不知道,你是怎么运行 ...



是这样子的呢!stitic加载先于主函数加载,所以就直接输出了静态代码块中的内容

编译正常,运行的时候抛出了异常
作者: 黑马肖凯骏    时间: 2012-3-6 21:01
许飞翔 发表于 2012-3-6 20:24
没有主函数怎么可以编译?楼主是不是用的JVM或者是没有保存,不是运行的这个代码、 ...



有图有真相
作者: 泮和顺    时间: 2012-3-6 21:01
黑马肖凯骏 发表于 2012-3-6 20:57
嘿嘿,运行的结果就是这个!

这个真是静态代码块的牛逼之处啊 抛异常了还输出来 真绝了哈哈
作者: 黑马肖凯骏    时间: 2012-3-6 21:02
秦超 发表于 2012-3-6 20:36
这是我所说的第一个没有main也能运行的代码
public class NoMainMethod
{   

嗯,就是你这个样子的,不过要把System.exit(0);中的0改成1吧,这样运行完之后马上结束,程序连报错的可能性都没有了呢!      
作者: 秦超    时间: 2012-3-6 21:04
黑马肖凯骏 发表于 2012-3-6 20:57
嘿嘿,运行的结果就是这个!

因为static语句块会在加载类的时候加载,它在main函数之前运行,所以"绝了"是会执行的,当static语句块执行过后,虚拟机就要寻找main来进入程序,但是程序中没有main,所以会报错.
如果有不对的地方,希望大家指出,共同学习
作者: 黑马肖凯骏    时间: 2012-3-6 21:09
秦超 发表于 2012-3-6 21:04
因为static语句块会在加载类的时候加载,它在main函数之前运行,所以"绝了"是会执行的,当static语句块执行 ...

嗯,我重新修改了,让它直接退出了,你现在看我运行的结果,编译和运行都没有报错!
作者: 黑马肖凯骏    时间: 2012-3-6 21:10
泮和顺 发表于 2012-3-6 21:01
这个真是静态代码块的牛逼之处啊 抛异常了还输出来 真绝了哈哈

现在连异常都没有,刚有兄弟指点了一下,再看
作者: 黑马肖凯骏    时间: 2012-3-6 21:11
小白 发表于 2012-3-6 20:26
能告诉我这个怎么运行么!

用DOS界面下,命令行的方式运行!像毕老师那样 你看看我截图就知道了!
作者: 黑马肖凯骏    时间: 2012-3-6 21:12
许飞翔 发表于 2012-3-6 20:24
没有主函数怎么可以编译?楼主是不是用的JVM或者是没有保存,不是运行的这个代码、 ...

截图出来了,你看看!
作者: 小白    时间: 2012-3-6 21:35
你用的JDK是什么版本的!我的运行不了呢!
作者: 陈斌    时间: 2012-3-6 21:36
只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次
作者: 泮和顺    时间: 2012-3-6 23:01
貌似还要看JDK版本的 好多人都是提示要找main主方法的 呵呵
作者: 黑马张平    时间: 2012-3-6 23:03
?真的吗?!




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