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

空の文字列を引数として取得するとどうなりますか?

コンパイラは、常に何かを返すことを確認する必要があります。isValid 変数を false で初期化します。このようにすると、メソッドが空の文字列を取得した場合、デフォルト値が返されます。

boolean isValid = false;

Java では、初期化されていない可能性のある変数を返すことはできません。可能なすべてのフローで、変数に任意の値が設定されていることを確認してください。

更新:これで質問は解決しますが、メソッドのロジックが正しくないため、以下の回答を確認することをお勧めします

于 2009-06-24T03:40:58.917 に答える
2

メソッドが間違っています (Victor が説明したコンパイラ エラーに加えて)。最後の文字が C で、それ以外がすべて D の場合、true が返されます。また、char を使用する必要があり、論理 OR には 2 つのバー (||) が必要です。試す:

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 に答える
2

おそらく、for は実際にはループしないかもしれません。そのため、isValid は設定されていません。

于 2009-06-24T03:39:51.180 に答える
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 に答える
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' のいずれでもない文字が少なくとも 1 つ含まれているかどうかを確認していることを意味します。

$^ は空の文字列を意味します

于 2009-06-24T04:36:01.677 に答える