正确使用IllegalArgumentException

Erk*_* M. 6 java exception-handling exception 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;
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*oel 5

我认为第一种用法是正确的:

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

由于(如文档所述)提供了无效文件作为参数,因此应该抛出一个IllegalArgumentException.一旦你知道你有一个满足这些要求的实际文件,我个人认为这不是一个很好的例外.这将导致其他开发人员质疑给定的参数类型而不是文件的内容.我想你的选择是:

  • 保持原样,只需要非常具体的错误消息,解释为什么这是一个无效的参数.

  • 使用其他一些可能更适用的java异常,例如java.text.ParseException,因为它是导致错误的文件解析.

  • 创建一个自定义异常类,更充分地描述文件的问题,例如a MazeParseException(根据注释)或a FileFormatException.

如果你期望其他几个开发人员执行你的功能,我希望第二个或第三个选项更有益.