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

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

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

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

Q&A

解決済

2回答

14791閲覧

指定と異なる入力があった時それを指摘して入力をやり直す方法

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2018/03/08 14:17

前提・実現したいこと

生年月日の入力等、指定された範囲の数値入力が必要な場面で
指定範囲外の数値が入力された時に入力をやり直させたいです。

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

なし

該当のソースコード

public class Main {
public static void main(String[]args) {
System.out.println("1から10の間の整数を入力してください");

int number = new java.util.Scanner (System.in).nextInt(); if(number<=0 || number>10) { System.out.println("指示と異なる数値が入力されました。もう一度入力しなおしてください。"); }

else {
System.out.println(number+"が入力されました。");
}
}
}

試したこと

googleで「Java goto文 代用」「Java 入力が不正な時 戻る」等検索をかける

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

つい最近プログラミングを勉強し始めました。
「スッキリわかるJava入門」を読んで勉強しています。
よろしくお願いいたします。

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

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

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

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

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

unz.hori

2018/03/08 14:24

ループ処理を応用してください
退会済みユーザー

退会済みユーザー

2018/03/09 13:52

回答ありがとうございます。ループ処理で検索したところ、ループを抜ける方法を使って目的の動きが出来そうなので他の方から頂いた回答と併せて試してみます。
guest

回答2

0

ベストアンサー

適当に静的メソッドを置いておくと便利かと。

Java

1static int inputNum(String message, Scanner sc) { 2 while(true) { 3 System.out.println(message); 4 try { 5 int ret = Integer.parseInt(sc.nextLine()); 6 if(0 < ret && ret <= 10) { 7 return ret; 8 } 9 } 10 catch(NumberFormatException e) {} 11 } 12}

再帰バージョン。

Java

1static int inputNumRecursive(String message, Scanner sc) { 2 System.out.println(message); 3 try { 4 int ret = Integer.parseInt(sc.nextLine()); 5 if(0 < ret && ret <= 10) { 6 return ret; 7 } 8 } 9 catch(NumberFormatException e) {} 10 11 return inputNumRecursive(message, sc); 12}

このままコンパイルがとおるコード

Java

1import java.util.Scanner; 2 3class Main { 4 static int inputNum(String message, Scanner sc) { 5 while(true) { 6 System.out.println(message); 7 try { 8 int ret = Integer.parseInt(sc.nextLine()); 9 if(0 < ret && ret <= 10) { 10 return ret; 11 } 12 } 13 catch(NumberFormatException e) {} 14 } 15 } 16 17 public static void main(String[] args) { 18 try(Scanner sc = new Scanner(System.in)) { 19 int num = inputNum("1~10の数を入れてね", sc); 20 System.out.println("入力された数: " + num); 21 } 22 } 23}

投稿2018/03/08 15:34

編集2018/03/09 17:04
LouiS0616

総合スコア35660

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

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

退会済みユーザー

退会済みユーザー

2018/03/08 15:44

