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

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

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

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

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

例外処理

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

Q&A

解決済

5回答

4588閲覧

コマンド引数が整数でなかった場合に、エラーメッセージに該当引数を表示したい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

例外処理

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

0グッド

1クリップ

投稿2020/10/21 01:19

編集2020/10/21 01:24

Javaファイルをcmdで実行させます。
引数を2つ用意し、そのどちらかでも整数でない場合、
エラーメッセージとして「整数を入力してください:a」のように、「a」の部分に該当引数を表示させます。
引数は2つ渡しているとして、どちらか1つだけ整数でない場合は、上記のように1文でよいですが、2つとも整数でない場合は、上記文を2行表示します。
下記コードのようにtry-catchで例外に飛ばした時の、該当引数の取得の仕方を教えてください。
またはほかの方法でないと出来ないのであれば、その方法を教えてください。
よろしくお願いいたします。

Kadai1.java

java

1public class Kadai1 { 2 public static void main(String[] args) { 3 int num1 = 0; 4 int num2 = 0; 5 try { 6 num1 = Integer.parseInt(args[0]); 7 num2 = Integer.parseInt(args[1]); 8 9 } catch (ArrayIndexOutOfBoundsException e) { 10 /* 引数存在チェック */ 11 System.out.println("コマンドライン引数の数は2つにしてください。"); 12 } catch (NumberFormatException e) { 13 /* 引数の整数チェック */ 14 // 下記メッセージのaの部分に該当引数を表示したい 15 System.out.println("整数を入力してください:" + a); 16 } 17 } 18} 19

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

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

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

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

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

y_waiwai

2020/10/21 01:21

提示のコードではどういう不具合があるんでしょうか
退会済みユーザー

退会済みユーザー

2020/10/21 01:22

不具合はありません。 説明に書いた仕様を実現したいための質問です
y_waiwai

2020/10/21 01:27

説明に書いてある仕様を実現できていないところがあるんでしょ? そこはどこでしょうか。
dodox86

2020/10/21 01:31

思いっきり"Kadai1"(課題1)クラスとなっているので、回答に躊躇しますね。 > try-catchで例外に飛ばした時の、該当引数の取得の仕方を教えてください。 > またはほかの方法でないと出来ないのであれば、その方法を教えてください。 力技でやれば引数毎にtry~catchすればできるでしょうし、そうではなく、引数分ループして処理すれば自然に2行になるのではないですか。 ちなみに今のコードでは、3つ以上引数をセットするとOKになってしまいますが、これは良いのでしょうか。細かいことを書くと、"コマンドライン引数の数は2つにしてください。"と言うメッセージに合致しません。
退会済みユーザー

退会済みユーザー

2020/10/21 01:39

確かに課題クラスと書いてあったら解答も難しいかもしれないですね。 力技の方法がなんとなく流れが思い浮かべたので、まずそれで作ってみようと思います。 コメントありがとうございます。 また、3つ以上の引数に関しましては仕様の確認漏れと私の単純なミスですので修正します。 ご指摘ありがとうございます。
dodox86

2020/10/21 01:44

力技でもループでも、args[n]の添え字(n)が変数であれば、何番目の引数でNGだったかも分かるはずです。(複雑に考える必要はなくて、プログラムの組み方の問題です)
退会済みユーザー

退会済みユーザー

2020/10/21 01:59

何度もすみません。。 変数nを用いると、例えば1つ目の引数でNGだった場合、2つ目の引数のチェックが通らないかと思うのですが。。。 実は今、力技の方法を書いていて気が付いたのですが、 try1つ目の引数チェック→finally→try2つ目の引数チェック としたとき、1つ目がNGで2つ目がOKの場合の処理がうまくいかないことに気づき止まっておりました。 両方のチェックが通り(引数は2つのみ渡したと仮定します)、2つともOKだった場合のみ処理続行という方法がどうしても分かりません。 整数チェックはNumberFormatExceptionでという条件があるのでtry-catchしか方法はないかと思っているのですが、方法はあるのでしょうか? それとも複雑に考えすぎなのでしょうか。。。
dodox86

2020/10/21 02:08

> 両方のチェックが通り(引数は2つのみ渡したと仮定します)、2つともOKだった場合のみ処理続行という方法がどうしても分かりません。 こういうのはプログラムの組み方で様々な方法が取れます。例えばチェックOKの回数を保存する変数を用意し、全てのチェック後、それが2回を 示していたら処理続行であるとか、1回でもNGを検出するのでよければ、NGを示すフラグ変数を使うとか。ループやtry~catchの書き方、プログラムの構造如何で、そのような変数すら必要でなくなるかもしれません。既に回答もいただいているので、そちらも参照されるのが良いと思います。
退会済みユーザー

退会済みユーザー

2020/10/21 02:20

ご丁寧にアドバイス有難うございます。 チェック回数の変数は思いつきませんでした。 確かにもっと柔軟に考えればいろいろな方法が取れそうですね。 もう少し考えてみます。 有難うございました。
guest

回答5

0

エラーチェックと本体処理を分離したほうが見やすくありませんか?

Java

1pubic class Kadai1 { 2 public static void main(String[] args) { 3 int ef = 0; // error flags 4 int num1 = 0; 5 int num2 = 0; 6 if (args.length != 2) ef |= 1; 7 else { 8 try { 9 num1 = Integer.parseInt(args[0]); 10 } catch (NumberFormatException e) { ef |= 2; } 11 try { 12 num2 = Integer.parseInt(args[1]); 13 } catch (NumberFormatException e) { ef |= 4; } 14 } 15 if ((ef & 1) != 0) 16 System.out.println("コマンドライン引数の数は2つにしてください。"); 17 if ((ef & 2) != 0) 18 System.out.println("整数を入力してください:" + args[0]); 19 if ((ef & 4) != 0) 20 System.out.println("整数を入力してください:" + args[1]); 21 if (ef != 0) return; 22 23 int sum = num1 + num2; 24 System.out.println(args[0] + "と" + args[1] + "の和は" + sum + "です。"); 25 } 26}

追記
ビット演算になじみがなければ、

Java

1pubic class Kadai1 { 2 public static void main(String[] args) { 3 boolean error = false; 4 int num1 = 0; 5 int num2 = 0; 6 if (args.length != 2) { 7 System.out.println("コマンドライン引数の数は2つにしてください。"); 8 return; 9 } 10 try { 11 num1 = Integer.parseInt(args[0]); 12 } catch (NumberFormatException e) { 13 System.out.println("整数を入力してください:" + args[0]); 14 error = true; 15 } 16 try { 17 num2 = Integer.parseInt(args[1]); 18 } catch (NumberFormatException e) { 19 System.out.println("整数を入力してください:" + args[1]); 20 error = true; 21 } 22 if (error) return; 23 24 int sum = num1 + num2; 25 System.out.println(args[0] + "と" + args[1] + "の和は" + sum + "です。"); 26 } 27}

投稿2020/10/21 04:07

編集2020/10/21 05:12
kazuma-s

総合スコア8224

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

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

0

1つのtry~catchでは1つの例外しか補足できません。
したがって

2つとも整数でない場合は、上記文を2行表示します。

は、実現できません。

  • 例外が起こらないように整数チェックを行う
  • 2回分の例外補足をする(愚直に2回書くか、関数化するか)

のいずれかのようにコードを変更する必要があります。

hava

1public static void main(String[] args) { 2 Integer num1; 3 Integer num2; 4 5 try { 6 num1 = toInteger(args[0]); 7 num2 = toInteger(args[1]); 8 9 int sum = num1 + num2; // どちらかが整数でないなら、NullPointer 10 System.out.println(args[0] + "と" + args[1] + "の和は" + sum + "です。"); 11 12 } catch (ArrayIndexOutOfBoundsException e) { 13 /* 引数存在チェック */ 14 System.out.println("コマンドライン引数の数は2つにしてください。"); 15 } catch (NullPointerException e) { 16 // エラーメッセージは表示済みなので何もしない 17 } 18 19} 20 21private static Integer toInteger(String a) { 22 try { 23 return Integer.parseInt(a); 24 } catch (NumberFormatException nfe) { 25 System.out.println("整数を入力してください:" + a); 26 return null; 27 } 28}

投稿2020/10/21 03:28

編集2020/10/21 07:24
momon-ga

総合スコア4820

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

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

0

ベストアンサー

dodox86さんのアドバイスを元に下記コード作成、エラー無く実行しました。

java

1public class Kadai1 { 2 public static void main(String[] args) { 3 int num1 = 0; 4 int num2 = 0; 5 int check = 0; 6 final int size = 2; 7 int leng = args.length; 8 if (leng != size) { 9 System.out.println("コマンドライン引数の数は2つにしてください。"); 10 System.exit(0); 11 } 12 /* args[0]の整数チェック */ 13 try { 14 num1 = Integer.parseInt(args[0]); 15 } catch (NumberFormatException e) { 16 /* 引数の整数チェック */ 17 System.out.println("整数を入力してください:" + args[0]); 18 check = 1; 19 } finally { 20 try { 21 /* args[1]の整数チェック */ 22 num2 = Integer.parseInt(args[1]); 23 if (check == 1) { 24 System.exit(0); 25 } 26 int sum = num1 + num2; 27 System.out.println(args[0] + "と" + args[1] + "の和は" + sum + "です。"); 28 } catch (NumberFormatException e) { 29 /* 引数の整数チェック */ 30 System.out.println("整数を入力してください:" + args[1]); 31 } 32 } 33 } 34} 35

投稿2020/10/21 03:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

うん?
普通に例外が飛んできた時の、NumberFormatException をcatchしているところに書けばいいのでは。

もし例外だけど、取得して処理したいとかなら、メソッド化すればいいかと。

メソッドの書き方はご存知ですよね?
わからないなら調べましょう。

Java

1 // クラス内だとして 2 3 static public int[] inputEx( String[] args ){ 4 int[] res = new int[2]; 5 try{ 6 // todo: ここで整数に変換 7 }catch( NumberFormatException e ){ 8 // todo: ここで標準入力によって取得する 9 } 10 return res; 11 }

とかみたいにして、これで取得する。とか。

できればstaticじゃない方がいいのかもしれませんが。

投稿2020/10/21 01:27

BeatStar

総合スコア4958

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

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

0

  • argsの配列のサイズが2未満だった場合。>エラーを表示して終了
  • args[0]が数値表現かをチェック>偽の場合エラー表示
  • args[1]が数値表現かをチェック>偽の場合エラー表示
  • 上記いずれかがエラーの場合、そのまま終了
  • なにか本番処理?

こういうコードで行きましょう

投稿2020/10/21 01:25

y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問