【问题标题】:Why does throwing an unchecked exception removes the "missing return statement" error为什么抛出未经检查的异常会消除“缺少返回语句”错误
【发布时间】:2020-07-06 21:48:42
【问题描述】:

我对编程很陌生,因此这个问题可能看起来很傻。下面提到的方法的返回类型为 int 数组。当我们不抛出任何未经检查的异常时,它会抛出我理解的错误。但是为什么包含未经检查的异常会消除该错误呢?还是没有return语句对不对?

public static int[] twoSum(int[] nums, int target) {
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[j] == target - nums[i]) {
                    return new int[] { i, j };
                }
            }
        }
        //throw new IllegalArgumentException("No two sum solution");
    }

【问题讨论】:

  • 该方法确实终止

标签: java exception return throw unchecked-exception


【解决方案1】:

在具有非 void 返回类型的方法中没有实际要求有 return 语句。例如:

int huh() {
  while (true) {}
}

legal

要求是方法不能正常完成JLS):

如果将方法声明为具有返回类型(第 8.4.5 节),则如果方法的主体可以正常完成(第 14.1 节),则会发生编译时错误。

正常完成基本上是在方法的执行“落到底部”时,即在没有遇到return或throw语句的情况下到达方法的末尾。

所以,如果你在你的方法的末尾加上一个 throw 语句,执行就无法到达方法的末尾,所以是合法的。

在上面huh() 的例子中,while 循环没有正常完成,所以执行不能到达方法的末尾,所以不需要 return 或 throw。

【讨论】:

  • 感谢您的解释。这真的很有帮助。
【解决方案2】:

在某些情况下,您的程序永远不会到达内部 return 语句。例如。如果 nums 的长度为 0 或者 nums[j] == target - nums[i] 永远不会为真。对于这些情况,该方法需要返回一些东西或者它可以抛出异常。您可以决定您的用例的正确行为是什么。如果没有为这种情况定义任何内容,并且您的 IDE 会让您通过它,那么您将破坏代码。如果您抛出异常而不是什么都不做,那么您的 IDE 会说没问题,因为您的代码在技术层面上是正确的。

【讨论】:

  • 好的,我明白了。所以,即使一个方法有返回类型,我们也总是可以抛出异常而不实际返回值。这在技术上可能是正确的,但在逻辑上是不正确的。如果我错了,请纠正我。
  • @the_novice 在您决定退出方法的每个点(以及它结束的点)的方法中,您可以抛出异常或返回某些内容(如果方法被定义为返回没有什么可以用普通的return; 退出它。
  • @the_novice 如果您的问题得到解答,您能否投票并接受答案?
【解决方案3】:

异常将你从被调用的方法中强行踢出。然后强制调用方法捕获异常并继续计算,而不访问被调用方法的返回值。

如果异常是不可避免的/无条件的,那么后面的 return 语句就没有必要或有用。

【讨论】:

    猜你喜欢
    • 2013-04-27
    • 2019-03-12
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 2019-11-07
    • 2012-01-09
    • 1970-01-01
    • 2012-04-06
    相关资源
    最近更新 更多