如果我使用try catch,为什么我会收到错误

时间:2011-04-01 07:22:05

标签: java

我写了一个像

这样的函数
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)
{
}
} 

它说你需要返回一个值,,,,这两个之间有什么区别???

7 个答案:

答案 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;
    }
}

注意:我没有编译或运行任何此代码,因此可能存在拼写错误。