原来的问题在这里
我正在读取一个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;
}
我认为第一种用法是正确的:
if (!Files.isRegularFile(mazeFile) || !Files.isReadable(mazeFile)) {
throw new IllegalArgumentException("Cannot locate readable file "+mazeFile);
}
由于(如文档所述)提供了一个无效文件作为参数,这应该抛出一个IllegalArgumentException
。一旦您知道您有一个满足这些要求的实际文件,我个人认为这不是一个很好的抛出异常。这将导致其他开发人员质疑给出的参数类型,而不是文件的内容。我猜你的选择是:
保持原样,只是用非常特定的错误消息解释
使用一些其他的,可能更适用的java异常,如
java.text.ParseException
,因为它是导致错误的文件解析。创建一个更充分地描述文件问题的自定义异常类,例如
MazeParseException
(根据注释)或FileFormatException
。
如果您希望其他几个开发人员执行您的函数,我希望第二个或第三个选项更有益。
例外主要是名称,我最好的建议是创建自己的。主要原因是IllegalArgumentException
s是未检查异常,因为它们扩展了java.lang.RuntimeException
。如果你在这样的环境中使用它们,它们只会引起问题。(源)
将方法签名更改为
private char[][] readMazeFromFile(Path mazeFile) throws IOException, MazeParseException {...}
和所有throw new IllegalArgumentException
与throw new MazeParseException
(除了第一次使用@Joel的回答)
MazeParseException.java文件
package yourPackage.here;
import java.lang.Exception;
public class MazeParseException {
public MazeParseException() {
super();
}
public MazeParseException(String reason) {
super(reason);
}
}
使用自己的异常的好处是,您可以在与您的情况相关的异常中标记额外的数据,例如,您可以添加:
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();
}
作为JSON或XML库发送自己的异常,如果文件不匹配他们正在寻找的(JSON文件或XML文件),我认为你应该做同样的,如果不匹配你正在寻找的(UTF-8文件)。
IllegalArgumentException应该用于代码中的内部问题,而不应该在代码调试时抛出。此外,你不应该捕获一个IllegalArgumentException,你可能会想在你的程序中捕获它。