返回ifs混淆Java

时间:2011-11-02 19:05:45

标签: java if-statement return

我有这两种方法,Java无法在getNumEmails()中找到“return”。所有这些都在同一个类中,只有静态方法

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

我知道解决方案很简单,要删除“else”并将其返回cont;过了一会儿。但我想知道为什么Java认为getNumEmails()可以在不返回任何内容的情况下结束。

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

因此你需要在while语句之后返回。

答案 2 :(得分:0)

Java编译器无法静态(在编译时)验证while循环是否完全执行(第一次调用时posSymbol可能是-1。因此错误。

一般来说,在成员变量中保持循环状态并不是一个好主意。如果多个线程执行您的方法(例如在Web服务器中),该怎么办?从长远来看,如果您的代码没有修改全局状态,则更容易追踪错误:

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

答案 3 :(得分:0)

只需在“//关闭时间”之后添加return 0;

答案 4 :(得分: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