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

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

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

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

Q&A

解決済

2回答

778閲覧

掛け金設定まで戻らず再入力を促したい

awz_9

総合スコア2

Java

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

0グッド

0クリップ

投稿2022/10/26 06:30

編集2022/10/27 01:15

前提

Javaで掛け金システムのある丁半プログラムを作っています。

実現したいこと

System.out.println("半(=1)か丁(=2)か?");
の後に1,2以外の数字が入力された場合、【エラー】入力できるのは1と2です と
出したいのですが、出力結果が
4(入力された数字)
//ここに1,2以外が入力されたときに「【エラー】入力できるのは1と2です」といれて"半(=1)か丁(=2)か?"と表示し、再び入力できるようにしたいです。
6(さいの目の数字)

発生している問題・エラーメッセージ

該当のソースコード

Java

1import java.util.Scanner; 2public class Main { 3 public static void main(String[] args) { 4 int syojikin = 100; 5 System.out.print("所持金=" + syojikin); 6 Scanner betsc = new Scanner(System.in); 7 Scanner scanner = new Scanner(System.in); 8 Scanner kake = new Scanner(System.in); 9 while (!scanner.nextLine().equals("end")) { 10 System.out.print("掛け金を入力:"); 11 String kakekinsc = kake.next(); 12 if (kakekinsc.equals("end")) { 13 break; 14 } 15 int kakekin = Integer.parseInt(kakekinsc); 16 if (kakekin > syojikin) { 17 System.out.println("所持金以上の金額は賭けられません。"); 18 continue; 19 } 20 int zandaka = syojikin - kakekin; 21 System.out.println("残高" + zandaka); 22 while(){ 23 System.out.println("半(=1)か丁(=2)か?"); 24 String bet1sc = betsc.next(); 25 int bet = Integer.parseInt(bet1sc); 26 if (bet <= -1 || bet >= 3){ 27 System.out.println("【エラー】入力できるのは1と2です"); 28 continue; 29 } 30 boolean bb = bet1sc.chars().allMatch(Character::isDigit); 31 if (bb != true) { 32 System.out.println("【エラー】入力できるのは整数だけです"); 33 continue; 34 } 35 int sai = 1 + (int)(Math.random() * 6.0); 36 System.out.println(sai); 37 boolean b = (sai % 2 == 0); 38 boolean b1 = (bet % 2 == 0); 39 if (b == true && b1 == true) { 40 System.out.println("当たり!"); 41 zandaka = zandaka + (kakekin * 2); 42 System.out.print("残高" + zandaka); 43 syojikin = zandaka; 44 continue; 45 } else if (b == true && b1 != true) { 46 System.out.println("はずれ!"); 47 System.out.print("残高" + zandaka); 48 syojikin = zandaka; 49 if (syojikin == 0) { 50 break; 51 } 52 continue; 53 } else if (b != true && b1 != true) { 54 System.out.println("当たり!"); 55 zandaka = zandaka + (kakekin) * 2; 56 System.out.print("残高" + zandaka); 57 syojikin = zandaka; 58 continue; 59 } else if (b != true && b1 == true) { 60 System.out.println("はずれ!"); 61 System.out.print("残高" + zandaka); 62 syojikin = zandaka; 63 if (syojikin == 0) { 64 break; 65 } 66 continue; 67 } 68 scanner.close(); 69 } 70 scanner.close(); 71 } 72} 73}

試したこと

・System.out.println("【エラー】入力できるのは1と2です");
continue;
と書きましたが

出力結果は
【エラー】入力できるのは「0~2」です

掛け金を入力:

と掛け金設定まで戻ってしまいます。

・while文の条件に何を書いたらいいかがわからず止まってしまいました。

補足情報(FW/ツールのバージョンなど)

Java8です

ご回答いただいたpig_vba様、jimbe様
アドバイスいただきありがとうございました。大変勉強になりました。
また皆さんに一つお聞きしたいことがありまして、このようなJavaやプログラム等で必要なmethodごとに分ける部分を見分ける方法やコツなどありますでしょうか?
java初心者で問題を見たとき、まずはどこから書いたらいいのかなと迷うことが多く、
コメントでいただけたら幸いです。

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

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

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

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

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

