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

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

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

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

Q&A

解決済

3回答

663閲覧

Java 一度発火させたメソッドをif文で呼び出せない問題を解決したい。

Yuki2

総合スコア52

Java

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

0グッド

0クリップ

投稿2021/09/08 02:08

編集2021/09/08 05:25

if文の中のメソッドを発火させたい

クイズプログラムを作っている。
A~Dの選択肢以外の答えが入力された際に、もう一度print();を実行したい。

2回目以降のprint();が発火しない

java

1 if (checkAnswer(answer, st) == false) { 2 System.out.println("選択肢の中から答えを入力してください。"); 3 print(); 4 }

該当のソースコード

java

1public class Main { 2 public static void main(String[] args) { 3 Question q = new Question(); 4 q.print(); 5 } 6}

java

1import java.util.Arrays; 2import java.util.Scanner; 3 4public class Question { 5 String answer; 6 7 String str = "トランザクション処理プログラムが,データベース更新の途中で異常終了した場合,ロールバック処理によってデータベースを復元する。このとき使用する情報はどれか。"; 8 String A = "A:最新のスナップショット情報"; 9 String B = "B:最新のバックアップファイル情報"; 10 String C = "C:ログファイルの更新後情報"; 11 String D = "D:ログファイルの更新前情報"; 12 13 String[] st = { "A", "B", "C", "D" }; 14 15 public void print() { 16 System.out.println(str); 17 System.out.println(A); 18 System.out.println(B); 19 System.out.println(C); 20 System.out.println(D); 21 System.out.println("選択肢を入力してください。"); 22 23 input(); 24 } 25 26 public void input() { 27 Scanner scanner = new Scanner(System.in); 28 String answer = scanner.nextLine().toUpperCase(); 29 30 if (checkAnswer(answer, st) == false) { 31 System.out.println("選択肢の中から答えを入力してください。"); 32 print(); 33 } 34 } 35 36 public static boolean checkAnswer(String answer, String[] st) { 37 if (Arrays.asList(st).contains(answer)) { 38 return true; 39 } else { 40 return false; 41 } 42 } 43 44}

実行結果

トランザクション処理プログラムが,データベース更新の途中で異常終了した場合,ロールバック処理によってデータベースを復元する。このとき使用する情報はどれか。 A:最新のスナップショット情報 B:最新のバックアップファイル情報 C:ログファイルの更新後情報 D:ログファイルの更新前情報 選択肢を入力してください。 ⬛︎

試した事

該当しないfを入力した場合、プログラムが停止してprint();が実行されなかった。
a~dを入力した場合、プログラムが終了した。

開発・実行ツール

vscode
こちらを参考にvscodeでJavaを実行出来るようにしました。

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

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

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

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

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

jimbe

2021/09/08 03:42

"1回目以降のprint();" では無く "2回目以降"の間違いでは無いでしょうか。
Yuki2

2021/09/08 03:49

左様でございます。 ご指摘、ありがとうございます。
jimbe

2021/09/08 04:03

あぁ、再帰してるんですね。失礼しました。
jimbe

2021/09/08 04:12

何で開発・実行されていますか。
shiketa

2021/09/08 04:12

\# 二回ですか…。わたしの環境では1000回は軽く繰り返せましたけれどね。
Yuki2

2021/09/08 05:26

jimbeさん vscodeを使用しております。
jimbe

2021/09/08 07:08

vscode なら"再帰だから止まる"的なことは無さそうですね。 何が起きているのか今はちょっと想像が付かないです。 とりあえず momon-ga さんや私の回答のコードではどうなるでしょうか。
guest

回答3

0

ベストアンサー

再帰呼び出しよりも普通のループを使う方がよいかと思います。

なるべく元のコードを残していますが、既回答にある通り、Scannerはつど生成しない方がよいです。

java

