1

我正在尝试构造返回布尔值的方法:

public boolean isStringValid(String s){
    boolean isValid;
    String temp = null;     
    // only combinations of 'A','B','C' are allowed
    for (int i = 0; i < s.length(); i++)
    {
        temp = s.substring(i, i+1);
        if (temp.equals("A")|temp.equals("B")|temp.equals("C")){
            isValid= true;
        }else{
            isValid= false;
        }
    }   
    return isValid;
}

但是我得到一个编译器错误,说“局部变量 isValid 可能没有被初始化”。

我想要做的是获取一个字符串并检查它的每个字母,如果在字符串中找到除 A、B 或 C 以外的任何字母,isStringValid 方法应该返回一个 false。只有在检查每个字母并发现是 A、B 或 C 之后,该方法才能返回 true。

我想我无法确定局部变量的范围。该方法从 if/else 块中返回的适当方式是什么?如果这是不可能的,你会推荐什么是最好的设计方法?

谢谢你最诚挚的问候

4

6 回答 6

10

如果你得到一个空字符串作为参数会发生什么?

编译器需要确保你总是返回一些东西。用 false 初始化你的 isValid 变量,这样如果方法得到一个空字符串,它只会返回默认值

boolean isValid = false;

在 Java 中,您不能返回可能未初始化的变量,只需确保在所有可能的流程中该变量设置为任何值。

更新:这将解决您的问题,但我建议您查看下面的答案,因为您的方法的逻辑不正确

于 2009-06-24T03:40:58.917 回答
2

也许 for 实际上可能不会循环。所以 isValid 没有设置。

于 2009-06-24T03:39:51.180 回答
2

该方法是错误的(除了 Victor 解释的编译器错误)。如果最后一个字母是 C 而其他都是 D 它将返回 true。此外,您应该使用 char,并且您需要两个竖线 (||) 来表示逻辑或。尝试:

public boolean isStringValid(String s){             
            // only combinations of 'A','B','C' are allowed
            for (int i = 0; i < s.length(); i++)
            {
                    char tempChar = s.charAt(i);
                    if (!(tempChar == 'A' 
                       || tempChar == 'B' 
                       || tempChar == 'C'))
                        return false;
            }       
            return true;
}

如果要为空字符串返回 false,请在开头执行此操作:

if(s.length() == 0)
  return false;
于 2009-06-24T03:51:38.637 回答
0

该变量isValid是一个局部变量。在 Java 语言规范中:

局部变量(第 14.4 节、第 14.13 节)必须在使用之前通过初始化(第 14.4 节)或赋值(第 15.26 节)显式地赋予一个值,编译器可以使用明确的规则来验证任务。

请参阅 Java 语言规范中的第 4.5.5 节变量的初始值:

http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html

将变量初始化为 false 以开始,然后仅在方法的正确部分将其设置为 true,即此处:

if (temp.equals("A")|temp.equals("B")|temp.equals("C")){
   isValid = true;
}

删除 else 语句,让方法正常返回。

于 2009-06-24T04:35:39.087 回答
0

我同意您应该初始化 isValid 布尔变量的答案。

但是,你可以用正则表达式做你想做的事

/*
* returns false if s contains a character different from 'a' 'b' or 'c' 
*/
public boolean isStringValid(String s){
     return !Pattern.matches("($^|[^abc]+)",s);
}

[abc] 表示您正在检查 s 是否包含 'a'、'b' 或 'c' 字符

[^abc] 表示您正在检查 s 是否包含不属于“a”、“b”或“c”的字符。

[^abc]+ 表示您正在检查 s 是否包含至少一个不属于“a”、“b”或“c”的字符。

$^ 表示空字符串

于 2009-06-24T04:36:01.677 回答
0

请注意,您的循环将仅根据字符串中的最后一个字符返回 true 或 false。你想做的是像

public boolean isStringValid(String s) {
  for (char c : s.toCharArray()) {
    if (!('A' == c || 'B' == c || 'C' == c)) { 
      return false;
    }
  }       
  return true;
}
于 2009-06-25T16:50:17.790 回答