繁体   English   中英

为什么使用try catch时会出现错误

[英]Why i am getting Error if i use try catch

我写了一个像

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)
{
}
} 

它说您需要返回一个值,两者之间有什么区别吗???

您需要在catch中返回某些内容,即使您在catch中 ,一种方法也总是需要返回某些内容, 除非您抛出/重新构造异常

是,有一点不同。 您的第二个代码块将从if语句捕获任何异常并将其吞下,然后在catch块之后继续运行。 但是那里没有return语句,因此,如果有任何异常,该函数将没有返回值。

另一方面,第一个代码块使用throws表示Exception后代可以从中逃脱而不是被捕获,因此它不需要捕获和处理任何东西,并且编译器准备允许该函数不返回任何内容(由于从异常中提早退出)。

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")的结果已经是布尔值; 为什么要再次检查它是真还是假,然后返回真还是假?

并非代码中的所有路径都将返回值。 由于在那里有一个catch,因此如果引发异常,则将不返回任何值,因为将执行catch中的代码。

我认为您应该在catch之后在函数末尾返回值。 尝试将结果存储在一个布尔变量中,并在catch之后返回该变量。 这可以解决您的问题

一个前提:a ==“ asd”并非“错误”,但使用a.equals(“ asd”)可能更好,因为==比较指针而不是相等。 例如((asd“ ==” asd“)==假,但是(” asd“ .equals(” asd“))==假

如果if(a ==“ asd”)引发异常,则流程进入catch,然后退出,而未找到return语句。 正确的代码可以在catch块中包含return语句

Jesper的答案几乎涵盖了这一点。 我需要显示一些代码,因此需要单独的答案。

您将必须在每种情况下决定如何处理异常。 Jesper和LordSAK都选择返回“ false”。 这样做的问题是,您无法将错误条件与“ a”不等于“ asd”的情况区分开。

一种可能的解决方案是将方法的返回类型更改为布尔值(原始布尔值的对象版本),并在出现异常的情况下返回“ 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;
    }
}

注意:我没有编译或运行任何此类代码,因此可能会有输入错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM