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

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

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

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Q&A

解決済

2回答

1336閲覧

①whileによる繰り返し入力が正常に働かない。②switch文のcase内部が最後まで実行されない。

Y.Mamoru

総合スコア47

Java

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

0グッド

0クリップ

投稿2020/08/14 05:43

○やりたいこと
簡単な社員名簿アプリを作っています。
登録する情報は社員番号、名前、部署のみです。
実行するにあたり、以下のバグが発生します。調べながらデバッグしているのですが原因が分かりません。助力お願いします。

 ①case"-u"の内部において、最後のSystem.out.println("変更登録が完了しました");のあと、switch文をwhile文に戻って最初の"コマンドを入力してください"に戻りたいのですが、戻ることなくエラーが起こり止まってしまいます。
私の考えとしては、"変更登録が完了しました"までは表示されるのでcase"-u"内部は異常がなく、while文で異常がおるのかと思うのですが、他のcase文では問題なく繰り返し入力が可能なので、バグの箇所を見つけることができません。

②case"-d"において、入力した社員番号にあてはまる情報を表示し、その後yesを入力すれば消去、noを入力すれば消去しない。という動きをさせたいです。
しかし社員番号を入力後、"本当に消去してもよろしいですか?"が表示されると同時に、"データの消去を実行せずに終了します"と、noを入力した場合の文字も表示されます。
何故noが入力されたと判断されたのかがわかりません。アドバイスをお願いします。

Java

