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
提示のコードではどういう不具合があるんでしょうか
不具合はありません。
説明に書いた仕様を実現したいための質問です
説明に書いてある仕様を実現できていないところがあるんでしょ?
そこはどこでしょうか。
思いっきり"Kadai1"(課題1)クラスとなっているので、回答に躊躇しますね。
> try-catchで例外に飛ばした時の、該当引数の取得の仕方を教えてください。
> またはほかの方法でないと出来ないのであれば、その方法を教えてください。
力技でやれば引数毎にtry~catchすればできるでしょうし、そうではなく、引数分ループして処理すれば自然に2行になるのではないですか。
ちなみに今のコードでは、3つ以上引数をセットするとOKになってしまいますが、これは良いのでしょうか。細かいことを書くと、"コマンドライン引数の数は2つにしてください。"と言うメッセージに合致しません。
確かに課題クラスと書いてあったら解答も難しいかもしれないですね。
力技の方法がなんとなく流れが思い浮かべたので、まずそれで作ってみようと思います。
コメントありがとうございます。
また、3つ以上の引数に関しましては仕様の確認漏れと私の単純なミスですので修正します。
ご指摘ありがとうございます。
力技でもループでも、args[n]の添え字(n)が変数であれば、何番目の引数でNGだったかも分かるはずです。(複雑に考える必要はなくて、プログラムの組み方の問題です)
何度もすみません。。
変数nを用いると、例えば1つ目の引数でNGだった場合、2つ目の引数のチェックが通らないかと思うのですが。。。
実は今、力技の方法を書いていて気が付いたのですが、
try1つ目の引数チェック→finally→try2つ目の引数チェック
としたとき、1つ目がNGで2つ目がOKの場合の処理がうまくいかないことに気づき止まっておりました。
両方のチェックが通り(引数は2つのみ渡したと仮定します)、2つともOKだった場合のみ処理続行という方法がどうしても分かりません。
整数チェックはNumberFormatExceptionでという条件があるのでtry-catchしか方法はないかと思っているのですが、方法はあるのでしょうか?
それとも複雑に考えすぎなのでしょうか。。。
> 両方のチェックが通り(引数は2つのみ渡したと仮定します)、2つともOKだった場合のみ処理続行という方法がどうしても分かりません。
こういうのはプログラムの組み方で様々な方法が取れます。例えばチェックOKの回数を保存する変数を用意し、全てのチェック後、それが2回を
示していたら処理続行であるとか、1回でもNGを検出するのでよければ、NGを示すフラグ変数を使うとか。ループやtry~catchの書き方、プログラムの構造如何で、そのような変数すら必要でなくなるかもしれません。既に回答もいただいているので、そちらも参照されるのが良いと思います。
ご丁寧にアドバイス有難うございます。
チェック回数の変数は思いつきませんでした。
確かにもっと柔軟に考えればいろいろな方法が取れそうですね。
もう少し考えてみます。
有難うございました。
回答5件
あなたの回答
tips
プレビュー