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

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

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

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

例外処理

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

994閲覧

FizzBuzzおよび例外処理の方法

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

例外処理

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2020/02/27 04:49

編集2020/02/27 05:25

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

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; } }

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

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

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

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

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

dodox86

2020/02/27 05:13

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

退会済みユーザー

2020/02/27 05:22

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

2020/02/27 05:38

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

2020/02/27 05:53

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

回答2

0

ベストアンサー

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

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

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

Java

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

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

課題2について、

Java

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

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

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

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

Java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4 5public class T1 { 6 public static void main(String[] args) { 7 8 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 9 int value = 0; 10 // 正しい値が入力されるまでループ 11 while (true) { 12 System.out.println("出力範囲を指定してください"); 13 try { 14 String str = br.readLine(); 15 value = Integer.parseInt(str); 16 if (value >= 5) { 17 // 5以上の整数が入力されたのでループを脱出 18 break; 19 } 20 System.out.println("出力範囲は5以上の整数で指定してください"); 21 22 } catch (NumberFormatException ex) { 23 System.out.println("出力範囲は整数で指定してください"); 24 } catch (IOException ex) { 25 System.out.println(ex.getMessage()); 26 } 27 } 28 29 System.out.println("出力範囲は" + Integer.toString(value) + "です"); 30 } 31} 32

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

CMD

1C:>javac T1.java 2 3C:>java T1 4出力範囲を指定してください 54 6出力範囲は5以上の整数で指定してください 7出力範囲を指定してください 80 9出力範囲は5以上の整数で指定してください 10出力範囲を指定してください 113.1415 12出力範囲は整数で指定してください 13出力範囲を指定してください 14string 15出力範囲は整数で指定してください 16出力範囲を指定してください 175 18出力範囲は5です 19 20C:>

投稿2020/02/27 13:46

dodox86

総合スコア9183

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

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

0

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

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

投稿2020/02/27 09:01

jimbe

総合スコア12648

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問