6

原題正確的用法是here的拋出:IllegalArgumentException

我在UTF-8的文件讀取和解析該文件的內容。如果文件中有錯誤,則無法繼續執行,應停止執行。我已建議拋出IllegalArgumentException如果有問題與內容,但API文檔說:

拋出,表明一個方法已通過非法或不適當的 爭論。

在我的代碼中,參數將是我通過的文件(或者實際上是路徑),在解析時出現錯誤的情況下拋出IllegalArgumentException是否正確?如果不是,我應該拋出什麼類型的異常?

private char[][] readMazeFromFile(Path mazeFile) throws IOException { 
    if (!Files.isRegularFile(mazeFile) || !Files.isReadable(mazeFile)) { 
     throw new IllegalArgumentException("Cannot locate readable file " + mazeFile); 
    } 
    List<String> stringList = Files.readAllLines(mazeFile, StandardCharsets.UTF_8); 
    char[][] charMaze = new char[stringList.size()][]; 

    for (int i = 0; i < stringList.size(); i++) { 
     String line = stringList.get(i); 
     if (line.length() != charMaze.length) 
      throw new IllegalArgumentException(String.format("Expect the maze to be square, but line %d is not %d characters long", line.length(), charMaze.length)); 
     if (line.contains("B")) { 
      startX = i; 
      startY = line.indexOf("B"); 
     } 
     if (line.contains("F")) { 
      endX = i; 
      endY = line.indexOf("F"); 
     } 
     charMaze[i] = line.toCharArray(); 
    } 

    if (startX == -1 || startY == -1) 
     throw new IllegalArgumentException("Could not find starting point (B), aborting."); 
    if (endX == -1 || endY == -1) 
     throw new IllegalArgumentException("Could not find ending point (F), aborting."); 
    return charMaze; 
} 
+3

否在這種情況下,您不應該拋出IllegalArgumentException。也許像MazeParseException這樣的自定義異常(如使用DocumentBuilder.parse()時的SAXException)。使用IllegalArgumentExceptions當你不想接受空值,但給出空值,或者如果你需要一個文件夾,但給出了一個文件等。 – Icewind

+2

我會說這個問題是主要基於意見的基礎上接近。我個人不會在這種情況下創建一個新的異常類,我只是拋出一個'RuntimeException'和一個適當的錯誤消息。 – JonK

+1

IllegalArgumentException在這裏完全沒問題。 Path對象不符合該方法的要求。 –

回答

5

我認爲第一種用法是正確的:

if (!Files.isRegularFile(mazeFile) || !Files.isReadable(mazeFile)) { 
    throw new IllegalArgumentException("Cannot locate readable file "+mazeFile); 
} 

由於(如文檔狀態)無效的文件被作爲參數提供,這應該拋出IllegalArgumentException。 一旦你知道你有一個符合這些要求的實際文件,我個人認爲這不是一個很好的例外。這會導致其他開發人員質疑與文件內容相反的參數類型。我猜你的選擇是:

  • 保持原樣,只是非常特定錯誤消息解釋 爲什麼這是一個無效的參數。

  • 使用一些其他可能更適用的Java異常,例如java.text.ParseException,因爲它是導致錯誤的文件解析。

  • 創建一個自定義異常類,以更充分地描述文件的問題,例如,一個MazeParseException(根據評論)或一個FileFormatException

如果您預計其他幾個開發人員正在執行您的功能,我希望第二個或第三個選項更有用。

0

JSON或XML庫派出自己的execption如果文件不匹配,他們正在尋找(一個JSON文件或XML之一),我認爲你應該做相同的,如果不匹配你在找什麼(一個UTF-8文件)。

IllegalArgumentException應該用於代碼中的內部問題,並且在代碼調試時不應拋出。此外,您不應該捕獲IllegalArgumentException,並且您可能希望在程序中捕獲它。

1

例外主要是什麼,但名稱,我最好的建議是在這裏做你自己的。 主要原因是IllegalArgumentException s是未檢查的例外因爲它們延伸java.lang.RuntimeException。如果你在這樣的環境中使用它們,它們會造成問題。 (Source)

更改方法簽名

private char[][] readMazeFromFile(Path mazeFile) throws IOException, MazeParseException {...} 

而且所有throw new IllegalArgumentExceptionthrow new MazeParseException (除第一次使用按@喬爾的回答)

的MazeParseException.java文件:

package yourPackage.here; 

import java.lang.Exception; 

public class MazeParseException { 
    public MazeParseException() { 
     super(); 
    } 

    public MazeParseException(String reason) { 
     super(reason); 
    } 
} 

使用您自己的e xception是,您可以標記額外的數據以及與您的情況有關的例外情況,例如,您可以添加:

private int errorLineNum = null; 
public MazeParseException(String reason, int lineNum) { 
    this(reason); 
    this.errorLineNum = lineNum; 
} 

public int getMalformedLine() { 
    return this.errorLineNum; 
} 

// And then update the toString() method to incorperate the errorLineNum 
@Override 
public String toString() { 
    StringBuilder sb = new StringBuilder(super.toString()); 
    if(errorLineNum != null) { 
     sb.append("@ line #"); 
     sb.append(this.errorLineNum); 
    } 
    return sb.toString(); 

} 
相關問題