jimbe

2022/10/26 12:04 編集

とりあえず、Scanner は同じ元 (System.in) から複数は作らないほうが良いです。不具合の元になります。作る意味もありません。 1つ作って使い回してください。
awz_9

2022/10/26 23:45

使いまわしができるものなのですね。ありがとうございます。冗長になっていました。
jimbe

2022/10/27 03:41 編集

>必要なmethodごとに分ける部分を見分ける 『部品として名前を付け易い塊』です。 回答のコードでは二つの入力をメソッドにしましたが、main のコードだけを見た時、 int kakekin = inputKAKEKIN(scanner); の記述だけで「カケキンを(スキャナから)インプットしてintとして返す」ということが読み取れるはずです。メソッド名自体が何をしているのかのコメントでもあるのです。 Integer.parseInt も、parse(解析)・int(整数)で、パラメータ(入力)が String、返り値(出力) int ですから、ドキュメントを読まなくても String→int 変換と察しが付くでしょう。(そこから更に『じゃあ変換出来なかったらどうなるんだ?』まで興味が繋がると、 isDigit の必要性まで実行しなくてもたどり着けます。 ) また、コピペでコードを作っていると、コピーして修正して…のコピーの部分をメソッドにし、修正する部分をパラメータとする感じも、プログラムを作り始めた初期頃には有効でしょう。
awz_9

2022/10/28 08:56

返信が遅くなり申し訳ありません! 何から何までお答えしていただいてありがとうございます。 また、コピペでコードを作っていると、コピーして修正して…のコピーの部分をメソッドにし、修正する部分をパラメータとする感じ これぜひ今後使って勉強していきます。
guest

回答2

0

ベストアンサー

scanner はデータを取り出したら、もうそのデータは2度と取り出せません。

