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

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

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

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

Q&A

解決済

1回答

946閲覧

JAVAでCSVファイルの編集

kojima_desuyo

総合スコア8

Java

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

0グッド

0クリップ

投稿2018/02/11 09:58

編集2018/02/13 01:50

2回目の処理で情報が表示されない

javaで
CSVファイルに保存されている社員情報を表示・検索・登録・削除する
システムを作っています。
削除以外の機能が作り終わり、結合して実行をかけてみたところ、
社員情報を表示してトップメニューに戻ってからもう一度社員情報を表示しようとすると
社員情報が表示されないという問題が発生しました。

該当のソースコード

java

1import java.io.*; 2import java.util.*; 3public class Employee{ 4 public static void main(String[] args){ 5 try{ 6 File csv = new File("syain.csv"); 7 InputStreamReader isr = new InputStreamReader(System.in); 8 BufferedReader brr = new BufferedReader(isr); 9 BufferedReader br = new BufferedReader(new FileReader(csv)); 10 BufferedWriter bw = new BufferedWriter(new FileWriter(csv, true)); 11 int flag = 0; 12 int nu = 0; 13 while(flag == 0){ 14 System.out.println("####################"); 15 System.out.println("メインメニュー"); 16 System.out.println("####################"); 17 System.out.println(""); 18 System.out.println("1 社員表示"); 19 System.out.println("2 社員検索"); 20 System.out.println("3 社員登録"); 21 System.out.println("4 社員削除"); 22 System.out.println("99 終了"); 23 System.out.println(""); 24 System.out.println("メニュー番号を入力してください"); 25 System.out.print("-->"); 26 String name = brr.readLine(); 27 nu = Integer.parseInt(name); 28 switch(nu){ 29 case 1: 30 int bango[] = new int[1]; 31 String mei[] = new String[1]; 32 System.out.println(); 33 System.out.println("----------"); 34 System.out.println("社員表示"); 35 System.out.println("----------"); 36 System.out.println(); 37 System.out.println("社員情報を表示します"); 38 System.out.println(); 39 System.out.println("社員番号     社員名"); 40 System.out.println("-----      ------"); 41 String line = ""; 42 while((line = br.readLine()) != null) 43 { 44 StringTokenizer st = new StringTokenizer(line,","); 45 while(st.hasMoreTokens()) 46 { 47 System.out.print(st.nextToken() + "      "); 48 System.out.print(""); 49 } 50 System.out.println(); 51 } 52 //br.close(); 53 break; 54 case 2: 55 int bango2[] = new int[1]; 56 System.out.println(); 57 System.out.println("----------"); 58 System.out.println("社員検索"); 59 System.out.println("----------"); 60 System.out.println(); 61 System.out.println("社員情報を検索して表示します"); 62 System.out.println(); 63 int a = 0; 64 System.out.println("検索する社員番号を入力してください"); 65 System.out.print("-->"); 66 bango2[a] = Integer.parseInt(brr.readLine()); 67 System.out.println(); 68 System.out.println("社員番号     社員名"); 69 System.out.println("-----      ------"); 70 String line2 = ""; 71 while((line2 = br.readLine()) != null) 72 { 73 StringTokenizer st = new StringTokenizer(line2,","); 74 String bango3 = st.nextToken(); 75 int bango4 = Integer.parseInt(bango3); 76 if(bango2[a] == bango4) 77 { 78 System.out.print(bango3 + "      " + st.nextToken()); 79 System.out.print(""); 80 } 81 System.out.println(); 82 } 83 //br.close(); 84 break; 85 case 3: 86 int bango5[] = new int[1]; 87 String mei2[] = new String[1]; 88 System.out.println(); 89 System.out.println("----------"); 90 System.out.println("社員登録"); 91 System.out.println("----------"); 92 System.out.println(); 93 System.out.println("社員情報を登録します"); 94 System.out.println(); 95 int c = 0; 96 System.out.println("登録する社員番号を入力してください"); 97 System.out.print("-->"); 98 bango5[c] = Integer.parseInt(brr.readLine()); 99 System.out.println("登録する社員名を入力してください"); 100 System.out.print("-->"); 101 mei2[c] = brr.readLine(); 102 bw.write(bango5[c] + "," + mei2[c] + "\r\n"); 103 //bw.close(); 104 System.out.println("社員番号「" + bango5[c] + "」社員名「" + mei2[c] + "」の社員情報を登録しました"); 105 System.out.println(); 106 System.out.println("社員番号     社員名"); 107 System.out.println("-----      ------"); 108 String line3 = ""; 109 while((line3 = br.readLine()) != null) 110 { 111 StringTokenizer st = new StringTokenizer(line3,","); 112 while(st.hasMoreTokens()) 113 { 114 System.out.print(st.nextToken() + "      "); 115 System.out.print(""); 116 } 117 System.out.println(); 118 } 119 //br.close(); 120 break; 121 case 4: 122 //削除機能(未完成) 123 break; 124 case 99: 125 flag = 1; 126 break; 127 } 128 continue; 129 } 130 }catch(Exception e){ 131 System.out.println(e); 132 } 133} 134}

どのようにしたら、2回目以降の処理でも
名簿情報の表示や検索、登録、削除が行えますでしょうか?

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

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

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

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

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

jun68ykt

2018/02/11 10:11

ご質問に、CSVファイルのサンプルも載せたほうが、どこに問題があるのか見つかりやすいかもしれません。
guest

回答1

0

ベストアンサー

Java

1BufferedReader br = new BufferedReader(new FileReader(csv));

while文の上で宣言していて。
各処理でファイルの次の行を読み取る処理br#readline()を行っている箇所はありますが、
ファイルの先頭行から読み直す処理(br#reset() など)が無いのでファイルを最後まで読み切ったら、次br#readline()を行っても読むデータが無いのでデータが表示されないのは正常な動作だと思いますが。。。

■問題点
1,変数brを各処理で使いまわしている。面倒でも各処理でスコープを1個切って以下のようにすれば問題は発生しないはずです。

{//←ブロックスコープを切る BufferedReader br = new BufferedReader(new FileReader(csv)); // 各case文で行っていること。 }

2,mainメソッドという一つのメソッド内で一覧表示、検索、登録と処理を行いすぎです。。
そのため、どの機能が原因で今回のバグが発生したのかの問題の切り分けが不可能な状態になりやすいです。
このソースコードを読む人のために機能単位にまず関数を作成しましょう。

3,ファイルのclose忘れを防ぐためにtry~with~resources文を使ってくださいな。

Java

1try(BufferedReader br = new BufferedReader(new FileReader(csv))) { 2 // やりたいこと。 3}

4,例外が発生した時は標準出力System.outではなく、System.errに出力してくださいな。

■補足
質問する時は
1,問題を再現させるための手順を詳しく記載してくださいな。
2,「期待される結果」を質問文に記載してくださいな。
3,プログラム内ファイルを使用しているなら、ファイルのサンプルデータも追記してくださいな。
要望が多いですが、明確な質問だと返答も速く帰ってきます。

投稿2018/02/11 10:38

編集2018/02/11 11:01
umyu

総合スコア5846

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問