Java語言第5講——分析沒有main方法但正常運行的Java程序

Java語言第5講——分析沒有main方法但正常運行的Java程序

首先說明一下,本文使用了幾年前的JDK(版本是1.4.2)來演示程序的運行。


1、奇怪的Java程序

源代碼


Java語言第5講——分析沒有main方法但正常運行的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.java

root@

VM-

0

-

8

-ubuntu:~/java# java Strange Error: 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

/<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虛擬機執行程序的規律,並不建議大家這樣開發程序。謝謝!


分享到:


相關文章: