質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

333閲覧

直接入力した場合と初期化した場合で結果が変わってしまうのを修正したい

yashiromisa

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

0クリップ

投稿2020/05/01 12:34

前提・実現したいこと

コンソールから変数を代入した時に正しく分岐させたいです。
変数bld1,bl2にそれぞれ'A','B','O'のいずれかの値を入れてその組み合わせで血液型を求めるプログラムを書いています。

発生している問題・エラーメッセージ

同じ内容で初期化した時とコンソールから打った時とで結果が変わってしまいます。
String bld1 = "O";
String bld2 = "A";
といった様に初期化すると正常に'A'という結果が得られますが、Scannerを使ってコンソールから'O','A'とそれぞれ打ち込んだ場合毎回N/Aと出てしまいます。

package app; import java.util.*; class App { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String bld1 = sc.nextLine(); String bld2 = sc.nextLine(); sc.close();      //String bld1 = "O";      //String bld2 = "A"; System.out.println(bld1+bld2); if( (bld1=="A" && bld2==bld1) || (( bld1=="A" && bld2=="O" ) || (bld1=="O" && bld2=="A"))){ System.out.println("A"); }else if( (bld1=="B" && bld2==bld1) || (( bld1=="B" && bld2=="O" ) || (bld1=="O" && bld2=="B"))){ System.out.println("B"); }else if((bld1=="A"&& bld2=="B")||(bld1=="B" && bld2=="A")){ System.out.println("AB"); }else if(bld1=="O" && bld2==bld1){ System.out.println("O"); }else{ System.out.println("N/A"); } } }

試したこと

if文の前にbld1とbld2の中身を参照するprint文を挟み確認しましたが、初期化した場合とコンソールからとで違いは見受けられず、原因がわかりませんでした。

補足情報(FW/ツールのバージョンなど)

visual studio code

swordone👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

参照型は==で比較することができません。==で比較しようとすると変数の参照を比較してしまいます。
参照型を比較したい場合はbld1.equals("A")というようにequalsメソッドを使っては比較します。
そのため、sc.nextLine();で受け取ったA(O)と後で作成したA(O)は同じA(O)ですが、参照が異なるためfalseが返ってしまい、結果として"N/A"が出力されます。

String bld1 = "O"; String bld2 = "A";

としたときに正しく動いた理由はコンスタントプールという仕組みがあるためです。
""を使って文字列リテラルを生成すると、以降同じ文字列リテラルが""で作成されたときは初めに作成された文字列リテラルと同じ参照を指すようになります。

投稿2020/05/01 13:02

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Stringを==で比較してはいけません。
==はインスタンスの参照が同じかどうかの判定になり、リテラルと入力文字では一致しません。
リテラル同士で一致するのは、コンパイラによる最適化により、同じリテラルは同じ参照になるような仕組みになっているからです。
いずれにせよ予期しない動作になるので、equals()を使った比較にしてください。

投稿2020/05/01 12:40

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yashiromisa

2020/05/01 13:05

正常に動作するようになりました。ご助力感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問