public static boolean check()throws Exception
{
if(a=="asd")
return true;
else
return false;
}
这很好用 但如果我使用
public static boolean check()
{
try
{
if(a=="asd")
return true;
else
return false;
}
catch(Exception e)
{
}
}
它说你需要返回一个值,,,,这两个之间有什么区别???
答案 0 :(得分:8)
你需要在 catch 中返回一些东西,一个方法总是需要返回一些东西,即使是在catch中,除非你抛出/重新发生异常。
答案 1 :(得分:5)
是的,有区别。您的第二个代码块将捕获 if
语句中的任何异常并吞下它,然后在catch
块后继续运行。但是那里没有return
语句,所以如果有任何异常,该函数将没有返回值。
另一方面,第一个代码块使用throws
来表示Exception
后代可以从中逃脱而不是被捕获,因此它不需要捕获和处理任何东西,并且编译器准备允许函数不返回任何内容(由于异常提前退出)。
答案 2 :(得分:3)
Java有方法,而不是函数。所以你没有写一个函数,而是一个方法。此外,将字符串与==
进行比较在Java中不起作用。您必须改为调用equals()
方法:
if (a.equals("asd"))
第二段代码中的问题是:如果发生异常会发生什么?执行catch
块的内容,然后执行该方法的其余部分。请注意,catch块后面没有代码。但该方法要求您返回boolean
- 您错过了return
语句。改变它:
public static boolean check()
{
try
{
if (a.equals("asd"))
return true;
else
return false;
}
catch(Exception e)
{
}
// You need to add a return statement here
return false;
}
还有一些关于您的代码的评论。
首先,将catch
块留空是一个坏主意。因为当发现异常时,什么都不会发生,你永远不会知道出了什么问题。始终适当地处理异常。
此外,代码如下:
if (a.equals("asd"))
return true;
else
return false;
可以像这样简化:
return a.equals("asd");
表达式a.equals("asd")
的结果已经是布尔值;为什么你会再次检查它是真还是假,然后返回真或假?
答案 3 :(得分:0)
并非代码中的所有路径都会返回值。由于你有一个catch,如果抛出异常,将不会返回任何值,因为catch中的代码将执行。
答案 4 :(得分:0)
我认为你应该在catch之后返回函数末尾的值。尝试将结果存储在一个布尔变量中,并在catch后返回该变量。这可以解决您的问题
答案 5 :(得分:0)
前提: a ==“asd”不是'错'但可能最好使用a.equals(“asd”),因为==比较指针,而不是相等。例如(“asd”==“asd”)== false但是(“asd”.equals(“asd”))== false
如果if(a ==“asd”)抛出异常,则流进入catch,然后退出而不会找到return语句。正确的代码可以在catch块中有一个return语句
答案 6 :(得分:0)
Jesper的回答几乎涵盖了它。我需要显示一些代码,因此这个单独的答案。
您必须在每种情况下决定如何处理异常。 Jesper和LordSAK都选择了“假”。这样做的一个问题是你无法区分错误条件和'a'不等于“asd”的情况。
一种可能的解决方案是将方法的返回类型更改为Boolean(基元boolean的Object版本),并在发生异常时返回“null”
public static Boolean check() {
try {
return "asd".equals(a);
}
catch(Exception e) {
return null;
}
}
另一种选择是将您的异常作为未经检查的异常重新抛出:
public static boolean check() {
try {
return "asd".equals(a);
}
catch(Exception e) {
throw new RuntimeException("Problem during check", e);
}
}
这种方法的一个缺点是调用check()方法的代码不会期望抛出运行时异常。由于未选中此类异常,如果开发人员没有使用try-catch包围对check()的调用,则不会收到编译器警告。
第三个选项是声明异常并让你的调用代码处理它。一个完整的例子:
import org.apache.log4j.Logger;
public class Checker {
private static final Logger LOG = Logger.getLogger(Checker.class);
private String a;
public Checker(String value) {
a = value;
}
public boolean check() throws Exception {
return "asd".equals(a);
}
public static void main(String[] args) {
Checker app = new Checker("Stackoverflow");
try {
app.check();
}
catch(Exception e) {
LOG.error("Problem during check", e);
}
}
}
一个优点是你不必在出现错误时决定check()返回哪个值,而是只返回错误本身。这实际上就是“抛出”异常的整个想法。
根据经验:如果你不能在方法本身内处理异常,那么抛出它并让调用代码处理它。
野外的一个例子:一个处理异常的方法。
private static final long DEFAULT_TIMEOUT = 60000;
public long getTimeout(String timeoutArg) {
try {
return Long.parseLong(timeoutArg);
}
catch(NumberFormatException e) {
return DEFAULT_TIMEOUT;
}
}
注意:我没有编译或运行任何此代码,因此可能存在拼写错误。