1package Java_Practice_1; 2 3import java.util.ArrayList; 4import java.util.Arrays; 5import java.util.Collections; 6import java.util.LinkedHashMap; 7import java.util.List; 8import java.util.Map; 9import java.util.Scanner; 10 11public class IO_Task_6 { 12 public static void main(String[] main){ 13 //各種定義 14 List<String> key = new ArrayList<String>(); //key用のlist 15 ArrayList<String> arlist = new ArrayList<String>(); //値用のlist 16 Map<List<String> , ArrayList<String>> map = new LinkedHashMap<List<String> , ArrayList<String>>();//mapの定義 17 String str; //入力された文字列情報として扱う 18 String[] info; //入力された3つの情報をわけて配列として扱う時に使う 19 String[] array; //配列収納用 20 21 //標準入力 22 Scanner scan = new Scanner(System.in); 23 24 25 while(true){ 26 //指示文 27 System.out.println("コマンドを入力して下さい。(-i:新規追加 , -u:変更 , -d:消去 , -v:一覧 , -s:ソート , -e:終了 , -m:モード選択)"); 28 String command = scan.nextLine(); 29 30 //switch文で切り替え 31 switch(command){ 32 //-i(新規追加) 33 case"-i"://","で区切って情報を3つ(社員番号・名前・部署)を入力。社員番号をkeyに残り2つをlistでまとめてMAPに代入 34 //繰り返し入力 35 while(true){ 36 //指示文 37 System.out.println("「社員番号 , 名前 , 部署」の順で入力しなさい"); 38 //新規追加情報の入力 39 str = scan.nextLine(); 40 //-mかどうかの確認 41 if(str != "-m"){ 42 //入力された文字を3つに分ける(配列に変換) 43 info = str.split("," , 0); 44 //info[]が3要素あれば進む。なければ注意文からのもう一度入力 45 if(info.length == 3){ 46 //社員番号配列をlistに変換 47 List<String> key_ex = Arrays.asList(info[0]); 48 //listに名前と部署を格納 49 arlist.add(info[1]); 50 arlist.add(info[2]); 51 52 //mapに社員番号とlistを格納 53 map.put(key_ex , arlist); 54 System.out.println("登録しました"); 55 break; 56 }else{ 57 System.out.println("「社員番号 , 名前 , 部署」で入力して下さい"); 58 continue; 59 } 60 } 61 } 62 break; 63 64 65 //-u(変更) 66 case"-u"://社員番号でデータを抽出してからになるかな。 67 //指示文 68 System.out.println("該当する社員番号を入力して下さい"); 69 String num = scan.next(); 70 //-mかどうか確認 71 if(num != "-m"){ 72 String[] hoge = num.split("," , 0); 73 List<String> hogehoge = Arrays.asList(hoge); 74 //値があるかどうかの確認 75 if(map.get(hogehoge) != null){ 76 //入力された番号からあてはまる値をmapから取得 77 arlist = map.get(hogehoge); 78 array = arlist.toArray(new String[0]); 79 //該当情報を表示 80 System.out.println("該当者は、社員番号:" + num + ",名前:" + array[0] + ",部署:" + array[1] + "ですね。"); 81 82 //指示文2 83 System.out.println("新たに「名前 , 部署」を入力して下さい"); 84 Scanner scan_2 = new Scanner(System.in); 85 str = scan_2.nextLine(); 86 String[] new_info = str.split("," , 0); 87 //新しい情報をlistに格納 88 arlist.add(new_info[0]); 89 arlist.add(new_info[1]); 90 91 // String[] num_1 = {num}; 92 // List<String> list_1 = Arrays.asList(num_1); 93 94 //mapに上書き格納 95 map.put(hogehoge , arlist); 96 System.out.println("変更登録が完了しました"); 97 scan_2.close(); 98 }else{ 99 System.out.println("その番号の社員はいません"); 100 } 101 } 102 break; 103 104 105 //-d(消去) 106 case"-d"://社員番号を指定して、消去に持っていく 107 //指示文 108 System.out.println("該当する社員番号を入力して下さい"); 109 num = scan.next(); 110 //-mかどうか確認 111 if(num != "-m"){ 112 String[] fuga = num.split("," , 0); 113 List<String> fugafuga = Arrays.asList(fuga); 114 //該当する人がいるかどうか確認 115 if(map.get(fugafuga) != null){ 116 //入力された番号からあてはまる値をmapから取得 117 arlist = map.get(fugafuga); 118 array = arlist.toArray(new String[0]); 119 //該当情報を表示 120 System.out.println("該当者は、社員番号:" + num + ",名前:" + array[0] + ",部署:" + array[1] + "ですね。"); 121 //消去の意思確認(if分岐を始める) 122 System.out.println("本当に消去してもよろしいですか?「yes」または「no」を入力して下さい"); 123 str = scan.nextLine(); 124 if(str == "yes"){ 125 map.remove(fugafuga); 126 System.out.println("社員番号" + num + "のデータを消去しました。"); 127 }else{ 128 System.out.println("データの消去を実行せず終了します。"); 129 } 130 }else{ 131 System.out.println("その番号の社員はいません"); 132 } 133 } 134 break; 135 136 137 //-v(一覧表示) 138 case"-v"://ループで有る分全て表示 139 System.out.println("現在登録されている社員一覧です"); 140 for(List<String> key_ex2 : map.keySet()){ 141 arlist = map.get(key_ex2); 142 array = arlist.toArray(new String[0]); 143 System.out.println("社員番号:" + key_ex2 + ",名前:" + array[0] + ",部署:" + array[1]); 144 } 145 146 break; 147 148 149 //-s(ソート) 150 case"-s"://上の一覧表示をもとにして、社員番号でソート 151 Collections.sort(key); 152 System.out.println("社員番号でソートが完了しました"); 153 break; 154 155 156 //-e(終了) 157 case"-e"://System.out.exit(0)でOKでしょう。 158 System.out.println("終了します"); 159 System.exit(0); 160 scan.close(); 161 break; 162 163 case"-m": 164 break; 165 166 default: 167 System.out.println("[-i:新規追加 , -u:変更 , -d:消去 , -v:一覧 , -s:ソート , -e:終了]の中から選んでください"); 168 break; 169 170 } 171 172 } 173 174 } 175} 176

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

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

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

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

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

y_waiwai

2020/08/14 05:54

エラーが出るならエラーメッセージを提示しましょう エラーメッセージは出たそのママを提示してください
Y.Mamoru

2020/08/17 00:00

確かにそうでした。 次からは載せるようにします。 ありがとうございます。
guest

回答2

0

if(num != "-m"){
if(str == "yes"){

Stringは参照型なのでその内容は==では比較できません。
num.equals("-m")のようにequalsメソッドを使って比較してください。
nullを避けるために、"-m".equals(num)の方がより安全です。

投稿2020/08/14 05:59

amiya

総合スコア1216

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

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

Y.Mamoru

2020/08/17 00:03

ありがとうございます! これは参照型だったんですね。そこを分かっていませんでした。 ありがとうございます。
guest

0

ベストアンサー

Scannerは複数宣言すると不具合の元になります。
whileで終了までcloseせず繰り返し使っているのですから、
上のscanをそのまま使いましょう。
またnextで読むと次のnextLineまで連続で読みこんでしまい、
その都度入力する場合問題になるのでnextLineを使って下さい。

java

1 //-u(変更) 2 case"-u"://社員番号でデータを抽出してからになるかな。 3 //指示文 4 System.out.println("該当する社員番号を入力して下さい"); 5 String num = scan.nextLine(); 6 //-mかどうか確認 7 if(num != "-m"){ 8 String[] hoge = num.split("," , 0); 9 List<String> hogehoge = Arrays.asList(hoge); 10 //値があるかどうかの確認 11 if(map.get(hogehoge) != null){ 12 //入力された番号からあてはまる値をmapから取得 13 arlist = map.get(hogehoge); 14 array = arlist.toArray(new String[0]); 15 //該当情報を表示 16 System.out.println("該当者は、社員番号:" + num + ",名前:" + array[0] + ",部署:" + array[1] + "ですね。"); 17 18 //指示文2 19 System.out.println("新たに「名前 , 部署」を入力して下さい"); 20 str = scan.nextLine(); 21 String[] new_info = str.split("," , 0); 22 //新しい情報をlistに格納 23 arlist.add(new_info[0]); 24 arlist.add(new_info[1]); 25 26 // String[] num_1 = {num}; 27 // List<String> list_1 = Arrays.asList(num_1); 28 29 //mapに上書き格納 30 map.put(hogehoge , arlist); 31 System.out.println("変更登録が完了しました"); 32 }else{ 33 System.out.println("その番号の社員はいません"); 34 } 35 } 36 break; 37

投稿2020/08/14 05:58

編集2020/08/14 05:59
yureighost

総合スコア2183

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

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

Y.Mamoru

2020/08/17 00:01

ありがとうございました。 やはり重ねない方が良かったのですね。 もともと考えていた構造的にはこれでいけると思ったんですが、確かに重ねるとややこしくなりますね。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問