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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

543閲覧

Java11 Eclipse エラー:dataを解決できません 

saichi

総合スコア1

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

1グッド

0クリップ

投稿2022/05/15 01:56

編集2022/05/15 04:03

前提
大きな目標:1つの銀行口座を管理するプログラムをJavaで作成したい(Eclipse)
プログラムの流れ:
①menu(A,W,D,S,E)を入力させる
②入力された値に応じてswitch文で処理

実現したいこと
①Ex0206.javaの33行目、37行目で入力されたnumberとnameの値を
39行目でインスタンス変数dataに格納

Java11 ファイル名:Ex0206.java

1 case 'A': 2 if (count == 1) { 3 System.out.println("口座は開設済みです"); 4 } else { 5 //口座番号を入力させる 6 System.out.print("口座番号>"); 732行目 line = reader.readLine(); 8 int number = Integer.parseInt(line); 9 //名義を入力させる 10 System.out.print("名義>"); 1137行目 String name = reader.readLine(); 12 //Bankクラスのコンストラクタを呼び出し、インスタンスを生成する 1339行目 Bank data = new Bank(number, name); 14 //口座がある状態にする 15 count = 1; 16 }

②79、80行目でdetaのnumberとnameを個別に表示させたい

Java11 ファイル名:Ex0206.java

1 case 'S': 2 if (count == 0) { 3 System.out.println("口座を開設しなければ操作できません"); 4 } else { 579行目 System.out.println("口座情報表示 口座番号: " + **data.**bankNumber() + 680行目 " 名義: " + **data.**bankName() + " 残高: " + **data.**bankMoney()); 7 } 8 break;

発生している問題・エラーメッセージ
dataを解決できません

該当のソースコード

自分で調べたことや試したこと
試したこと:swicth文に入る前にコンストラクタで初期化
エラーメッセージ:なし
実行結果:入力したnumberとnameが表示されない(初期値が表示)
原因:39行目のコンストラクタが機能しなくなった

使っているツールのバージョンなど補足情報
OS:Windows10
ツール:Eclipse
バージョン:Java11

下記にEx0206.javaとBank.Javaの全コードを記載しております。

長々とした質問になりましたが、
もしよろしければ、ご回答よろしくお願いいたします。

Java11 ファイル名:Ex0206.java

1package ex0206; 2 3import java.io.BufferedReader; 4import java.io.IOException; 5import java.io.InputStreamReader; 6 7public class Ex0206 { 8 9 public static void main(String[] args) { 10 System.out.println("銀行口座管理プログラム"); 11 boolean judge = true; 12 //口座があるかないかを判断する変数 13 //count==1のとき口座あり、count==0のとき口座なし 14 int count = 0; 15 while (judge) { 16 System.out.println("A:新規開設 W:引き出し D:預け入れ S:口座情報 E:終了"); 17 System.out.print("メニュー>"); 18 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 19 try { 20 String line = reader.readLine(); 21 char menu = line.charAt(0); 22 23 switch (menu) { 24 case 'A': 25 if (count == 1) { 26 System.out.println("口座は開設済みです"); 27 } else { 28 //口座番号を入力させる 29 System.out.print("口座番号>"); 3032行目 line = reader.readLine(); 31 int number = Integer.parseInt(line); 32 //名義を入力させる 33 System.out.print("名義>"); 3437行目 String name = reader.readLine(); 35 //Bankクラスのコンストラクタを呼び出し、インスタンスを生成する 3639行目 Bank data = new Bank(number, name); 37 //口座がある状態にする 38 count = 1; 39 } 40 41 /*問題6においてはリストはいらない(登録口座が1つのため) 42 //Bank型のリストを作成する 43 List<Bank> bankData = new ArrayList<Bank>(); 44 //リストの中にデータ(口座番号、名義)を格納する 45 bankData.add(data); 46 */ 47 break; 48 49 case 'W': 50 if (count == 0) { 51 System.out.println("口座を開設しなければ操作できません"); 52 } else { 53 System.out.println("金額>"); 54 line = reader.readLine(); 55 int moneyDel = Integer.parseInt(line); 56 **data.**delMoney(moneyDel); 57 } 58 break; 59 60 case 'D': 61 if (count == 0) { 62 System.out.println("口座を開設しなければ操作できません"); 63 } else { 64 System.out.print("金額>"); 65 line = reader.readLine(); 66 int moneyAd = Integer.parseInt(line); 67 **data.**addMoney(moneyAd); 68 } 69 break; 70 71 case 'S': 72 if (count == 0) { 73 System.out.println("口座を開設しなければ操作できません"); 74 } else { 7579行目 System.out.println("口座情報表示 口座番号: " + **data.**bankNumber() + 7680行目 " 名義: " + **data.**bankName() + " 残高: " + **data.**bankMoney()); 77 } 78 break; 79 80 case 'E': 81 System.out.println("銀行口座管理プログラムを終了します"); 82 judge = false; 83 break; 84 85 default: { 86 System.out.println("A,W,D,S,Eのいずれかを入力してください"); 87 } 88 } 89 90 } catch (IOException e) { 91 System.out.println(e); 92 } catch (Exception e) { 93 System.out.println(e); 94 } 95 96 } 97 98 } 99 100}

Java11 ファイル名:Bank.java

1package ex0206; 2 3public class Bank { 4 private int number; 5 private String name; 6 private int money = 0; 7 8 Bank(int number, String name) { 9 this.number = number; 10 this.name = name; 11 } 12 13 int bankNumber() { 14 return this.number; 15 } 16 17 String bankName() { 18 return this.name; 19 } 20 21 int addMoney(int moneyAd) { 22 this.money = this.money + moneyAd; 23 return this.money; 24 } 25 26 int delMoney(int moneyDel) { 27 this.money = this.money - moneyDel; 28 return this.money; 29 } 30 31 int bankMoney() { 32 return this.money; 33 } 34 35}
YT0014👍を押しています

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

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

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

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

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

YT0014

2022/05/15 02:27

コード内のインデントが正確ではないので、修正してください。この問題を解決するのに役立つ修正となります。 その上で、変数のスコープを意識して、コードを見直して下さい。
YT0014

2022/05/15 04:01 編集

この欄は「質問への追記・修正依頼」ですので、ご対応に関しましては、質問文の編集にてお願いいたします。 質問文の直後、この欄の直上に、「編集」があります。
saichi

2022/05/15 04:03

ご返信ありがとうございます。 質問文を修正いたしました。
YT0014

2022/05/15 04:16

デバッグ実行で、32行目辺りからステップ実行を行い、変数name、bank.nameが変化を確認して、実際に起こっていることを把握するのが良いかと思われます。
saichi

2022/05/16 10:16

ご連絡ありがとうございます。 解決できました! 丁寧に問題を解決する過程を教えてくださり、ありがとうございます。 今後、プログラムで詰まった時には、今回教えてくださったやり方を使いたいと思います。 お世話になりました。
guest

回答1

0

ベストアンサー

変数のスコープが狭すぎて、スコープ外で参照してエラーになっているように見えます。

ここで言うと29行目から42行目までのelseブロック内でしかdata変数を参照できないため、他の場所(79行目とか他のdata)で参照しようとしてエラーとなります。

case 'A': if (count == 1) { System.out.println("口座は開設済みです"); } else { //口座番号を入力させる System.out.print("口座番号>"); 32行目 line = reader.readLine(); int number = Integer.parseInt(line); //名義を入力させる System.out.print("名義>"); 37行目 String name = reader.readLine(); //Bankクラスのコンストラクタを呼び出し、インスタンスを生成する 39行目 Bank data = new Bank(number, name); //口座がある状態にする count = 1; }

解決策として考えられるのはcount変数たちと同じmainメソッドのスコープにしてあげて、代入時は新たに宣言しないようにすれば一応解決します。

public static void main(String[] args) { System.out.println("銀行口座管理プログラム"); boolean judge = true; //口座があるかないかを判断する変数 //count==1のとき口座あり、count==0のとき口座なし int count = 0; Bank data = null; // ← 追加 while (judge) {
case 'A': if (count == 1) { System.out.println("口座は開設済みです"); } else { //口座番号を入力させる System.out.print("口座番号>"); 32行目 line = reader.readLine(); int number = Integer.parseInt(line); //名義を入力させる System.out.print("名義>"); 37行目 String name = reader.readLine(); //Bankクラスのコンストラクタを呼び出し、インスタンスを生成する //39行目(修正前) Bank data = new Bank(number, name); data = new Bank(number, name); //口座がある状態にする count = 1; }

投稿2022/05/16 08:33

Freedom645

総合スコア34

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

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

saichi

2022/05/16 10:26

ご丁寧な回答ありがとうございます。 無事に解決できました。 解決までの流れ 1) count変数と同じスコープにBank data; 2) 別のエラー文が発生(ローカル変数dataが初期化されていない可能性があります) 3) 1)のBank data;をBank data =new Bank();とし、Bank.javaにて引数なしコンストラクタで初期化する 助かりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問