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

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

ただいまの
回答率

87.61%

FizzBuzzおよび例外処理の方法

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,006
退会済みユーザー

退会済みユーザー

以下の問題に取り組んでいるのですが、上手く実行することができませんでした。
この問題は自習で取り組んでいるのですが、解答がない為に解決できずにいます。

2つの問題があるのですが、どちらに関しても、コードにおける"出力範囲は整数で指定してください"と出力するべき部分において、整数以外の値(文字列や少数など)を入力した際にNumberFormatExceptionが発生してしまいます。
課題2については、例外処理の方法が間違っていることが原因なのでしょうか?

どのような理由で、"出力範囲は整数で指定してください"というメッセージが表示されないのか、また、その対処方法を教えていただきたいです。

初心者であるため、初歩的な質問で申し訳ありませんが、よろしくお願い致します。

(1)課題1 出力数の指定 以下の条件を満たすプログラムを作ってください。クラス名は FizzBuzz1、ファイル名は FizzBuzz1.java としてください。 ・出力数をコマンドラインで指定できるようにする。 ・各値は改行でなく、コンマ(,)で区切り出力する。 ・以下の 3 点について引数のチェックを行う。   引数が入力されないときは「出力範囲を指定してください」と出力する。   引数が整数でないときは「出力範囲は整数で指定してください」と出力する。   引数は整数だが 4 以下のときは「出力範囲は 5 以上の整数で指定してください」と出力。 ・パッケージの指定はしない。 ・Shift-JIS でコード化する。 

例 java FizzBuzz1 7 と入力すると次のように表示する。      1,2,Fizz,4,Buzz,Fizz,7, 

(2)課題2 剰余演算子不使用 課題1を改造して、剰余演算子(%)を使わないプログラムを作ってください。クラス名 は FizzBuzz2、ファイル名は FizzBuzz2.java としてください。条件は課題 1 と同じにして ください。 

該当のソースコード

課題1

package unit2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class FizzBuzz1 {

    public static void main(String[] args)throws IOException {

        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

        System.out.println("出力範囲を指定してください");

        String buf=br.readLine();
        int bf=Integer.parseInt(buf);

        if(bf<=4) {
            System.out.println("出力範囲は5以上の整数で指定してください");
        }

        //整数でなかったら出力(bfを2で割った余りが1でも0でもない)
        if(bf%2!=1&&bf%2!=0) {
            System.out.println("出力範囲は整数で指定してください");
        }
    }

}


課題2

package unit2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class FizzBuzz2 {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        System.out.println("出力範囲を指定してください");

        String buf = br.readLine();
        int bf = Integer.parseInt(buf);

        if (bf <= 4) {
            System.out.println("出力範囲は5以上の整数で指定してください");
        }
    }
        public static int num(int buf) {
        //整数でなかったら出力(整数でないと、NumberFormatExceptionが発生するので、それを例外処理)
        try {
            int bf=buf;
        } catch (NumberFormatException e) {
            System.out.println("出力範囲は整数で指定してください");
        }
        return buf;
    }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • dodox86

    2020/02/27 14:13

    > 解答がない為に解決できず

    いや、その解決の為の解答をするのは質問者さんご自身でしょう。
    質問でどんな回答を得たいのがが正直、不明瞭です。課題の条件が質問に書かれていますが、ご提示のコードはそれを反映していなく未完成なので、どこまでの回答を求めているのか分かりづらいです。
    ・「例外の使い方が正しいのかどうか」が知りたいのか。
    ・「NumberFormatException例外が起きてしまうが、どうしたら良いか。何か考え方があるか。」などのアドバイスを得たいのか。
    ・「課題1と課題2を解きたい」のか。<当然、最終的にはここに行き着きたいのでしょうが、これが質問となりますと範囲が広く、また作業依頼になるので質問としては非推奨です。(低評価を食らいやすくなります)

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2020/02/27 14:22

    ご依頼ありがとうございます。
    初の質問であった為、とても参考になるアドバイスでした。修正させていただきます。

    キャンセル

  • hoshi-takanori

    2020/02/27 14:38

    問題文をよく読みましょう。エラーがない時の出力が何もなくて、FizzBuzz になってません。また、「出力数をコマンドラインで指定できるようにする。」と書いてありますが、なぜかコマンドライン引数を指定しても入力待ちになってしまいます。また、例外処理のやり方も間違ってます。課題頑張ってください。

    キャンセル

  • dodox86

    2020/02/27 14:53

    (質問の修正を受けて)FizzBuzzと言うロジックを実現する前の段階の質問とお見受けします。そうであれば、「どのような理由で、"出力範囲は整数で指定してください"というメッセージが表示されないのか、また、その対処方法を教えていただきたい」と言う部分で、質問が成立します。

    キャンセル

