【问题标题】:Java: missing return statement after try-catch [duplicate]Java:try-catch 后缺少返回语句 [重复]
【发布时间】:2016-02-05 19:10:56
【问题描述】:

我在Triangle 类中使用下面的代码来允许用户设置声明的Triangle 的第一个、第二个或第三个点。

public Point get(String p) throws IllegalArgumentException {
    IllegalArgumentException e = new IllegalArgumentException();
    try {
        if (p == "first") { return first; }
        else if (p == "second") { return second; }
        else if (p == "third") { return third; }
        else { throw e; }
    }
    catch (e) {
        System.out.println("Error: " + e);
    }
}

编译器告诉我:

Triangle.java:41: error: missing return statement
    }
    ^

但我认为 catch 语句的重点是能够捕获错误并返回描述错误的字符串,而不必担心匹配函数的返回类型。

【问题讨论】:

标签: java


【解决方案1】:

因为您缺少return 声明。

该方法声明它返回一些东西,所以它必须返回一些东西(或抛出异常)。如果在任何一个语句执行之前抛出异常,编译器不能保证将到达try 块中的任何return 语句。所以catch 块也需要返回一些东西(或者抛出异常,或者在try/catch 构造之后完全返回一些东西)。

编辑:再看一遍,您还可能在try 块中缺少return。 (如果在整个try/catch 结构之后没有一个。)如果if/else 结构中的条件都不满足怎么办?什么都没有返回。哪个无效。

基本上,所有逻辑路径都必须导致方法的有效退出。你错过了两条这样的路径。

【讨论】:

    【解决方案2】:

    您不会在多个路径上的函数中返回任何内容。

    但我认为 catch 语句的重点是能够捕获错误并返回描述错误的字符串,而不必担心匹配函数的返回类型。

    这根本不是 try-catch 所做的事情,而且您的函数被声明为返回 Point 而不是 String

    try-catch 只是“捕获”ThrowableErrorException)并允许您在抛出它时运行一些代码,而不是简单地使用 Uncaught Exception/Error 终止应用程序。

    您需要在 try-catch 之后从您的函数中返回一些值,没有办法返回字符串,也没有一种语言结构可以表现得像您解释了您对 try-catch 的理解一样。

    此外,您的代码实际上不会抛出 IllegalArgumentException,因此您的 catch 块将永远不会被调用。在这种情况下,听起来你想要的是这样的

    public Point get(String p) throws IllegalArgumentException {
            if (p == null) { throw new IllegalArgumentException(); }
            if (p.equals("first")) { return first; }
            else if (p.equals("second")) { return second; }
            else if (p.equals("third")) { return third; }
            else { throw new IllegalArgumentException(); }
    }
    

    然后可以像这样调用代码

    Point p;
    try {
        p = get("notFirst");
    } catch (IllegalArgumentException ex) {
        //oh no, we gave a bad argument, and the method told us nicely.
    }
    

    【讨论】:

    • 我没有看到他返回一个字符串,我看到他返回一个未知类型的命名变量,这很可能是一个点
    • 我同意@Shadow,但请阅读引用的部分。 “返回一个描述错误的字符串,而不必担心匹配函数的返回类型”这听起来更像是他想要 throwException 而不是处理一个(因为这些代码实际上都不能抛出 @987654337 @无论如何。
    • 是的,但“返回一个字符串”是指在他的catch 块中使用System.out.println()。对于函数上的throws IllegalArgumentException,无论哪种方式都 +1
    • 嗯,这很有道理。好吧,我想我会保持原样,如果可能的话让他回来澄清。谢谢影子。
    【解决方案3】:

    您缺少两个部分: 1. try 块中的 return 语句用于 else 条件 2.catch 块不会导致return 语句或throw 语句

    我不知道第一个、第二个、第三个变量的类型是字符串还是点,但你应该用点返回,因为你的函数是: 公共 Point get(String p) { ... }

    【讨论】:

      【解决方案4】:

      你有三个 if 语句。当输入不满足其中任何一个时会发生什么?您的方法没有针对这种情况的 return 语句。

      【讨论】:

        猜你喜欢
        • 2018-10-14
        • 2014-09-22
        • 2013-10-01
        • 2013-03-21
        • 2016-01-04
        • 2020-05-28
        • 2021-05-27
        • 2014-01-09
        • 2013-10-27
        相关资源
        最近更新 更多