search
LoginSignup
1

More than 1 year has passed since last update.

posted at

updated at

Scanner 正常入力になるまで無限ループ

Scanner 正常入力になるまで無限ループ

前回 の振り返り

前回はtry-catch構文を使って、例外クラスが使われた時の処理を実装するという内容をやりました。

今回は入力のパターンを全て考えてif文、try-catch構文、while文を使い入力が異なる場合ループさせる方法についてご説明します。

てことで例題いっちゃいましょ〜!

例題

・入力が正の整数値の場合だけ数値を出力、他の場合は入力に戻る。

コンソール
スクリーンショット 2020-05-30 17.43.38.png

まず、気をつけて欲しいのが0は正の整数ではないということです。(中学生内容)
ループごとの改行は見やすさのために行いました。
処理の通知の文を出力してコードの動きを追いやすくしてみました。

特にbreak;continue;に注目してください。
コメントアウトの詳しい説明は後ろの方に載っているので分からなくてもとりあえず読み進めてください(^^;;

コード
スクリーンショット 2020-05-30 17.43.54.png

コンソール画面(もう一度)
スクリーンショット 2020-05-30 17.43.38.png

全体の構造

  • try-catch構文をwhile文でループさせています。特にエラーが起きる可能性のない処理をtryブロック内に入れているのは変数のスコープ(有効範囲)を広げないためです。合ってるかはわかりません。
  • 基本は無限ループ、continue;breakを使って流れを制御

  • 無限ループの書き方はwhile(true)for(;;)などが簡単だと思います。

プログラムの流れ(基本的には無限ループの中にあることを忘れずに)

  1. まずint型変数num に標準入力を代入します。
  2. ここで例外(文字や少数)が発生した場合はcatchブロックの処理を行いwhile文により次のループへ移行します。-> 1へ
  3. 例外が発生しなかった(正or負の整数、0)場合、if文によってnumを場合分けします。
  4. numが0または負の整数だった場合、メッセージを出力してcontinue;以下のwhileブロックの処理をスキップします。 -> 1へ
  5. numが正の整数だった場合、ifブロック内の処理を行い、tryブロックの次の行に移行します。
  6. 正常処理を終えた場合は無限ループから脱出しないといけないのでbreak;を使って無限ループを抜けます。
  7. Scannerクラスを閉じます。

これで入力に対して全ての場合わけをして、正常処理を行うまで再入力を求めるプログラムができました。

無限ループについて

プログラム中に予期せぬ無限ループが発生したらCtrl + cで止まるので焦らず対処しましょう。
Macユーザーは、環境設定 > 一般 > エディター > キー の画面から終了のキーを設定しましょう。
以下、デフォルトの終了キー設定
スクリーンショット 2020-05-30 14.52.40.png

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1