目視でコンパイルエラーになりそうなきはほうちして(ぉぃ ループを再帰にしてもいいかもね
LouiS0616

2018/03/08 15:51

いちおうちょいちょい試しながら書いたので、コンパイルエラーは無いですね。 --- > ループを再帰にしてもいいかもね 書いてみましたが、分かりやすいかというと微妙な気がします。
退会済みユーザー

退会済みユーザー

2018/03/08 16:33

改めて並べてみるとわかりづらいなw
KSwordOfHaste

2018/03/09 01:01 編集

非再帰バージョンに一票ですが・・・if文はtryの中に書き、catchの中は空文にしたいです。 そのように「return文が必要な箇所に簡単に書けて、論理が単純になる」ことがサブルーチンにするメリットな気がします。
LouiS0616

2018/03/09 04:26

ネストを浅くするためにretのスコープを犠牲にしたのですが、改めて見てみると確かにおっしゃるとおりかもしれませんね。
退会済みユーザー

退会済みユーザー

2018/03/09 15:52

上記の文を書いたところエラーが出たのですが、これは何が原因なのでしょうか。Eclipseを使用しています。 package sukkiriWakaruJava2; import java.util.Scanner; public class Teratail_shitumonyou { public static void main(String[] args) { static int inputNumRecurse(String message, Scanner sc) { while(true) { System.out.println(message); try { int ret = Integer.parseInt(sc.nextLine()); if(0 < ret && ret <= 10) { return ret; } } catch(NumberFormatException e) {} } } } }
退会済みユーザー

退会済みユーザー

2018/03/09 15:54

static int inputNumRecurse(String message, Scanner sc) { の行に - トークン "," に構文エラーがあります。正しくは ; です - トークン "(" に構文エラーがあります。正しくは ; です - トークン ")" に構文エラーがあります。正しくは ; です - パラメーター inputNumRecurse の修飾子が正しくありません。final のみが許可されています return ret; の行に voidメソッドは値を戻すことは出来ません と出ています。
退会済みユーザー

退会済みユーザー

2018/03/09 15:55

public static void main(String[] args) を消すと エラー: メイン・メソッドがクラスsukkiriWakaruJava2.Teratail_shitumonyouで見つかりません。次のようにメイン・メソッドを定義してください。 public static void main(String[] args) またはJavaFXアプリケーション・クラスはjavafx.application.Applicationを拡張する必要があります と出てきてエラーで動かなくなりました。
KSwordOfHaste

2018/03/09 16:14

横から失礼します。 to:質問者さん Javaの言語仕様をよく確認してください。 メソッド定義の内側にさらに別のメソッドを定義できる言語もありますが、Javaはそうではありません。 質問内容にもよりますが、回答側はたいてい「言語仕様について基本的な点はわかっている」と仮定して回答します。package文/import文などを含めた完全なソースコードを回答するとは限りません。メソッドの定義のみ回答されている場合は、「クラスの直下に書く必要があるということは当然わかるはず」として一々注意しません。そのあたりご注意ください。
LouiS0616

2018/03/09 17:01

@KenzoTsujimoto さん おそらく『メソッドって何ぞや』という段階だと思います。 いちおうコンパイルが通るように回答を編集しておきますが、メソッドは基礎的かつ非常に重要ですので、適宜調べ物をしながらしっかり理解するようにしてくださいね。 @KSwordOfHaste さん コメントありがとうございます。 怒涛のコンパイルエラーに襲われ可哀そうな気もするので、いちおう加筆しておきます。
退会済みユーザー

退会済みユーザー

2018/03/10 04:31 編集

@KSwordOfHaste さん @LouiS0616 さん 回答ありがとうございます。 public static void main(String[] args){}と回答していただいた文を分けて書いたら正常に動作しました。エラーは2つのもの(メソッド?)をごっちゃにしていたことが原因のようです。 ・main→入力した数字をコンソールに表示するもの ・inputNum→数字を入力できるようにする、入力した数字が合っているか判断する、会っていない場合は入力し直させるもの ・こういった何かするものの塊がメソッドのこと?
退会済みユーザー

退会済みユーザー

2018/03/10 04:32

static int inputNum(String message, Scanner sc) { while(true) { System.out.println(message); try { int ret = Integer.parseInt(sc.nextLine()); if(0 < ret && ret <= 10) { return ret; }else { System.out.println("指定範囲外の数字が入力されています"); } } catch(NumberFormatException e) {} } }
退会済みユーザー

退会済みユーザー

2018/03/10 04:33

if文の後に else { System.out.println("指定範囲外の数字が入力されています"); } を書き足したら指定外の数字であったことを指摘する文章を追加できました。皆さんありがとうございました。
退会済みユーザー

退会済みユーザー

2018/03/10 04:37

おすすめは System.out.println("指定範囲外の数字が入力されています"); ↓ System.err.println("指定範囲外の数字が入力されています"); で catch に System.err.println("数字以外が入力されています"); を書こうか
LouiS0616

2018/03/10 04:42 編集

メソッドは一連の処理をまとめたものです。 その点では、『何かするものの塊がメソッド』という解釈も間違いではないです。 通常のメソッドとstaticメソッドでは役割がかなり異なるのですが、追々知っていけばいいでしょう。 --- > main→入力した数字をコンソールに表示するもの 結果的に今回はそういう役割をしていますが、もちろん実装によって異なる動作をさせられるのだと言うことを念押ししておきます。 --- @asahina1979 さん それが良いですね。コメントありがとうございます。
退会済みユーザー

退会済みユーザー

2018/03/10 05:11

@asahina1979 さん ありがとうございます。文章を追加すると、abc...と数字以外を入力した場合でも指摘の文章が入るようになりました。文字が赤くなりエラーとわかりやすくなりました。こういったことも教えていただけると勉強になります。 @LouiS0616 さん ありがとうございます。勉強を続けて、分からない時でも適切な質問が出来るようにがんばります。
guest

0

無限ループで回して、正しい値が入力されたら、ループを抜けるようにしたらいいのでは?

for(;;) { System.out.println("1から10の間の整数を入力してください"); int number = new java.util.Scanner(System.in).nextInt(); if (number <= 0 || number > 10) { System.out.println("指示と異なる数値が入力されました。もう一度入力しなおしてください。"); } else { System.out.println(number + "が入力されました。"); break; } }

投稿2018/03/08 14:29

masue101

総合スコア34

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

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

退会済みユーザー

退会済みユーザー

2018/03/08 15:26

for( ; ; ) や boolean T_T =true; while ( T_T ) を使う人はデスマが楽しい人だと思う。 数値以外が入力されたときの例外処理って不要だっけ?
退会済みユーザー

退会済みユーザー

2018/03/09 14:10

ありがとうございます。上記のコードを書いたところ、入力をやり直すことが出来ました。 この方法について検索したところ「実際に使う場合は終了条件を規定して書いた方がよい」といった意見がありました。なので次はその方法での書き方を考えてみます。 というかfor文は中に何も書かなくても動くんですね。それを知れてよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問