我有这两种方法,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()可以在不返回任何内容的情况下结束。
答案 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