2017-02-18 35 views
-2

我試圖打開並閱讀從命令行傳遞的文件。(java)

這是我到目前爲止有:

import java.io.*; 

public class Test { 

    public static void main(String[] args) throws FileNotFoundException { 

     if ((args[0].length() == 0) || (args[0] == null) || (args[0].isEmpty())) { 
      System.err.println("Usage Error: No file name was provided."); 
      System.exit(1); 
     } 

     File file = new File(args[0]); 

     if (!file.exists()) { 
      System.err.println("Usage Error: The file, " + args[0] + ", does not exist."); 
     } 

     if (!file.canRead()) { 
      System.err.println("Usage Error: The file, " + args[0] + ", cannot be read."); 
     } 
    } // main 
} 

我不完全相信我應該如何處理文件沒有發現異常。我的老師提到了try/catch塊,但我不確定我是否需要這些。僅僅測試一下文件是否作爲參數傳遞是否足夠,並且它是否使用System.err.print()方法給用戶一個錯誤?另外,如果System.err.print()被調用,它會在那之後退出程序(也就是說,在那之後是否需要包含System.exit(1))?或者是更好的(在設計方面),只是做這樣的事情:

public void readFile() throws FileNotFoundException { 
    // try to open file here 
} 

public static void main(String[] args) { 
    try { 
     readFile(); 
    } catch (Exception e) { 
     // exception handled here 
    } 
} 

我只是需要確保用戶實際上通過一個字符串作爲文件名,它的存在/可以被讀取。

+0

不同之處在於它們不一樣。一個打印輸出到控制檯。另一個改變程序流程。這全部記錄在案。沒有必要猜測。 – EJP

回答

0

異常使得以編程方式更容易處理錯誤。

含義:當你的程序只包含一個主函數,並且你想告訴用戶「一個文件不存在」時;那麼它並沒有太大的區別,如果你的程序打印一個合理的信息給stderr;然後存在一些非零的返回碼;或者如果你拋出異常。

恰恰相反,在你的簡單例子中;具有一個精確的錯誤消息實際上是優先於拋出異常並讓JVM向用戶打印一個(可能令人困惑的)堆棧跟蹤。

但是:你目前的程序只是一個小例子。只要事情變得越來越大,你的程序就會對不同組件中的許多不同類進行調用。然後打印到stderr不再是一個好主意。然後,您要確保遇到問題的一個圖層具有明確的方式來傳達這種情況;這就是例外情況。在這種情況下,你非常喜歡例外;因爲一些更高層可以抓住他們 - 然後決定做什麼。例如,程序可以決定在某個UI面板上顯示錯誤消息;或將消息放入日誌文件中;或發送短信給某些手機。如果你只打印到stderr,所有這些幾乎是不可能的。

0

catch而不是// exception handled here你可以寫任何你想要的代碼。 如果你只是拋出異常 - java本身做一些非標準的事情。

0

慢慢閱讀有效的Java(第二版)書籍形式Joshua Bloch。 第57項(異常情況下僅使用例外)將闡明本主題中的所有內容。