ユーザー入力からの文字列の読み取りとチェック

こんなコードがあります。

import java.util.Scanner;

public class Example {
public static void main(String[] args) {

    Scanner input = new Scanner(System.in);
    String answer = input.nextLine();

    if(answer == "yes"){
        System.out.println("Yea I programmed this right!");
    }else{
        System.out.println("Awww :(");
    }
  }
}

しかし、これを実行し、yesと入力すると、次のように表示されるはずです。

"Yea I programmed this right!" と表示されるはずです。

と表示されるはずなのですが、次のように表示されます。

"Awww :("

ソリューション

文字列の比較に誤りがあります。このように equals() メソッドを使用しなければなりません。

if (answer.equals("yes"))

Java でプログラミングをする場合、演算子 == は一般的にプリミティブなデータ型 (int, double など) を比較するために使用されます。もし、2つのオブジェクト型(文字列など)を比較するために == を使用した場合、identity を比較することになり、つまり、メモリ上で同じオブジェクトを参照しているかどうかをチェックすることになります。この場合、必要なのはそれらが_equal_であるかどうか、つまり、2つの異なるオブジェクトであっても、それらがまったく同じ値(この場合は文字列)を持つかどうかを比較することであり、そのためには equals() メソッドを使用しなければなりません。

編集:

さらに良いことに、NullPointerExceptionを防ぐために、比較の順番を逆にして、このように比較する文字列を先に書くことが良い方法とされています。

if ("yes".equals(answer))

もし何らかの理由で answernull だった場合、上記の比較は false (つまり、 answer"yes" ではない) と評価されますが、最初のバージョンのコードでは null 値に対して equals() メソッドを呼ぼうとすると NullPointerException を発生させるのです。

解説 (2)
if(answer == "yes"){

であるべき

if("yes".equals(answer)){

(==String の等号としては正しくなく、answer が null の場合を処理します)

解説 (0)

文字列の代わりに String.equals() を使用します。

Javaでは、==は2つのStringが全く同じインスタンスであることをテストしています、ここで "a" != "a". その代わりに、 "a".equals("a") をテストする必要があります。

そこで、次のように置き換えます。

if(answer == "yes"){

に置き換えてください。

if("yes".equals(answer)){

これは、answer が NULL だった場合に NullPointerException を発生させないためです。 (null に対する操作を呼び出すと、NullPointerException がスローされます。

解説 (0)