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

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

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

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Q&A

解決済

3回答

1002閲覧

try-catchの使い方について

momo1122

総合スコア17

Java

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

0グッド

0クリップ

投稿2020/09/14 07:13

編集2020/09/14 07:26

イメージ説明### 前提・実現したいこと

try-catch文で「0から2の数字の判定」、「文字列かどうかの判定」を行いたいです。
「0から2」以外が入力された場合、エラーメッセージを表示し最初の選択肢に戻るを実行させたいです。

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

「0から2の数字の判定」はうまくいくのですが、「文字列かどうかの判定」をしたときにエラーメッセージが表示されるとともに、選択の余地なくif文の処理が勝手に実行されてしまいます。

該当のソースコード

Java

1package JankenGame; 2 3import java.util.InputMismatchException; 4import java.util.Scanner; 5 6//Playerクラス 7class Player extends TotalPlayer { 8 Scanner scanner = new Scanner(System.in); 9 private int myHand; 10 11 /** 12 * Playerの手を入力するメソッド 13 * 14 * @return 整数値の標準入力 15 */ 16 int getHand() { 17 return this.myHand; 18 } 19 20 void getJudgeHand() { 21 while (true) { 22 try { 23 System.out.println("コマンド? 0:グー 1:パー 2:チョキ"); 24 this.myHand = scanner.nextInt(); 25 if (this.myHand <= 2) { 26 break; 27 } 28 } catch (InputMismatchException e) { 29 System.out.println("整数値ではありません"); 30 break; 31 } 32 System.out.println("0から2で入力してください"); 33 } 34 } 35 36}

試したこと

breakを消したり、他の位置に移動させてみたりしましたが解決策がわかりません。
デバック機能も使用してみたのですが、原因はつかめませんでした。
不勉強で申し訳ありませんが、アドバイスなど頂けたらと思います。
よろしくお願いします。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2020/09/14 07:20

コードやエラーはマークダウンのcode機能を利用してご提示ください。 https://teratail.com/questions/238564 >0から2の数字の判定 これはtry-catchの役目ではないのでは? Exceptionでもなんでもないです。
momo1122

2020/09/14 07:29

ご指摘ありがとうございます。 >これはtry-catchの役目ではないのでは? Exceptionでもなんでもないです。 ご回答ありがとうございます。質問させて頂きたいのですが、そうなると「0から2以外の数字の判定」はif文で判定を行えばいいのでしょうか?
guest

回答3

0

Scanner の hasNextInt を使って数値であるかどうかチェックできます。

Java

1 void getJudgeHand() { 2 while (true) { 3 System.out.println("コマンド? 0:グー 1:パー 2:チョキ"); 4 if (scanner.hasNextInt()) { 5 myHand = scanner.nextInt(); 6 if (myHand >= 0 && myHand <= 2) break; 7 } 8 else { 9 scanner.next(); 10 System.out.println("整数値ではありません"); 11 } 12 System.out.println("0から2で入力してください"); 13 } 14 }

投稿2020/09/14 12:43

kazuma-s

総合スコア8224

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

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

momo1122

2020/09/14 13:50

kazuma-sさん いつもご回答頂きありがとうございます。 こういった書き方もあるのですね。大変参考になります。 ありがとうございます????‍♀️!!
guest

0

もう解決しているようですので、参考のために回答させていただきます。
たかが0から2の数値チェックで例外を起こすのはあまりよろしくないかと思います。
今回程度のプログラムなら何も問題はないのですが、例外(Exception)の発生というのは、
時間がかかったり、メモリーを多く消費したり、大変コストがかかる処理になるからです。
なので、例えば以下のように事前にチェックをする方がいいかと思います。

Java

1void getJudgeHand() { 2 while (true) { 3 System.out.println("0から2で入力してください。"); 4 System.out.println("コマンド? 0:グー 1:パー 2:チョキ"); 5 if (!scanner.hasNext("[0-20-2]")) { 6 scanner.next(); 7 System.err.println("入力が正しくありません。"); 8 continue; 9 } 10 this.myHand = scanner.nextInt(); 11 System.out.println(this.myHand + "が入力されました。"); 12 } 13}

投稿2020/09/14 07:59

編集2020/09/14 08:00
root_jp

総合スコア4666

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

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

momo1122

2020/09/14 08:06

root_jpさん ご丁寧にご教示いただきありがとうございます。 こういった処理の書き方もあるのですね。必ず例外処理を行わないといけないと勘違いしていました。 大変勉強になります、いただいたコードを実行してみて勉強させて頂きます。ありがとうございます。
guest

0

ベストアンサー

以下でよいかと。

java

1void getJudgeHand() { 2 while (true) { 3 try { 4 System.out.println("コマンド? 0:グー 1:パー 2:チョキ"); 5 6 this.myHand = scanner.nextInt(); 7 if (this.myHand <= 2 && this.myHand >= 0) { // 2以下 かつ、0以上ならbreak 8 break; 9 } 10 } catch (InputMismatchException e) { 11 System.out.println("整数値ではありません"); 12 scanner.next(); // 入力を捨てる 13 } 14 System.out.println("0から2で入力してください"); 15 } 16}

投稿2020/09/14 07:41

momon-ga

総合スコア4826

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

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

momo1122

2020/09/14 07:48

momon-gaさん ご回答ありがとうございます。 ご教示いただいたコードで解決することができました。 1つ質問をさせて頂きたいのですが、「入力を捨てる」とはどういった仕組みなのでしょうか? よろしくお願い致します。
momon-ga

2020/09/14 08:21

String tmp = scanner.next(); とすれば、わかるでしょうか。 ただ、tmp自体は使い道がないため、ただscanner.next();を呼び出しています。
momo1122

2020/09/14 09:02

ご回答いただきありがとうございます。 ただ呼び出されるということについて少しが理解ができないので、自分自身でいろいろ検索してみます。 ご丁寧にご説明してくださり、ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問