• ベストアンサー

引数別の例外処理

(1)コマンドラインの1つ目の引数を整数に変換して、int型の変数num1に代入。 (2)コマンドラインの2つ目の引数を整数に変換して、int型の変数num2に代入。 (3)num1とnum2の掛け算結果を標準出力。 (4)例外「NumberFormatException」が発生した場合は、“○(引数の例外発生した方の値)は整数に変換できません”の文字列を標準出力し、プログラム終了。 という問題で、NumberFormatException の○の部分の表示の仕方を教えて下さい。

  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • takaP-
  • ベストアンサー率79% (83/105)
回答No.2

一番簡単なのは、java.lang.Throwable#getMessage() を使う方法でしょうね。 try{ int num1 = Integer.parseInt(args[0]); int num2 = Integer.parseInt(args[1]); System.out.println(num1*num2); } catch(NumberFormatException ne) { System.out.println(ne.getMessage()+"は整数に変換できません"); System.exit(0); } こんな感じで。

suzuno
質問者

お礼

昨日、今日と連日お世話になりありがとうございます。 まだまだ、勉強して間もないもので…。 java.lang.Throwable#getMessage() ですね。 知らない用語ですが、調べてみます。ありがとうございました。

その他の回答 (2)

  • takaP-
  • ベストアンサー率79% (83/105)
回答No.3

java.lang.Throwable#getMessage() という書き方が悪かったかもしれませんね。 これは、プログラマ間でメソッド情報のやり取りをする場合に良く使われる記述でして... パッケージ.クラス名#メソッド名 という記述ルールになっています。 今回の場合でしたら、java.lang パッケージ内の Throwable クラスに在る getMessage() メソッドを指し示しています。 Java API Reference 等で検索する時見つけやすい様にという配慮から、こういった記述が好まれるのだと思います。 例外やエラーのクラスは全て java.lang.Throwable クラスを継承していますので、今回の java.lang.NumberFormatException というクラスも Throwable のメソッドを全て持っています。 ですから、catch ステートメントの引数として送られてくる NumberFormatException のインスタンスに対して、getMessage() を指示する事が可能なのです。 それで、getMessage() メソッドで得られる文字列は、例外を起こすメソッド(今回の場合は、java.lang.Integer#parseInt() です)によって、何をメッセージ文字列にするのかは違ってきますが、java.lang.Integer#parseInt() を作成したプログラマは、parseInt() で整数変換が不可能だった引数の文字列をそのまま返す仕様に決めたわけです。 public static int parseInt(String s)throws NumberFormatException { //文字列を整数に変換する処理 ~省略~ //変換に成功したら... return int_number //変換に失敗したら... throw new NumberFormatException(s); } おおざっぱですけど....こんな感じです。 ですから、 int i = Integer.parseInt("NotNumber"); で起きた例外、NumberFormatException のインスタンスne の getMessage() での戻り値は、"NotNumber" 文字列になります。 余計に解かり辛いかもなぁ(笑

suzuno
質問者

お礼

わざわざご説明ありがとうございます。 なんとなく仕組みが分かりました。 大変勉強になりました。ありがとうございました。

  • wogota
  • ベストアンサー率42% (66/154)
回答No.1

それぞれの行程別にtry~catchを行うか、フラグとなる変数を用意しておき行程によって 値を設定しておくなどがあると思います。 前者の方法を用いて、たとえば引数としてString[] argsを与えたとして、 try{   num1= Integer.parseInt( args[ 0]); }catch( NumberFormatException nfe){   System.out.println( args[ 0]+ "は整数に変換できません");   return; }catch( Throwable thr){   System.out.println( "何かをキャッチ");   return; } try{   num2= Integer.parseInt( args[ 1]); }catch( NumberFormatException nfe){   System.out.println( args[ 1]+ "は整数に変換できません");   return; }catch( Throwable thr){   System.out.println( "何かをキャッチ");   return; } という形で記述できると思います。

suzuno
質問者

お礼

早速のご回答ありがとうございます。 なるほど、catch でreturn を使えばよかったんですね。 ずっとcontinue で頑張ってました。 これから、試してみたいと思います。

