2011-11-02 61 views
2

我有这两个方法,Java无法在getNumEmails()中找到“返回”。所有这些都在同一个班,其中只有静态方法ifs混淆Java内部返回

private static int posSymbol=0; 
private static int cont=0; 
private static String text=null; 


private static int getPosSymbol(){ 
    posSymbol=text.indexOf('@',posSymbol);//if there is no symbol, returns -1 
    return posSymbol; 
} 

//Main calls this method 
public static int getNumEmails(String completeText){ 
    text=completeText; 

    while(posSymbol!=(-1)){ 

     posSymbol=getPosSymbol(); 

     if(posSymbol!=(-1)){ 
       cont++; 
       posSymbol++; 
     }//close if 
     else{ 
       return cont; //It seems that it doesn't reach the return always 
     }//close else 
     }//close while 
}//close method 

我知道,解决方法很简单,删除了“其他”,并把返回续;过了一段时间。但是我想知道为什么Java认为getNumEmails()可以在不返回任何东西的情况下结束。

+1

这肯定会退出而不返回如果getPosSymbol的值()为-2或从来没有-1 ... – Kendrick

+1

是什么使你认为它会始终返回的东西吗? 'else'子句可能永远不会被执行。 –

+0

@Kendrick。是真的,但编译器不会进入该级别的考试。它只是看到一个'else'。 –

回答

4

我想这是关于编译器抱怨This method must return a result of type int

虽然编译器有时可以确定函数是否会达到return语句,但并非总是如此。静态地确定程序的动态行为在数学上是不可能的。
这在计算机科学中被称为“暂停问题”在一般情况下,如果程序将会或不会终止,则无法确定。
因此,即使您可以确定该方法总是会到达您的return语句之一,但编译器可能无法做到这一点。

+0

我怀疑程序可能在查找返回时遇到问题,因为它只考虑方法本身(没有任何其他数据在方法外)或者试图验证对黑箱测试的访问(使用随机值或其他)现在我知道了真相,谢谢。顺便说一句,我不知道编译器是否可以处理这个代码,即使它找不到返回(可能不是,但谁知道......) – Arkonor

+0

现在我正在考虑它。如果程序本来就更复杂,那么我可能会遇到很多问题以寻找解决问题的方法。在这种情况下,我只需要在“while”之后放置“return”,但在另一个程序中它不可行 – Arkonor

+0

顺便说一句,如何在不添加注释的情况下使用返回键XD – Arkonor

2

可以在else子句中找到返回值。问题是你需要返回所有的执行路径,即使是posSymbol等于-1时也是如此,因为当posSymbol等于-1时,你永远不会进入while循环。

因此,您需要在while语句后返回。

+0

但while循环中的getPosSymbol()可以在检查while条件后返回-1值。 – Arkonor

+0

但这不是你写代码的方式。 while语句有一个范围,除非while子句中的条件满足,否则它将永远不会执行。由于return语句在while范围内,因此不会执行。 – Patrick

+0

我可以向你保证,我试图设置posSymbol = 0之前,仍然没有工作 – Arkonor

0

Java编译器不能静态地(在编译时)确认while循环得到所有执行(posSymbol可能是-1在第一次调用)。因此错误。

通常,在成员变量中保持循环状态并不是一个好主意。如果多个线程执行您的方法(例如在Web服务器中)会怎么样?从长远来看,它更容易追踪bug,如果你的代码不修改全局状态:

public static int getNumEmails(String completeText) { 
    int count = 0; 
    Matcher m = Pattern.compile("@").matcher(completeText); 
    while (m.find()) { 
     count++; 
    } 
    return count; 
} 
+0

我不知道这些方法是如何工作的。请,你能解释他们吗?顺便说一句,我从来没有想过在同一时间运行这个程序的多个用户。我将来必须考虑到这一点。 – Arkonor

+0

该代码试图通过使用正则表达式来查找'completeText'中有多少个'@'。你可以在这里查看它:http://download.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html。 – Matt

0

的“//关闭,而”后,只需添加一个return 0;

+0

可能发生该方法在结束之前返回2个不同的值。它可能会导致整个程序崩溃。对不起,但它不能解决我的问题。 – Arkonor

+0

一个方法只能返回一个值。返回意味着方法退出,它不会再运行。 – Stephan

+0

这是休息吗? – Arkonor

0

不是一个答案,但这里有一个更安全的版本的方法没有静态变量。

//Main calls this method 
public static int getNumEmails(String completeText) 
{ 
    int posSymbol=0, count=0; 
    while(posSymbol!=(-1)) 
    {   
     posSymbol=completeText.indexOf('@',posSymbol); //if there is no symbol, returns -1 
     if(posSymbol!=(-1)) 
     { 
      ++count; 
      ++posSymbol; 
     }//close if 
    }//close while 
    return count; 
}//close method 
+0

这就是我最后做的。我意识到其他方面也意味着程序结束。因此,我可以在确定程序总是遇到回报的情况下放回去。 – Arkonor

+0

@肯德里克 - 同意,这样更安全。但是,如何将'indexOf()'调用放入'while'循环的条件检查中呢? –

+0

@ X-Zero也是有效的,谢谢 – Arkonor