while (!scanner.nextLine().equals("end")) {

などとやってしまっては、 "end" 以外の文字列が入力されていたとしても、もうその文字列は次に next() しても取り出せません。

半丁の入力では、Integer.parseInt して 1,2 かチェックした後に isDigit をチェックしても意味はありません。
数値で無ければ parseInt が先に例外を発します。

当たり/外れの if が 4 つ並んでますが、当たりは b == b1 とし、 外れは else にすればそんなに必要ありません。

scanner は close したらもう使えません。

エラーで入力を繰り返すような場合は、入力部分をメソッドとして取り出してしまうほうが、全体の入れ子が深くならずに済みます。

java

1package teratail_java.q_5vhgagiqxg5chr; 2 3import java.util.Random; 4import java.util.Scanner; 5 6public class Main { 7 public static void main(String[] args) { 8 Random random = new Random(System.currentTimeMillis()); 9 Scanner scanner = new Scanner(System.in); 10 11 int syojikin = 100; 12 System.out.println("所持金=" + syojikin); 13 do { 14 int kakekin = inputKAKEKIN(scanner, syojikin); 15 if(kakekin == 0) break; 16 17 syojikin -= kakekin; 18 System.out.println("残高=" + syojikin); 19 20 int bet = inputBet(scanner); 21 22 int sai = random.nextInt(6) + 1; 23 System.out.println(sai); 24 if(sai%2 == bet%2) { 25 System.out.println("当たり!"); 26 syojikin += (kakekin * 2); 27 } else { 28 System.out.println("はずれ!"); 29 } 30 31 System.out.println("残高=" + syojikin); 32 } while(syojikin > 0); 33 } 34 35 private static int inputKAKEKIN(Scanner scanner, int syojikin) { 36 while(true) { 37 System.out.print("掛け金を入力:"); 38 String kakekinsc = scanner.nextLine(); 39 if(kakekinsc.equals("end")) return 0; //end 40 41 int kakekin = Integer.parseInt(kakekinsc); 42 if(kakekin > syojikin) { 43 System.out.println("所持金以上の金額は賭けられません。"); 44 continue; 45 } 46 return kakekin; 47 } 48 } 49 50 private static int inputBet(Scanner scanner) { 51 while(true) { 52 try { 53 System.out.println("半(=1)か丁(=2)か?"); 54 String betsc = scanner.nextLine(); 55 int bet = Integer.parseInt(betsc); 56 if(bet != 1 && bet != 2) { 57 System.out.println("【エラー】入力できるのは1と2です"); 58 continue; 59 } 60 return bet; 61 } catch(NumberFormatException e) { 62 System.out.println("【エラー】入力できるのは整数だけです"); 63 } 64 } 65 } 66}

実行結果

plain

1所持金=100 2掛け金を入力:50 3残高=50 4半(=1)か丁(=2)か? 51 62 7はずれ! 8残高=50 9掛け金を入力:10 10残高=40 11半(=1)か丁(=2)か? 123 13【エラー】入力できるのは1と2です 14半(=1)か丁(=2)か? 150 16【エラー】入力できるのは1と2です 17半(=1)か丁(=2)か? 181.5 19【エラー】入力できるのは整数だけです 20半(=1)か丁(=2)か? 21abc 22【エラー】入力できるのは整数だけです 23半(=1)か丁(=2)か? 241 256 26はずれ! 27残高=40 28掛け金を入力:end

投稿2022/10/26 12:12

編集2022/10/26 12:43
jimbe

総合スコア12646

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

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

awz_9

2022/10/27 02:27 編集

大変お粗末なコードから読み取っていただきありがとうございます。 お恥ずかしい限りです。 parseIntで例外が出て本当に困っており本当に助かりました。 また入力部分をメソッドとして取り出すところは本当に勉強になりました。 ベストアンサーにさせてください。
jimbe

2022/10/27 03:01 編集

>parseIntで例外が出て本当に困っており そのようなことは質問に書かれていなかったと思いますが…。 例外で止まるのは、止まるべくして止まるのであって、超常現象とかではありません。プログラマがすべきなのは「何か出て動かない、困った」では無く、例外は何を言っているのか・何故出るのか・その根本の原因は何なのか・その対策はどうするかを調べて、実際に直すことです。 parseInt で例外が出たのであれば、まずは parseInt のドキュメント(仕様書)を見るべきです。そこにはどのような場合にどのような例外が発するのか書いてあります。 https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Integer.html#parseInt-java.lang.String- >例外: >NumberFormatException - 文字列が解析可能な整数型を含まない場合。 この時点で「Integer.parseInt して 1,2 かチェックした後に isDigit をチェックしても意味は無い」が分かるはずです。 対応は、 parseInt する『前に』 isDigit でチェックするか、 NumberFormatException の発生を isDigit の代わりとして捉えるか、で、回答は後者を取っています。
guest

0

私はjava触ってないので明確に答えを提示できないのですが、

java

1 while(1){ 2 System.out.println("半(=1)か丁(=2)か?"); 3 String bet1sc = betsc.next(); 4 int bet = Integer.parseInt(bet1sc); 5 if (bet <= -1 || bet >= 3){ 6 System.out.println("【エラー】入力できるのは1と2です"); 7 }else{ 8 break; 9 } 10 11 boolean bb = bet1sc.chars().allMatch(Character::isDigit); 12 if (bb != true) { 13 break; 14 } 15

こんな感じに「正しい数字が入力されるまでループする」とすればいいのでは?

投稿2022/10/26 07:21

pig_vba

総合スコア807

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

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

awz_9

2022/10/26 07:43

ありがとうございます。一度試してみたところ while文の条件に何を書いたらいいかがわからず止まってしまいました。
pig_vba

2022/10/26 07:47

「正しい数値が入力されるまでループする」パターンと「正しい数値が入力されたらbreakする(whileの条件式は無限ループ)」の2パターンがあると思います。前者はエラー条件の逆を書けばいいですし、後者ならwhile(true){でいいはずです。
awz_9

2022/10/26 23:43

trueなのですね!今後頭に入れておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問