関連するQ&A

  • コマンドライン引数の例外処理について

    整数a、bをコマンドライン引数として受け取るプログラムを作成するとします。この時、入力するコマンドライン引数を整数であるa、b2つのみとします。 次の事柄について教えて下さい。 (1)コマンドライン引数を2個入力しなかった時の例外処理の仕方 (例えば、コマンドライン引数を入力しなかったり3個入力した時) (2)整数のコマンドライン引数を入力しなかった時の例外処理の仕方 (例えば、「abc」などと入力した場合) (3)コマンドライン引数を数の小さいものから入力しなかった時の処理の仕方 (例えば、「3 5」ではなく「5 3」と入力した場合) 初心者なもので…。どなたかお教え下さい。宜しくお願いします。

    • ベストアンサー
    • Java
  • コマンドライン引数のチェック

    args[]ってString型の配列変数ですよね? たとえば、 コマンドライン引数で数字を受け取って演算するために Stringからint等の数値に変換するとします。 Integer.ParseInt()を使うと、もし数字ではない引数 だったときに例外処理が発生します。 事前に文字か数字がチェックする方法はあるのでしょうか? それとも例外処理で対応するしかないのでしょうか?

    • ベストアンサー
    • Java
  • for文を使った累乗の計算方法について

    質問させてください。 for文を使った累乗の計算プログラムを作っています。 数値はコマンドライン引数から取得し、0番目の数字を i番目の数字分累乗するというものです。 ソースを途中まで作成したのですが、0乗した場合のプログラムが よく分かりません。どなたか教えていただけないでしょうか? public class Mondai { public static void main(String[] args) { //変数の初期化 int k = 0; if ( 2 <= args.length && args.length < 3) { //コマンドライン引数の数だけ配列を用意する int[] num = new int[args.length]; //0,1番目のコマンドライン引数を整数に変換してnumに代入する num[0] = Integer.parseInt(args[0]); k = num[0]; k *= k; num[1] = Integer.parseInt(args[1]); //num[1]の掛け算をnum[1]回繰り返す for (int i = 0; i < num[1] -2; i++) { k *= num[0]; } System.out.println("\"" + num[0] +"の" + num[1] + "乗は"+ k + "\""); if(num[1] == 0) { System.out.println("\"" + num[0] +"の" + num[1] + "乗は1\""); } //args.length <= 1の条件の時 } else if(args.length <= 1) { System.out.println("引数が足りないため累乗の計算ができません。"); //指定された条件以外の時 } else { System.out.println("引数が多すぎるため累乗の計算ができません。"); } } }

    • ベストアンサー
    • Java
  • 例外処理をするソースコードについて

    例外処理するソースコードについて質問があります。 まず例外処理される前のファイルのソースコードを見てください。 public class JTest13 { public static void main(String[] args) { System.out.println("実行開始"); long lngTmp; //以下を実行した瞬間に引数が無いか、整数に直せなかったら例外がスローされる lngTmp = Long.parseLong(args[0]); //割り算を実行する(小数点以下の数値を管理する必要がある)ため、double型に変換します System.out.println(Double.parseDouble(args[0]) / 2); System.out.println("tryブロック終了"); System.out.println("実行終了"); } } ここでアルファベットを入力すると、 実行開始 Exception in thread "main" java.lang.NumberFormatException: For input string: "a" at java.lang.NumberFormatException.forInputString(Unknown Source) at java.lang.Long.parseLong(Unknown Source) at java.lang.Long.parseLong(Unknown Source) at JTest13.main(JTest13.java:20) これで例外処理クラスがNumberFormatExceptionだと分かるんですが、 こういう結果がでなければいけません。 実行開始 例外:java.lang.NumberFormatException For input stirng:"a" 引数を整数で入力して下さい。 実行終了 これで問題なのがmainメソッドで例外処理するのではなく、整数チェック用のメソッド内でエラー処理するプログラムを作らなければならない事です。 変数がargs[0]なのでどうやってメソッドを作っていいのか分かりません。 ヒントだけでいいので、どうぞ宜しくお願い致します。

    • ベストアンサー
    • Java
  • 例外処理のことで

    class ExceptionTest{ static int array[] = {10,20,30,40,50}; void print(){ for(int i=0;i<10;i++) System.out.println(array[i]); } public static void main(String args[]){ new ExceptionTest().print(); } } /* 対処前 10 20 30 40 50 Exception in theread "main"java.ArrayIndexOutOfBoundsException:5 at ExceptionTest.print(ExceptionTest.java:6) at ExceptionTest.main(ExceptionTest.java:10) という実行結果を 対処後 10 20 30 40 50 例外 例外 例外 例外 例外 */ という出力結果を出したいのですがどうしたらいいのですか? また、 /* 10 20 30 40 50 例外が発生しました */ という出力結果も同様にお願いします。

  • 【JAVA】配列の要素の平均について

    JAVAで質問となります。 以下のプラグラムを教えていただきたいです。 ____________________ n 個の要素で構成される int 型の配列を引数として受け取り,配列内の全要素の平均値を返すメソッドを作成してください. また,コマンドライン入力に整数値を入力すると,作成したメソッドを使用して,入力した整数値の平均値を求め,結果を標準出力に出力するプログラムを作成してください. このプログラムを作成する際は,以下の要件を満たすように作成してください:  【メソッド】 配列内の全要素の平均値を求めるメソッドは,以下の仕様とする: メソッド名:calcAverage 引数:配列 - int 型の配列 戻り値:平均値 - double 型 内容:引数として受け取った配列のすべての要素の平均値を計算する.  【入力】 整数値のデータは,コマンドライン入力に入力する. その際,各整数値は,半角スペースで区切る.  【出力】 コマンドライン入力に1つ以上の整数値が入力された場合は,それらの平均値を出力する. コマンドライン入力に何も入力されなかった場合は,何も出力しない. 平均値の出力は,全体を左詰めで小数点以下2桁まで出力する. 行の先頭には空白を入れず,行の左端から出力する.

  • 初歩的な メソッドの引数について

    参考書のサンプルなんですが、 Carクラスのメソッドの引数のところで num = n と代入しているのですが、 これを直接void setNum(int num)としたほうがらくだと思うのですがなにか意味があるのでしょうか? class Sample4{ public static void main(String args[]){ Car car1 = new Car(); car1.setNum(33); } } class Car{ int num; void setNum(int n){ num = n; System.out.println("台数" + num); } }

    • ベストアンサー
    • Java
  • 【Java】複数の引数の数値と文字列の判定

    Javaについてです。 コマンドライン引数を複数渡し、渡ってきた値が数字のみの場合は、数値*数値の文字数を出力し 数字のみでない場合は文字列を逆から1文字ずつ出力する。 数値の判定はtry/catchで行い、catchメソッドには「stringFlg = true;」のみにする。 というプログラムを作りたいのですが、 引数が1つの時は上手くいくのですが、11 2あ あ3 44を渡した場合、 22 あ 2 3 あ 88 と出るはずが、 22 1 1 あ 2 3 あ 4 4 と出てしまいます…。 どうしたら全ての引数を正しく表示出来るのでしょうか?教えて下さい。 現時点のソースコードです。 public class Test { public static void main(String[] args) { boolean stringFlg = false; try { if(StringUtils.isNumeric(args[0])){ for(String arg : args) { int num = Integer.parseInt(arg); System.out.println(num * arg.length()); } } else{ stringFlg = true; } } catch (NumberFormatException e) { stringFlg = true; } if(stringFlg){ for(String val : args) { String[] str = val.split(""); for(int i = str.length-1; i >= 0; i--){ System.out.println(str[i]); } } } } }

    • ベストアンサー
    • Java
  • コマンドライン引数

    1~10の整数のコマンドライン引数を受け取り、それと等しい英語及び受け取った引数の数を表示するプログラムを作りたいのですがわかりません。 引数がない場合、1~10以外の整数の場合はエラーメッセージを表示させてプログラムを終了するようにしたいです。 出力する英語の文字列は String 配列に格納するようにします。 実行結果です。 % java englishNum 2 3 1 Two Three One length : 3 % java EnglishNum No Parameter! % java EnglishNum 30 Only 1-10!

    • ベストアンサー
    • Java
  • mainメソッドの引数は何を表す?

     基本的なことで恐縮ですが、mainメソッドの引数は何を表すのでしょうか? コンソールアプリケーションでは(String args[])が、GUIアプリケーションでは(Graphics g)のようなものが入っていますが、これは何なのでしょう?  String args[]のほうは、コマンドライン引数を格納するための変数だと解説書に書いてあったのですが、mainがどうしてコマンドライン引数や、あるいはGraphics g に対して、処理を行う(?)のかがわかりません。  よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう