首先說明一下,本文使用了幾年前的JDK(版本是1.4.2)來演示程序的運行。
1、奇怪的Java程序
源代碼
程序的編譯和運行
<code>D
:\>jdk1
.4
.2
\bin
\javac
Strange
.java
D
:\>jdk1
.4
.2
\bin
\java
Strange
Hello
,this
is
Strange
.java
I
will
exit
.D
:\>/<code>
可以看到,這個Strange類,沒有main方法,完全正常地運行了!
2、分析
我們分析上面的Strange.java程序,發現它有一行代碼是我們平常不怎麼用的:
<code>System.exit
(0
);/<code>
其實上面的奇怪代碼能夠正常運行的原因就在這一行代碼上,現在我們去掉這一行代碼,程序變為:
<code>public
class
Strange
{static
{ System.out
.println("Hello, this is Strange.java"
); System.out
.println("I will exit."
); } }/<code>
代碼編譯和運行的情況就變為:
<code>D
:\>jdk1
.4
.2
\bin
\javac
Strange
.java
D
:\>jdk1
.4
.2
\bin
\java
Strange
Hello
,this
is
Strange
.java
I
will
exit
.Exception
in
thread
"main
"java
.lang
.NoSuchMethodError
:main
D
:\>/<code>
現在,程序剛開始正常打印兩句提示語,但是接著就出現異常了,JDK發現Strange類沒有定義main方法!
3、原因解釋
根據上面代碼運行的情況,我們可以對這個沒有main方法的程序的運行進行解釋:
(1)java命令執行程序時,先執行static塊代碼,然後才執行main方法;
(2)由於在static塊中有System.exit(0)語句,會退出java命令的執行邏輯,所以系統還沒來得及執行main方法,來不及拋出異常,就退出了。
4、號外!新JDK已經不允許這樣的程序正常運行
上面的程序雖然邏輯上正常,但一個沒有main方法的程序正常運行,總會給人帶來費解。
因此新的JDK不允許這樣做了。這是JDK1.8.0執行該程序時的顯示:
<code>root@
VM-0
-8
-ubuntu:~/java# javac Strange.javaroot@
VM-0
-8
-ubuntu:~/java# java Strange Error: Main method not foundin
class
Strange
,please define the main method as:
public
static void main(String[] args) or a JavaFX applicationclass
must
extend
javafx
.application
.Application
/<code>
雖然在JDK1.8.0中會給出錯誤提示,但我們依然可以通過加入一個空的main方法,來規避JDK的檢查:
<code>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
){ } }/<code>
這時候再編譯和運行Strange.java程序,一切正常:
<code>root@VM-0
-8
-ubuntu:~/java root@VM-0
-8
-ubuntu:~/java Hello,this
is
Strange.java I will exit. root@VM-0
-8
-ubuntu:~/java /<code>
5、補充說明
特別說明一下,本文只是為了解釋Java虛擬機執行程序的規律,並不建議大家這樣開發程序。謝謝!