2011-04-01 52 views
0

我写了一个函数一样为什么我收到错误如果我使用尝试捕捉

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

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

+2

在旁注中总是尝试使用“asd”.equals(a)来比较两个字符串,否则您将得到错误的结果。 – Pushkar 2011-04-01 07:29:17

+2

作为一个方面说明,在实验代码中有空的catch块是可以的,但是**不要在生产代码中这样做**(除非你或者你的队友喜欢花费很长时间/晚的时间进行调试,尝试找出神秘错误的根源,那就是)。 – 2011-04-01 07:30:47

回答

8

您需要在返回的东西,一种方法总是需要,除非你扔/ rethow异常返回的东西,甚至在抓,

5

是的,有区别。您的第二个代码块将捕获任何异常从if声明并吞下它,然后在catch块之后继续运行。但是那里没有return语句,所以如果有任何异常,函数将没有返回值。

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

0

并非代码中的所有路径都会返回一个值。由于你有一个catch,如果抛出一个异常,将不会返回任何值,因为catch中的代码将被执行。

0

我想你应该在函数结束后返回值。尝试将结果存储在一个布尔变量中,并在捕获后返回该变量。这可能会解决你的问题

0

前提: a ==“asd”不是'错误',但可能最好使用a.equals(“asd”),因为==比较指针而不是相等。例如(“asd”==“asd”)== false但是(“asd”.equals(“asd”))== false

如果if(a ==“asd”)抛出异常,流量进入捕获状态,然后退出而没有发现返回语句。正确的代码可以在catch块中有return语句

+1

我想你的意思是''asd“==”asd“'是'true'而不是'false'。此外,''asd“.equals(”asd“)'也是'true'。 – Jesper 2011-04-01 07:32:48

+0

没有那么明确。不要使用== EVER字符串比较这是因为实际的字符串指针不能保证是相同的。 “asd”==“asd”是新字符串(“asd”)==新字符串(“asd”)的快捷方式 并且您可以看到对象不同(因为都是新的) 但是,如果您do:String a =“asd”; (a == a)== true,因为你实例化“asd”只有一次,并重新使用指针 – Wishper 2011-04-01 07:37:21

+0

@Jesper好吧,第二个想法(我试过了) (“asd”==“asd”)== true 但这是一个非常糟糕的做法,因为这种行为并不能保证 – Wishper 2011-04-01 07:46:03

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

0

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

您必须在每种情况下决定如何处理异常。 Jesper和LordSAK都选择返回'假'。与此相关的问题是,您无法区分错误情况与“a”不等于“asd”的情况。

一个可能的解决方案是该方法的返回类型更改为布尔(原始布尔的对象版本),并在情况下返回异常

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

这种方法的缺点是,代码调用您的支票()方法不指望一个运行时异常被抛出。由于这种类型的异常未经检查,如果开发人员没有用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); 
     }     
    } 
} 

一个优点是,你没有决定哪些值检查()返回一个错误的情况,而是你刚才返回错误本身。这实际上是'抛出'例外的整个想法。作为一个经验法则:如果你不能在方法本身内处理异常,那么抛出它并让调用代码处理它。

来自野外的一个例子:处理异常本身的方法。

private static final long DEFAULT_TIMEOUT = 60000; 

public long getTimeout(String timeoutArg) { 
    try { 
     return Long.parseLong(timeoutArg); 
    } 
    catch(NumberFormatException e) { 
     return DEFAULT_TIMEOUT; 
    } 
} 

注意:我没有编译或运行这些代码,所以可能会出现拼写错误。