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

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

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

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Q&A

解決済

3回答

3681閲覧

Javaで指定された文字以外を受け付けない

maskedrider5556

総合スコア26

Java

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

0グッド

0クリップ

投稿2019/08/11 09:04

つい先日からjavaを学び始めました。
例外処理について詰まってしまったので質問させて頂きたいです。

プログラムは標準入力で受け取った数字までのフィボナッチ数列を表示させる仕様になっています。

この標準入力の時、"exit"と"quit"が入力されるとプログラムが終了させることは出来たのですが
他の文字列が入力されしまうとエラーを吐いてしまいます。

エラー文

Exception in thread "main" java.lang.NumberFormatException: For input string: "e" at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.base/java.lang.Integer.parseInt(Integer.java:652) at java.base/java.lang.Integer.parseInt(Integer.java:770) at Main.main(Main.java:11)

どのような例外処理を取れば良いのか分かりませんのでヘルプを頂きたく投稿させてもらいました。
よろしくお願い致します。

全体のコード

Main.java

1import java.util.Scanner; 2class Main { 3 public static void main(String[] args) { 4 Scanner scan = new Scanner(System.in); 5 while(true) { 6 System.out.print("数字を入力してください(0< N <= 70) :"); 7 String input = scan.next(); 8 if (input.equals("quit") || input.equals("exit")) { 9 break; 10 } else { 11 int num = CheckNum(Integer.parseInt(input)); 12 System.out.println(num + "番目のフィボナッチ数列: " + Fibonacci.calculate(num)); 13 System.out.println(num + "番目までのフィボナッチ数列: "); 14 for(int i=1; i<=num; i++) { 15 System.out.println(Fibonacci.calculate(i)); 16 } 17 } 18 } 19 } 20 static int CheckNum(int target) { 21 while(true) { 22 try { 23 if (target>=1 && target<=70) return target; 24 } 25 catch(NumberFormatException e) {} 26 } 27 } 28}

Fibonacci.java

1class Fibonacci { 2 public static long calculate(int num) { 3 if(num == 1) return 0; 4 if(num == 2) return 1; 5 long fx = 0, 6 f1 = 0, 7 f2 = 1; 8 for(int i=3; i<= num; i++) { 9 fx = f1 + f2; 10 f1 = f2; 11 f2 = fx; 12 } 13 return fx; 14 } 15}

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

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

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

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

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

guest

回答3

0

数値に変換できるかチェックしてから、数値に変換したいのだと思います。
だとすると、CheckNum メソッドと Integer.parseInt メソッドの呼び出しの順番が逆なのではないでしょうか?

java

1int num = Integer.parseInt(CheckNum(input));

投稿2019/08/11 09:55

nskydiving

総合スコア6500

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

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

m.ts10806

2019/08/11 09:58

CheckNumが引数の型をintで取ってますがこの作りだとtry-catchで拾えないのでは?
nskydiving

2019/08/11 10:21

そうですね、CheckNumメソッドは引数もそうですが、この形に合わせて修正が必要なりますね。
m.ts10806

2019/08/11 10:45

ただ回答でのご指摘通りそもそもの処理順の間違いは認識するところからですね。
maskedrider5556

2019/08/11 14:14

皆さまご丁寧にご回答頂き誠にありがとうございました!
guest

0

問題は数値に変換できない文字列がparseInt()に突っ込まれてしまうことが原因なので、parseInt()に突っ込む前に正規表現などで数字かどうかをチェックする、または、「数字以外は異常処理」と捉えてえelseを丸々try-catchでNumberFormatException()を拾うという手もあると思います。

投稿2019/08/11 09:16

編集2019/08/11 09:59
m.ts10806

総合スコア80850

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

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

maskedrider5556

2019/08/11 14:15

ご回答頂きありがとうございました!!
guest

0

ベストアンサー

いくつか気になる点があるので、プログラムを修正してみました。
できるだけ元の流れを維持するように書いたので不自然な部分もありますがご了承下さい。

変更点に関して記述します。

★1 Scannerが閉じられていない

今回は、たまたま実害は無いですが、ファイル等、閉じ忘れると痛い目に遭うことがあるので
意識だけはしておいた方がいいです。

★2

入力された文字列が、プログラムの動作上想定されたものかどうかチェックする処理を
追加しました。
チェックして、想定通りであれば実処理をする。という流れです。
元々のCheckNumは、色々誤りがあったので使用しないようにしました。(コードご参照ください)
※ Javaのメソッド名は先頭小文字で命名することが多いです。

import java.util.Scanner; class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); while(true) { System.out.print("数字を入力してください(0< N <= 70) :"); String input = scan.next(); if (input.equals("quit") || input.equals("exit")) { scan.close(); // ★1 break; } else { if (isValidNum(input)) { // ★2 int num = Integer.parseInt(input); // 既にチェック済みなので問題は起きない System.out.println(num + "番目のフィボナッチ数列: " + Fibonacci.calculate(num)); System.out.println(num + "番目までのフィボナッチ数列: "); for(int i=1; i<=num; i++) { System.out.println(Fibonacci.calculate(i)); } } } } } static int CheckNum(int target) { while(true) { try { if (target>=1 && target<=70) return target; // バグ 範囲外の数字を入力されると無限ループします } catch(NumberFormatException e) { // バグ ここで例外は発生しません。(ここが実行されることはありません) // catch句を空にするのはあまり良くない書き方です } } } static boolean isValidNum(String targetStr) { try { int target = Integer.parseInt(targetStr); // 数字以外であれば例外発生 if (target>=1 && target<=70) return true; System.out.println("範囲外の数字です。"); return false; } catch(NumberFormatException e) { System.out.println("数字ではありません。"); // e.printStackTrace(); return false; } } }

投稿2019/08/11 11:29

YakumoSaki

総合スコア2027

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

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

maskedrider5556

2019/08/11 14:14

丁寧にご回答頂きありがとうございます!! 非常に分かりやすかったです。 try&catchでの例外処理含めしっかりと理解しきれてない箇所がいくつか見つかったのでしっかりと復習しようと思います。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問