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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马肖凯骏 中级黑马   /  2012-3-6 20:19  /  4944 人查看  /  21 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马肖凯骏 于 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);程序直接退出了,所以不会去找主函数,编译不会报错,运行也不会报错

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 不错,赞一个!

查看全部评分

21 个回复

倒序浏览
没有主函数怎么可以编译?楼主是不是用的JVM或者是没有保存,不是运行的这个代码、
回复 使用道具 举报
能告诉我这个怎么运行么!
回复 使用道具 举报
static语句块会在加载类的时候加载,它在main函数之前运行。 当static语句块运行完毕后,会寻找main函数,如果没有找到,就会i抛出异常。但是在以上的代码中,static语句块执行后,我们终止程序的运行,所以异常就不会被抛出啦。

还有一个可能是java运行一次以后,会自动生成一些文件,没有把这些文件删掉的情况下,缺少main也能运行,但是运行的不是你想得到的结果,这是我玩C#的时候出现的情况,不知道lz的情况是不是和这个一样

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2

查看全部评分

回复 使用道具 举报
这是我所说的第一个没有main也能运行的代码
public class NoMainMethod
{   
  static   
  {        
     System.out.println("Hello word, no main method!");      
     System.exit(0);      
  }
}

评分

参与人数 1黑马币 +4 收起 理由
老罗 + 4

查看全部评分

回复 使用道具 举报
确实可以编译通过,但是 无法执行 ,我使用的是1.7的jdk 和 虚拟机 。虚拟机报错  是
不知道,你是怎么运行的,能不能说清楚,是在别的类中调用的么,如果是,那这个应该是正常的,因为public 类只要求 类名与文件名一直,并不一定要求有主函数,如果是直接 运行的这个类,确实很稀奇,以为没有民函数,虚拟机一拿什么作为入口呢?

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

Error.jpg

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
楼主把运行结果发来看看啊 呵呵
回复 使用道具 举报
秦超 发表于 2012-3-6 20:33
static语句块会在加载类的时候加载,它在main函数之前运行。 当static语句块运行完毕后,会寻找main函数, ...

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

不过输出结果的同时,它也报错提示没有主函数

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
泮和顺 发表于 2012-3-6 20:44
楼主把运行结果发来看看啊 呵呵



嘿嘿,运行的结果就是这个!

评分

参与人数 1黑马币 +2 收起 理由
老罗 + 2

查看全部评分

回复 使用道具 举报
段玉超 发表于 2012-3-6 20:40
确实可以编译通过,但是 无法执行 ,我使用的是1.7的jdk 和 虚拟机 。虚拟机报错  是
不知道,你是怎么运行 ...



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

编译正常,运行的时候抛出了异常
回复 使用道具 举报
许飞翔 发表于 2012-3-6 20:24
没有主函数怎么可以编译?楼主是不是用的JVM或者是没有保存,不是运行的这个代码、 ...



有图有真相
回复 使用道具 举报
黑马肖凯骏 发表于 2012-3-6 20:57
嘿嘿,运行的结果就是这个!

这个真是静态代码块的牛逼之处啊 抛异常了还输出来 真绝了哈哈

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
秦超 发表于 2012-3-6 20:36
这是我所说的第一个没有main也能运行的代码
public class NoMainMethod
{   

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

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

嗯,我重新修改了,让它直接退出了,你现在看我运行的结果,编译和运行都没有报错!
回复 使用道具 举报
泮和顺 发表于 2012-3-6 21:01
这个真是静态代码块的牛逼之处啊 抛异常了还输出来 真绝了哈哈

现在连异常都没有,刚有兄弟指点了一下,再看
回复 使用道具 举报
小白 发表于 2012-3-6 20:26
能告诉我这个怎么运行么!

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

截图出来了,你看看!
回复 使用道具 举报
小白 黑马帝 2012-3-6 21:35:21
19#
你用的JDK是什么版本的!我的运行不了呢!
回复 使用道具 举报
只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马