2009-11-15 59 views
0

我正在評估用戶輸入作爲我的應用程序的命令。如果用戶按下Q,或q,然後點擊進入,退出應用程序,並終止執行。以編程方式退出應用程序的適當方式是什麼?

有沒有合適的上下文或最佳實踐如何做到這一點?我沒有任何資源可以發佈,或類似的東西。我應該只使用System.exit(0);?有沒有推薦的方法來做到這一點?

作爲我的第一個方法,我做這樣的事情:

while (true){ 
    try{ 
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 

     //Other logic goes here... 
     if (br.readLine().equalsIgnoreCase("Q")){ 
      System.exit(0); 
     } 
    } 
    catch (IOException ioe) { 
     System.out.println("IO error trying to read your selection"); 
    } 
} 
+4

'System.exit(0);'沒有什麼錯。但我認爲你需要擔心更重要的事情,比如正確縮進代碼。 – Artelius 2009-11-15 01:20:44

+0

對不起,我複製/粘貼在高潮 – denchr 2009-11-15 01:27:23

回答

4

你還不如回到高達main(),並從那裏返回。

private void loop() { 
     while (true){ 
      try{ 
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 

       //other logic goes here... 
       if(br.readLine().equalsIgnoreCase("Q")){ 
        return; // You're done and you are returning to the caller. 
       } 
      } 
      catch (IOException ioe) { 
       System.out.println("IO error trying to read your selection"); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     loop(); 
    } 

但是,如果你沒有任何東西要發佈,System.exit(0)是好的。

+0

是的,System.exit(0)對你所描述的很好。儘管如此,德米特里建議返回到main()是一個好主意,以防將來擴展該程序並打開需要釋放的東西。 – Jeff 2009-11-15 01:27:36

0

我想說:

沒關係,這完全取決於你 !

麪糰它有時是真的,有時它取決於程序結構和代碼的完整性。

合理出口將通過main方法,終止所有線程。

System.exit強制終止JVM中的所有線程。 System.exit從不正常返回。它應該用於出錯。

1

返回所有的方式回到選舉出來的main()是最乾淨的方法,當然,但如果這是不容易做到的,System.exit()是完全沒有問題。

這不是你的問題直接相關,而是拋出(未處理的)異常通常是終止在致命的疾病的方式,因爲它提供了很多的信息追蹤到不良的用戶的。

+0

我的例子中的代碼是主要的。我認爲搞清楚「一路返回main()」的含義有些困難。對不起,這就是爲什麼我要求在上一個答案中的一個例子。 – denchr 2009-11-15 01:43:48

+0

對不起。除了使用'System.exit()'外,流出*'main()'是最乾淨的方式。 – 2009-11-18 02:29:09

2

當進程退出時,操作系統會自動清理資源。從代碼中間退出()(這適用於所有語言)有兩個主要原因。

  • 在程序結束前可能需要採取一些措施。例如,您可能需要保存所有打開的文件(即出於性能或其他原因的寫入更改尚未發送到該文件)。

  • 有人可能希望稍後將您的代碼用於其他目的。

以Git版本控制系統爲例。有幾個努力將代碼轉換爲庫,而不是一組獨立的可執行文件,以便將其有效地合併到其他項目中。其中一個問題(我聽到的)是,代碼有時會簡單地終止而不是跟蹤和清理它正在使用的資源。作爲一個很好的可執行文件,但如果它是作爲庫導入的,那麼您並不總是希望只是終止主機應用程序,因爲您完成了一小部分任務。

0

System.exit()很好。我同意其他答案,從維護的角度來看,返回主體將是最好的退出方式。隨着代碼擴展,您可能會忘記System.exit必須進行調試才能記住它的小方法。

但是,如果您的腳本需要有關異常終止的信息,則只需使用exit。否則就沒有必要。

正如我記得一個Java程序將默認退出0意味着正常終止。所以,如果你的程序由於某種錯誤而終止的話,你會想使用System.exit(n)。

例(只是用你最有可能想要實例靜態方法...):

public static void main(String[] args) { 
    try { 
    doStuff(); 
    } catch (SomeRuntimeException e) { 
    // marching orders! Exit with errorcode 
    <log the error with sufficient info for debugging> 
    System.exit(1); 
    } 
} 

private static doStuff() { 
    // doing my thing ... 
    ... 
    //then some error occurs and I have no other choice but to do a hard exit 
    throw new SomeRuntimeException( ... some info would be nice ...) 
    ... 
    return 
} 
0

不要忘記,如果執行System.exit(),你不能輕易地在以後使用你的方法在獨立的庫中。如果你想在你現有的解決方案之外重用你的代碼(現在你可能不會這樣做,但將來會決定這麼做),那麼你將不得不重新進行適當的重構和重構。

否則,最糟糕的情況是您在不知道System.exit()的情況下采用現有代碼,使用它,然後讓您的庫意外退出到新應用程序中。

只是要記住重新。代碼重用。

相關問題