3

CodingBat.com (extraFront) で基本的な Java 文字列の問題を解決しています。

タスクは、任意の長さの文字列を指定して、最初の 2 文字を 3 回繰り返して返すことです。この最初の例は、私が直感的にやったことです。

public String extraFront(String str) {

  if (str.length() <= 2){
    String front = str;
  }else{
    String front = str.substring(0,2);
  }
  return front+front+front;
}

これにより、エラーが発生します。フロントを解決できません。ループの外側で変数を定義する必要があると推測したので、コードを次のように変更しました。これはエラーなしで機能します。

public String extraFront(String str) {

  String front;

  if (str.length() <= 2){
    front = str;
  }else{
    front = str.substring(0,2);
  }
  return front+front+front;
}

とにかく変数が宣言されるので、なぜこれが違いを生むべきなのか、私を困惑させているのはなぜですか?これは CodingBat がコードを処理する方法の特異性ですか、それとも実際にはエラーですか? もしそうなら、なぜこの間違ったコードなのですか? そして、それが間違っていなければ、スタイルが悪いのでしょうか?

4

2 に答える 2

4

とにかく変数が宣言されるので、なぜこれが違いを生むべきなのか、私を困惑させているのはなぜですか?

それはスコープの問題です。変数は、それが宣言されているブロック内でのみ表示されます。これは CodingBat とは何の関係もありません。CodingBat は Java 言語の一部です。JLS のセクション 6.3から:

宣言のスコープは、プログラムの領域であり、宣言によって宣言されたエンティティーが可視である場合は、単純な名前を使用して参照できます (§6.4.1)。
...
ブロック内のローカル変数宣言のスコープ (§14.4) は、宣言が表示されるブロックの残りの部分であり、独自の初期化子から始まり、ローカル変数宣言ステートメントの右側にさらに宣言子があればそれを含みます。

また、次のような状況で役立つ条件演算子についても学ぶことをお勧めします。

String front = str.length() <= 2 ? str : str.substring(0, 2);
于 2013-04-16T15:09:18.190 に答える