范围局部变量和条件的问题

时间:2009-06-24 03:36:31

标签: java variables core local

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

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块返回的适当方法是什么?如果那是不可能的,你会建议最好的设计方法是什么?

万分感谢你 最亲切的问候

6 个答案:

答案 0 :(得分:10)

如果您将空字符串作为参数会发生什么?

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

boolean isValid = false;

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

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

答案 1 :(得分:2)

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

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

答案 3 :(得分:0)

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

  

局部变量(§14.4,§14.13)必须   在它之前明确给出一个值   通过初始化使用   (§14.4)或转让(§15.26),a   可以通过的方式验证的方式   编译器使用规则确定   分配

参见4.5.5 Java语言规范中变量的初始值:

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语句,让方法正常返回。

答案 4 :(得分:0)

我同意答案,声明你应该初始化isValid布尔变量。

但是,您可以使用regular expression

执行所需操作
/*
* 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'。

$ ^表示空字符串

答案 5 :(得分:0)

请注意,您的循环只会返回true或false,具体取决于字符串中的最后一个char。你想做的是像

public boolean isStringValid(String s) {
  for (char c : s.toCharArray()) {
    if (!('A' == c || 'B' == c || 'C' == c)) { 
      return false;
    }
  }       
  return true;
}