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

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

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

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

Q&A

解決済

2回答

932閲覧

指定した場所から読み込みを再度始めるプログラムを作りたい

mainichiramen

総合スコア2

Java

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

0グッド

0クリップ

投稿2021/12/27 07:53

編集2021/12/27 08:17

現在図書館の管理システムのプログラムを作成しています。

実行すると「登録:1 一覧:2」と出てき、1を押すと「CD:1 雑誌:2 ビデオ:3 書籍:4」と出てきます。
次に選んだ物に情報を入れ登録をし、再度「登録:1 一覧:2」と出てき、2を押すと先ほど登録をした情報が入ってくる仕組みにしようと考えてます。

今の所CDの場合のみで作成しています。
管理プログラム

kanri.java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4import java.util.ArrayList; 5 6class kanri{ 7 public static void main(String[] args) throws IOException { 8String line; 9 10 BufferedReader br = new BufferedReader( new InputStreamReader(System.in) ); 11//ここらへんで再度読み込めるようにしたいです。 12 int bunrui, num; 13 14 ArrayList<String> handan = new ArrayList<String>(); 15 System.out.println("登録:1 一覧:2"); 16 line = br.readLine(); 17 num =Integer.parseInt(line); 18 19 if(num == 1){ 20 System.out.println("CD:1 雑誌:2 ビデオ:3 書籍:4 "); 21 22 line = br.readLine(); 23 bunrui =Integer.parseInt(line); 24 if(bunrui ==1){ 25 CD yamada; 26 yamada = new CD(); 27 yamada.Data_Input(); 28 29 handan.add(yamada.touroku()); 30 31 32 } 33 ///System.out.println(handan); 34 35 main(args);//もう一度最初に戻す 36 } 37 38if(num == 2){ 39 40 41 System.out.println("あり"); 42 43 System.out.println(handan); 44}} 45 46 47} 48

※CDを選んだ際のプログラム↓

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; class CD { String info; String[] title = {"タイトル:","アーティスト:","その他情報:"}; /* データ入力 メソッドの定義 */ public void Data_Input() throws IOException {String line; BufferedReader br = new BufferedReader( new InputStreamReader(System.in) ); System.out.println(title[0]); Scanner scan0 = new Scanner(System.in); String str = scan0.next(); title[0]+=str; System.out.println(title[1]); Scanner scan1 = new Scanner(System.in); String str1 = scan1.next(); title[1]+=str1; System.out.println(title[2]); Scanner scan2 = new Scanner(System.in); String str2 = scan2.next(); title[2]+=str2; } public String touroku(){ info ="●CD"+"\n"+title[0] +"\n"+ title[1] + "\n" +title[2]; System.out.println(info); return info; } }

しかし実行しても登録した情報が入っておらず空にのままで出力されています。
おそらく最初に戻すため、管理プログラムのmain(args);の箇所で最初に戻ってしまい、BufferedReader br = new BufferedReader( new InputStreamReader(System.in) );の所で空で更新されてしまったのではないかと考えています。
そこで情報を入力した後、
BufferedReader br = new BufferedReader( new InputStreamReader(System.in) );より一つ下の所で再度読み込みが出来る方法を考えているのですがなにか良い案はありますでしょうか?

実行画面(最後の[]の中に入力した情報を入れたいです。)

登録:1 一覧:2 1 書籍:1 雑誌:2 ビデオ:3 CD:4 1 タイトル: f アーティスト: g その他情報: w ●CD タイトル:f アーティスト:g その他情報:w 登録:1 一覧:2 2 あり []

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

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

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

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

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

Lhankor_Mhy

2021/12/27 08:12

JavaScript は関係のないご質問のように見えますので、質問タグの削除をおすすめします。
mainichiramen

2021/12/27 08:16

申し訳ございません。消しておきます。
Lhankor_Mhy

2021/12/27 08:23

ご対応ありがとうございます。
jimbe

2021/12/27 09:28

もう少し、コードのフォーマット(インデント等)を整理して頂けると助かります。 Eclipse 等 IDE をご利用でしたら、メニューの中に自動でフォーマットしてくれるコマンドがあるかと思いますので。
guest

回答2

0

ベストアンサー

main(args);//もう一度最初に戻す

これは「最初に戻す」ではありません。 main メソッドの呼び出しです。
あるメソッドの中でそのメソッド自身を呼び出すことを ”再帰” と呼び、これは適切に扱えないと無限に呼び出しが続き、やがてメモリを食い尽くして異常終了してしまう構造です。
横着せず、ループをご利用ください。


以下は、 FACTORIES に追加するだけで(ロジックを弄らずとも)管理対象を増やすことが出来るようにしてみました。

Kanri.java

java

1import java.io.IOException; 2import java.util.*; 3 4public class Kanri { 5 private static ManagedObjectFactory<?>[] FACTORIES = new ManagedObjectFactory[]{ 6 new CompactDisc.Factory(), 7 new Magazine.Factory(), 8 //new Video.Factory(), 9 //new Book.Factory(), 10 }; 11 12 public static void main(String[] args) throws IOException { 13 ArrayList<ManagedObject> stock = new ArrayList<>(); 14 15 Scanner scanner = new Scanner(System.in); 16 for(int num=0; num!=3; ) { 17 System.out.println("登録:1 一覧:2 終了:3"); 18 switch(num = Integer.parseInt(scanner.nextLine())) { 19 case 1: regist(stock, scanner); break; 20 case 2: printAll(stock); break; 21 } 22 } 23 System.out.println("終了."); 24 } 25 26 private static void regist(ArrayList<ManagedObject> stock, Scanner scanner) { 27 //選択肢表示 28 StringJoiner sj = new StringJoiner(" "); 29 for(int i=0; i<FACTORIES.length; i++) sj.add(FACTORIES[i].getTypeName() + ":" + (i+1)); 30 System.out.println(sj); 31 //選択 32 int bunrui = Integer.parseInt(scanner.nextLine()); 33 if(bunrui < 1 || FACTORIES.length < bunrui) { 34 System.out.println("未実装"); 35 return; 36 } 37 //生成・登録 38 ManagedObject obj = FACTORIES[bunrui-1].create(scanner); 39 stock.add(obj); 40 System.out.println(obj.toString("\n")); 41 } 42 43 private static void printAll(ArrayList<ManagedObject> stock) { 44 if(stock.isEmpty()) { 45 System.out.println("データがありません"); 46 } else { 47 for(ManagedObject obj : stock) System.out.println(obj.toString("\n")); 48 } 49 } 50} 51//管理対象物 52interface ManagedObject { 53 String toString(CharSequence delimiter); 54} 55//管理対象物生成 56abstract class ManagedObjectFactory<E extends ManagedObject> { 57 abstract String getTypeName(); 58 abstract E create(Scanner scanner); 59 60 protected String readLine(String prompt, Scanner scanner) { 61 System.out.println(prompt); 62 return scanner.nextLine(); 63 } 64}

CompactDisc.java

java

1import java.util.Scanner; 2import java.util.StringJoiner; 3 4class CompactDisc implements ManagedObject { 5 private static final String TYPE_NAME = "CD"; 6 private static final String[] TITLES = { "タイトル:", "アーティスト:", "その他情報:" }; 7 8 static class Factory extends ManagedObjectFactory<CompactDisc> { 9 @Override 10 public String getTypeName() { return TYPE_NAME; } 11 @Override 12 public CompactDisc create(Scanner scanner) { 13 String title = readLine(TITLES[0], scanner); 14 String artist = readLine(TITLES[1], scanner); 15 String etcetera = readLine(TITLES[2], scanner); 16 return new CompactDisc(title, artist, etcetera); 17 } 18 } 19 20 final String title, artist, etcetera; 21 private CompactDisc(String title, String artist, String etcetera) { 22 this.title = title; 23 this.artist = artist; 24 this.etcetera = etcetera; 25 } 26 27 @Override 28 public String toString() { 29 return toString(" "); 30 } 31 32 @Override 33 public String toString(CharSequence delimiter) { 34 StringJoiner sj = new StringJoiner(delimiter); 35 sj.add("●" + TYPE_NAME); 36 sj.add(TITLES[0] + title); 37 sj.add(TITLES[1] + artist); 38 sj.add(TITLES[2] + etcetera); 39 return sj.toString(); 40 } 41}

Magazine.java

java

1import java.util.Scanner; 2import java.util.StringJoiner; 3 4class Magazine implements ManagedObject { 5 private static final String TYPE_NAME = "雑誌"; 6 private static final String[] TITLES = { "書名:", "出版社:", "その他情報:" }; 7 8 static class Factory extends ManagedObjectFactory<Magazine> { 9 @Override 10 public String getTypeName() { return TYPE_NAME; } 11 @Override 12 public Magazine create(Scanner scanner) { 13 String title = readLine(TITLES[0], scanner); 14 String publisher = readLine(TITLES[1], scanner); 15 String etcetera = readLine(TITLES[2], scanner); 16 return new Magazine(title, publisher, etcetera); 17 } 18 } 19 20 final String title, publisher, etcetera; 21 private Magazine(String title, String publisher, String etcetera) { 22 this.title = title; 23 this.publisher = publisher; 24 this.etcetera = etcetera; 25 } 26 27 @Override 28 public String toString() { 29 return toString(" "); 30 } 31 32 @Override 33 public String toString(CharSequence delimiter) { 34 StringJoiner sj = new StringJoiner(delimiter); 35 sj.add("●" + TYPE_NAME); 36 sj.add(TITLES[0] + title); 37 sj.add(TITLES[1] + publisher); 38 sj.add(TITLES[2] + etcetera); 39 return sj.toString(); 40 } 41}

実行結果

plain

1登録:1 一覧:2 終了:3 21 3CD:1 雑誌:2 41 5タイトル: 6f 7アーティスト: 8g 9その他情報: 10w 11●CD 12タイトル:f 13アーティスト:g 14その他情報:w 15登録:1 一覧:2 終了:3 162 17●CD 18タイトル:f 19アーティスト:g 20その他情報:w 21登録:1 一覧:2 終了:3 221 23CD:1 雑誌:2 242 25書名: 26q 27出版社: 28h 29その他情報: 30y 31●雑誌 32書名:q 33出版社:h 34その他情報:y 35登録:1 一覧:2 終了:3 362 37●CD 38タイトル:f 39アーティスト:g 40その他情報:w 41●雑誌 42書名:q 43出版社:h 44その他情報:y 45登録:1 一覧:2 終了:3 463 47終了.

投稿2021/12/27 09:59

編集2021/12/27 12:27
jimbe

総合スコア13209

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

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

0

登録したはずのCD情報が消えるのは、保存しているhandanリストが毎回初期化されるからです。

java

1class kanri{ 2 3 static ArrayList<String> handan = new ArrayList<String>(); 4 5 public static void main(String[] args) throws IOException { 6 7 .... 8

handanリストをmain関数の外に出してstatic変数にすることで、期待の動きにはなると思います。

※ただ、こういう処理を作成する場合、一般的な方法としては関数内で無限ループを作るのが普通で、その場合はhandanリストをループの外で定義すれば良いかと思います。

java

1 public static void main(String[] args) throws IOException { 2 3 ArrayList<String> handan = new ArrayList<String>(); 4 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 5 6 while(true) { // 無限ループ 7 8 .... 9 System.out.println("登録:1 一覧:2 終了:3"); // 3を追加 10 11 12 .... 13 14 // main(args); // 消す 15 16 if (num == 3) { 17 break; 18 } 19 20 } 21

投稿2021/12/27 08:35

umau

総合スコア831

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問