[英]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.