Java说我必须返回一个Object,但是我会抛出异常

时间:2014-07-25 02:44:05

标签: java exception return try-catch

所以我试图捕捉异常,我无法返回目录,但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();
    }
}

3 个答案:

答案 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`.)
}