java 点允许没有反应 程序有main_Java语言第5讲——分析没有main方法但正常运行的Java程序...

本文探讨了一段使用JDK1.4.2的Java代码,该代码在没有main方法的情况下仍能运行。关键在于`System.exit(0)`调用,它在静态块执行后立即终止程序,防止了因找不到main方法而引发的异常。在新版本的JDK中,这种行为不再被允许,程序会报错。通过添加空main方法,可以规避新JDK的检查。文章旨在解释Java虚拟机执行程序的规则,而非提倡此类编程实践。
摘要由CSDN通过智能技术生成
07413c7a276f381f51cbcb785e3d229c.png

首先说明一下,本文使用了几年前的JDK(版本是1.4.2)来演示程序的运行。

1、奇怪的Java程序

源代码

810ffc24100eb50dc2c8ac63a8ff6e5d.png

程序的编译和运行

D:>jdk1.4.2binjavac Strange.javaD:>jdk1.4.2binjava StrangeHello, this is Strange.javaI will exit.D:>

可以看到,这个Strange类,没有main方法,完全正常地运行了!

2、分析

我们分析上面的Strange.java程序,发现它有一行代码是我们平常不怎么用的

System.exit(0);

其实上面的奇怪代码能够正常运行的原因就在这一行代码上,现在我们去掉这一行代码,程序变为:

public class Strange{    static{        System.out.println("Hello, this is Strange.java");        System.out.println("I will exit.");    }}

代码编译和运行的情况就变为:

D:>jdk1.4.2binjavac Strange.javaD:>jdk1.4.2binjava StrangeHello, this is Strange.javaI will exit.Exception in thread "main" java.lang.NoSuchMethodError: mainD:>

现在,程序刚开始正常打印两句提示语,但是接着就出现异常了,JDK发现Strange类没有定义main方法!

3、原因解释

根据上面代码运行的情况,我们可以对这个没有main方法的程序的运行进行解释:

(1)java命令执行程序时,先执行static块代码,然后才执行main方法;

(2)由于在static块中有System.exit(0)语句,会退出java命令的执行逻辑,所以系统还没来得及执行main方法,来不及抛出异常,就退出了。

4、号外!新JDK已经不允许这样的程序正常运行

上面的程序虽然逻辑上正常,但一个没有main方法的程序正常运行,总会给人带来费解。

因此新的JDK不允许这样做了。这是JDK1.8.0执行该程序时的显示:

root@VM-0-8-ubuntu:~/java# javac Strange.javaroot@VM-0-8-ubuntu:~/java# java StrangeError: Main method not found in class Strange, please define the main method as:   public static void main(String[] args)or a JavaFX application class must extend javafx.application.Application

虽然在JDK1.8.0中会给出错误提示,但我们依然可以通过加入一个空的main方法,来规避JDK的检查

public class Strange{    static{        System.out.println("Hello, this is Strange.java");        System.out.println("I will exit.");        System.exit(0);    }    public static void main(String[] args){    }}

这时候再编译和运行Strange.java程序,一切正常:

root@VM-0-8-ubuntu:~/java# javac Strange.javaroot@VM-0-8-ubuntu:~/java# java StrangeHello, this is Strange.javaI will exit.root@VM-0-8-ubuntu:~/java#

5、补充说明

特别说明一下,本文只是为了解释Java虚拟机执行程序的规律,并不建议大家这样开发程序。谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值