所以我试图捕捉异常,我无法返回目录,但Java不会让我。如何构造代码以便Java让我运行它?
public Directory pathToDir(String path) throws Exception {
String[] arrayPath = path.split("/");
Directory cwd_copy = FileSystem.getRoot();
try {
// full path
if (path.startsWith("/")) {
for (int x = 1; x < arrayPath.length; x++) {
if (stuff) {
} else {
throw new Exception();
}
}
}
return cwd_copy;
}
catch (Exception e) {
pathErrorMsg();
}
}
答案 0 :(得分:3)
不,你可能会抛出异常,但是你抓住它并且什么都不做!如果您在逻辑上单步执行该代码,您将看到该方法有可能在没有返回Directory的情况下结束,并且不会抛出异常。那不会飞。
相反,考虑......
public Directory pathToDir(String path) throws PathToDirException {
String[] arrayPath = path.split("/");
Directory cwd_copy = FileSystem.getRoot();
// full path
if (path.startsWith("/")) {
for (int x = 1; x < arrayPath.length; x++) {
if (stuff) {
} else {
throw new PathToDirException( /* some text goes in here! */ );
}
}
}
return cwd_copy;
}
其中PathToDirException是您为此方法/类的问题创建的已检查异常类。
或者如果方法中有try / catch块,然后需要抛出异常,抛出新的Exception类,但将捕获的异常作为构造函数参数传递给新的异常。
答案 1 :(得分:1)
如果我理解了您的问题,您需要在方法结束时返回(如果您抓到Exception
而不是返回cwd_copy
)
return cwd_copy; // <-- this didn't happen.
} catch (Exception e) {
pathErrorMsg();
// return null; // <-- you could return here.
}
return null; // <-- so you need something. null or cwd_copy
或在catch
区块中添加回复。
答案 2 :(得分:1)
由于异常可能 1 ,因此仍必须从catch
路径返回一个值。
try {
maybeThrowException();
return X;
}
catch (Exception e) {
// But what is returned here?
}
要么不捕获异常,[re]抛出异常,要么在输入catch块时返回值。
由于该方法被声明为抛出异常,因此它可能会在失败时抛出一个 - 方法契约应该在这种情况下指定结果。
1 Java实际上并不聪明,即使这是一种思考它的逻辑方式。 try / catch被视为if / else here和所有分支必须逻辑上导致return
(或throw
)。即使尝试为空并且永远不会抛出异常,它仍然是编译器错误。请考虑以下比较:
if (true) {
return X;
} else {
// But what is returned here?
// (Java does not consider that this can never be reached,
// just as it does not logically consider the content of a `try`.)
}