1/** Main */ 2public class Main { 3 public static void main(String[] args) { 4 Question q = new Question(); 5// q.print(); 6 q.input(); 7 } 8} 9 10/** Question */ 11import java.util.Arrays; 12import java.util.Scanner; 13 14public class Question { 15 String answer; 16 17 String str = "トランザクション処理プログラムが,データベース更新の途中で異常終了した場合,ロールバック処理によってデータベースを復元する。このとき使用する情報はどれか。"; 18 String A = "A:最新のスナップショット情報"; 19 String B = "B:最新のバックアップファイル情報"; 20 String C = "C:ログファイルの更新後情報"; 21 String D = "D:ログファイルの更新前情報"; 22 23 String[] st = { "A", "B", "C", "D" }; 24 25 public void print() { 26 System.out.println(str); 27 System.out.println(A); 28 System.out.println(B); 29 System.out.println(C); 30 System.out.println(D); 31 System.out.println("選択肢を入力してください。"); 32// input(); 33 } 34 35 public void input() { 36 Scanner scanner = new Scanner(System.in); 37 String answer; 38 do { 39 print(); 40 System.out.println("選択肢の中から答えを入力してください。"); 41 answer = scanner.nextLine().toUpperCase(); 42 } while(checkAnswer(answer, st) == false); 43 } 44 45 public static boolean checkAnswer(String answer, String[] st) { 46 return Arrays.asList(st).contains(answer); // if文使わなくてもよい 47// if (Arrays.asList(st).contains(answer)) { 48// return true; 49// } else { 50// return false; 51// } 52 } 53}

投稿2021/09/08 06:02

momon-ga

総合スコア4820

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

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

0

環境による部分があるようですが、とりあえず。
Main はくっつけました。

再帰(printからinput を呼び, inputからprintを呼ぶ)はしないでください。
Scanner は何度も作らないようにしてください。

java

1import java.util.Scanner; 2 3public class Q358316 { 4 public static void main(String[] args) { 5 Scanner scanner = new Scanner(System.in); 6 7 Q358316 q = new Q358316(); 8 for(String a=null; a==null; ) { 9 q.print(); 10 a = q.input(scanner); 11 } 12 } 13 14 String question = 15 "トランザクション処理プログラムが,データベース更新の途中で異常終了した場合,ロールバック処理によってデータベースを復元する。このとき使用する情報はどれか。"; 16 String answers[] = { 17 "最新のスナップショット情報", 18 "最新のバックアップファイル情報", 19 "ログファイルの更新後情報", 20 "ログファイルの更新前情報", 21 }; 22 23 public void print() { 24 System.out.println(question); 25 for(int i=0; i<answers.length; i++) { 26 System.out.println(('A'+i)+":"+answers[i]); 27 } 28 } 29 30 public String input(Scanner scanner) { 31 System.out.println("選択肢を入力してください。"); 32 String answer = scanner.nextLine().toUpperCase(); 33 34 if (!checkAnswer(answer)) { 35 System.out.println("選択肢の中から答えを入力してください。"); 36 return null; 37 } 38 return answer; 39 } 40 41 public boolean checkAnswer(String answer) { 42 if(answer == null || answer.length() != 1) return false; 43 int i = answer.charAt(0) - 'A'; 44 return 0 <= i && i < answers.length; 45 } 46}

投稿2021/09/08 04:45

jimbe

総合スコア12756

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

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

0

追記。

trueが帰って来た時はinput()メソッドは終了します。print()メソッドも実行されません。
問題の解決にはなってませんよね。

ああ。たしかに。

該当しないfを入力した場合、プログラムが停止してprint();が実行されなかった。

あなたのソースをままコピペしてコンパイルして実行してみたら、プログラムは停止せずprint();が実行されました。現象そのものが発生しないので、わたしには解決策もありませんね。失礼しました。

>java Main トランザクション処理プログラムが,データベース更新の途中で異常終了した場合,ロールバック処理によってデータベースを復元する。このとき使用 する情報はどれか。 A:最新のスナップショット情報 B:最新のバックアップファイル情報 C:ログファイルの更新後情報 D:ログファイルの更新前情報 選択肢を入力してください。 f 選択肢の中から答えを入力してください。 トランザクション処理プログラムが,データベース更新の途中で異常終了した場合,ロールバック処理によってデータベースを復元する。このとき使用 する情報はどれか。 A:最新のスナップショット情報 B:最新のバックアップファイル情報 C:ログファイルの更新後情報 D:ログファイルの更新前情報 選択肢を入力してください。

java

1 if (checkAnswer(answer, st) == false) { 2 System.out.println("選択肢の中から答えを入力してください。"); 3 print(); 4 }

trueが返ってきたとき、どうなりますか。 input()メソッドが終了するのではないですか?input()メソッドが終了すると、それを呼び出しているprint()メソッドはどうなりますか。


ちなみに。print()メソッドからinput()を呼び出し、input()メソッドからprint()をまた呼び出しているので、死ぬほど繰り返すとOutOfMemoryErrorが発生することでしょう。

投稿2021/09/08 02:24

編集2021/09/08 02:58
shiketa

総合スコア3990

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

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

Yuki2

2021/09/08 02:34

trueが帰って来た時はinput()メソッドは終了します。 print()メソッドも実行されません。 問題の解決にはなってませんよね。
xebme

2021/09/08 08:46

問題の切り分けのために、vscodeをやめて、Macのターミナルを直接開いて、javaを実行してみてはいかがでしょう。正常に実行できれば、vscodeの問題のようです。そうでなければ、javaのバージョンを変えてみるとか、 ... 。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問