回答 2

checkベストアンサー

+2

FizzBuzzのロジックを組み立てることが主な目的の2つの課題がありますが、ご提示のコードはまだ途中のものですので、以下のご質問について回答します。

どのような理由で、"出力範囲は整数で指定してください"というメッセージが表示されないのか、また、その対処方法を> 教えていただきたいです。

課題1について、"出力範囲は..."のコードは以下(抜粋)ですが、

int bf=Integer.parseInt(buf);
...
//整数でなかったら出力(bfを2で割った余りが1でも0でもない)
if(bf%2!=1&&bf%2!=0) {
    System.out.println("出力範囲は整数で指定してください");
}


改めてよく考えてみましょう。「整数でなかったら」とありますが、int bfと宣言しているところ、int型は整数しか格納できません。整数であれば2で割った余りは1(つまり割られる数が奇数)か0(つまり割られる数が偶数)しか存在しないのですから、「2で割った余りが1でも0でもない」と言う条件は絶対満たされず、結果としてそのif文の中のコードは実行されません。小数であれば2で割った余りが1か0以外が有り得ますが、このコードでは小数を扱う部分が無いので、当然の結果です。

課題2について、

public static int num(int buf) {
    //整数でなかったら出力(整数でないと、NumberFormatExceptionが発生するので、それを例外処理)
    try {
        int bf=buf;
    } catch (NumberFormatException e) {
        System.out.println("出力範囲は整数で指定してください");
    }
    return buf;
}

numメソッドの引数はint bufなのですから、この時点でint型、つまり整数です。trycatchで包まれたコード部分は、int bfと言う別の変数に同じint型の値を代入しているだけなので、NumberFormatExceptionと言う例外が発生することは絶対にありません。ただスルーします。

質問者さんは恐らくまだ、例外発生の際のコードの動きが具体的にイメージできていないのだと思います。(初心者なのですから、無理からぬことです)何となくああでもない、こうでもないと言うかんじでコードを書いていませんか。trycatch~(場合によって)finallyは、特に初心者にとって直感的ではない動きをします。try { ~ }内のブロックから投げ出される(そのもの、throwです)例外を、catch節でまさにキャッチ(捕捉とも言います)するように動きます。例外がthrowされたとき、catch節まで突然飛んでいくように動くのでイメージがしづらいと思いますが、Eclipseなどのデバッガーで1行1行実行して確認すると、早く理解できるでしょう。きちんと理解したいのであれば、ぜひデバッガーで動作をひとつひとつ追ってください。

参考までに、数値入力だけに着目した実装例を以下に示します。正しい値を入力するまでループで繰り返しますが、あくまで一例と捉えてください。※ただもし、下記のコードを読んで流れが良く理解できなければ、基本的なJavaの構文の理解もおぼつかないのかもしれません。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class T1 {
    public static void main(String[] args) {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int value = 0;
        // 正しい値が入力されるまでループ
        while (true) {
            System.out.println("出力範囲を指定してください");
            try {
                String str = br.readLine();
                value = Integer.parseInt(str);
                if (value >= 5) {
                    // 5以上の整数が入力されたのでループを脱出
                    break;
                }
                System.out.println("出力範囲は5以上の整数で指定してください");

            } catch (NumberFormatException ex) {
                System.out.println("出力範囲は整数で指定してください");
            } catch (IOException ex) {
                System.out.println(ex.getMessage());
            }
        }

        System.out.println("出力範囲は" + Integer.toString(value) + "です");
    }
}


上記コードの、Windowsコマンドプロンプト上での実行例です。

C:>javac T1.java

C:>java T1
出力範囲を指定してください
4
出力範囲は5以上の整数で指定してください
出力範囲を指定してください
0
出力範囲は5以上の整数で指定してください
出力範囲を指定してください
3.1415
出力範囲は整数で指定してください
出力範囲を指定してください
string
出力範囲は整数で指定してください
出力範囲を指定してください
5
出力範囲は5です

C:>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

整数以外の値(文字列や少数など)を入力した際にNumberFormatExceptionが発生してしまいます

その時, どこで発生しているかも表示されるはずです.
その発生している個所を try-catch で囲まなければ, 例外処理とは言えません.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る