2011-12-22 81 views
42

我在採訪中被問到了這個問題。在不使用main()方法的情況下在控制檯上打印消息

如何在不使用main()方法的情況下在控制檯上打印消息?

+3

你如何開始你沒有一個主要方法的應用程序? – RoflcoptrException 2011-12-22 14:17:37

+14

我不認爲這是一個很好的面試問題。當然,你想測試申請人的問題解決能力,而不是Java的少量使用方面的知識? – 2011-12-22 15:50:17

+14

@CallumRogers +1瑣事是最糟糕的問題,任何提出這些問題的人都不配當我的老闆。 – 2011-12-22 20:26:20

回答

62
public class Foo { 
    static { 
     System.out.println("Message"); 
     System.exit(0); 
    } 
} 

的JVM之前System.exit(0)退出程序開始尋找main()

Ideone link

(注:即使它與JDK 7的javac它不能與它java運行編譯,因爲它預計main(String[])方法。)

+1

@Roflcoptr'$ java Foo'就像任何其他 – 2011-12-22 14:23:07

+1

@Roflcoptr'java -cp。 Foo就像一個主要的程序。 ;) – 2011-12-22 14:23:37

+0

@Roflcoptr只是編譯類並運行'java Foo'它會加載類,打印消息;並且在它開始找到執行的入口點之前我們退出。 – 2011-12-22 14:24:13

10

在一個名爲的文件

class Con { 
    String hi = "\n\nHello World\n\n"; 
} 

你只需要在Windows上編譯程序。不運行它。 :-P

+2

這是可行的,因爲'CON'在Windows上有特殊含義,對吧? – 2011-12-22 14:23:44

+3

這也打印了很多其他的東西。順便說一下,什麼是「Con」?它不會將該文件命名爲「Con.java」。 +1。 – 2011-12-22 14:32:17

+10

-1爲與平臺無關的語言中的問題提供平臺特定的解決方案是不正確的。 – 2011-12-22 14:37:56

6
class MainMethodNot 
{ 
    static 
    { 
     System.out.println("Hello World"); 
     System.exit(0); 

    } 
} 

因爲靜態初始化塊執行第一次加載類時,我們可以打印出的「Hello World」,而無需編寫一個主要方法。使用「System.exit()」命令停止執行。所以,我們防止「主要方法未找到」錯誤。 這是一個相當棘手的問題

12
public final class Main { 
    static { 
     System.out.println("Hello World"); 
     System.exit(0); 
    } 
} 

靜態塊首先就被調用之前main();方法,因此前main()被稱爲類加載執行,System.exit(0)啓動VM關閉。

System.exit方法會暫停執行當前線程和其他所有其他線程的執行。當調用System.exit時,虛擬機在關閉前執行兩個清理任務。

首先,它執行已經用Runtime.addShutdownHook註冊的所有關閉鉤子。這對釋放VM外部的資源很有用。使用關閉掛鉤進行虛擬機退出前必須發生的行爲。

System.exit被稱爲 時VM執行的第二個清理任務涉及終結器。如果已調用System.runFinalizersOnExit或其邪惡雙胞胎 Runtime.runFinalizersOnExit,則虛擬機將運行所有尚未最終確定的對象的終結器。這些方法早在 被棄用,並有充分的理由。永遠不要致電System.runFinalizersOnExitRuntime.runFinalizersOnExit出於任何原因:它們是Java庫中最危險的方法之一。調用這些方法可能導致終結器在活動對象上運行,而其他線程同時操縱它們,導致不穩定的行爲或死鎖。

總之,System.exit立即停止所有程序線程;它不會造成 最終阻止執行,但它會在停止虛擬機之前運行關閉掛接。當關閉虛擬機關閉 時,使用關閉掛鉤來終止外部資源。通過調用 System.halt可以暫停虛擬機而不執行關機掛鉤,但此方法很少使用。

6

你可以自定義一個類加載器,打印您的留言:

public class MyClassLoader extends ClassLoader { 
    public MyClassLoader(ClassLoader other) { 
     super(other); 
     System.out.println("Hi there"); 
     System.exit(0); 
    } 
} 

然後運行java命令:

java -Djava.system.class.loader=MyClassLoader

(不需要添加類作爲參數)

1

是的,其中一種方式是靜態模塊,但在以前版本的JDK中不在JDK 1.7中。

class Withoutmain{ 
static{ 
    System.out.println("Message: Your message can be print on console without main() method"); 
    System.exit(0); 
} 
} 

輸出:消息:你的消息可以是在控制檯上打印而不main()方法(如果不是JDK7)

輸出:錯誤:Main方法在類A3不存在,請定義的主要方法爲: 公共靜態無效的主要(字串[] args)

Reference

2

這是可能的java直到6使用的System.out.println();沒有main()。 從Java 7開始,用靜態塊就無法做到這一點。它仍然會要求主要課程的主要方法。

+0

是的,我在很多地方見過,但我不清楚爲什麼不在jdk7和更高版本中執行,如果你可以給出更詳細的信息,那就太好了。 – 2017-11-28 10:27:39

2

如果你不想太使用靜態塊,可以按以下方式

public class NoMain { 

    private static final int STATUS = getStatus(); 

    private static int getStatus() { 
     System.out.println("Hello World!!"); 
     System.exit(0); 
     return 0; 
    } 

} 

但是,請注意,這是Java 6的版本來完成。它的not working in Java 7據說在Java 8中支持。我嘗試使用JDK 1.8.0_77-b03,它仍然不能正常工作

0

實際上,它不適用於Java 8的最新更新。您可以稱它爲根據他們的錯誤修復,但據我相信我目前的知識,這不能稱爲錯誤修復,因爲它也導致在java編程中的概念性變化也很少。

0

是的,您可以在不使用main()的情況下將消息打印到控制檯。

創建使用JUnit測試,並執行它:

@Test 
public printTest() { 
    System.out.println("myprint"); 
} 
相關問題