我在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语句的要点是能够捕获错误并返回描述错误的字符串,而不必担心匹配函数的返回类型。
答案 0 :(得分:3)
因为您错过了return
声明。
该方法声明它返回一些内容,因此必须返回一些内容(或抛出异常)。如果在执行任何一个异常之前抛出异常,编译器就无法保证return
块中的任何try
语句都会到达。所以catch
块也需要返回一些东西(或抛出一个异常,或者完全返回try/catch
构造之后的东西)。
修改:再看一下,您可能还错过了return
区块中的try
。 (如果在整个try/catch
结构之后没有一个。)如果满足if/else
结构中的所有条件,该怎么办?什么都没有归还。这是无效的。
基本上,所有逻辑路径都必须导致方法的有效退出。你错过了两条这样的道路。
答案 1 :(得分:2)
你没有在几个路径上返回函数中的任何内容。
但我认为catch语句的要点是能够捕获错误并返回描述错误的字符串,而不必担心匹配函数的返回类型。
这完全不是try-catch
所做的,而且你的函数被声明为返回Point
而不是String
。
try-catch
只是“捕获”Throwable
(Error
或Exception
)并允许您在抛出代码时运行一些代码,而不是简单地使用Uncaught Exception/Error
。
你需要在try-catch
无法返回字符串之后从函数中返回一些值,也没有一个语言结构就像你已经解释了你对{{1}的理解一样}。
此外,您的代码实际上不会抛出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(); }
}
答案 2 :(得分:1)
您缺少两部分:
1. try块中的return
语句用于else条件
2. Catch块不会导致return
语句或throw
语句
我不知道第一,第二,第三变量的类型是字符串还是Point,但是你应该使用Point返回,因为你的函数是: public Point get(String p){ ... }
答案 3 :(得分:-1)
你有三个if语句。当输入不满足任何一个时会发生什么?您的方法没有针对该案例的return语句。