プロが教えるわが家の防犯対策術!

例外処理するソースコードについて質問があります。
まず例外処理される前のファイルのソースコードを見てください。

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]なのでどうやってメソッドを作っていいのか分かりません。
ヒントだけでいいので、どうぞ宜しくお願い致します。

A 回答 (13件中1~10件)

お疲れ様。



ちなみに私ならこう書くわ。


public class Fight {
public static void main(String[] args) {
System.out.println("実行開始");

//以下を実行した瞬間に引数が無いか、整数に直せなかったら例外がスローされます。
if (args.length != 1) {
System.out.println("引数を一つ入力してください。");
}
try {
//割り算を実行する(小数点以下の数値を管理する)ため、double型に変換します。
System.out.println(parseDouble(args[0]) / 2);
System.out.println("tryブロック終了");
System.out.println("実行終了");
} catch (NumberFormatException e) {
System.out.println("引数に整数を入力して下さい。");
}
}

//同じクラス内からオブジェクト変数を作成せずに呼ばれる為、Staticを付ける。
static double parseDouble(String input)
throws NumberFormatException {
try {
return Double.parseDouble(input);
} catch (NumberFormatException e) {
System.out.println("例外:" + e.getClass().getName() + " " + e.getMessage());
throw e;
}
}
}

もっとも出題者の意図に合っているかどうかという問題はあるけど。
あ、コンパイルも動作も試していないので
ミスがあったらゴメン。
    • good
    • 0
この回答へのお礼

姉御、見捨てないでいてくれて物凄く嬉しいです。
自分は今回staticメソッドの事を学びました。
後、エラーの表示方法は2回目ですね。
中々エラーを表示させるところまで頭が回らなくて。
でも、何回もやっていれば少しずつ覚えていくと思っています。
後、ExceptionクラスのgetClass()、getName()、getMessage()についてはここで知りました。
また姉御のお力を借りるときもあると思いますが、不出来な弟(逆かも?)と思って、面倒見てやって下さい。
今回は色々と感謝しています。
でも、誰にポイントを上げればいいのかが悩みですね。
どうしましょう……。

お礼日時:2009/02/25 14:34

い いいけど・・・


好きにして
    • good
    • 0
この回答へのお礼

姉御~、本当の本当の本当にすみません。
自力ではどうしても無理でした。
次のサンプルソースコードを見て下さい。

class Fight {
public static void main(String[] args) {
System.out.println("実行開始");

//以下を実行した瞬間に引数が無いか、整数に直せなかったら例外がスローされます。
if (args.length != 1) {
System.out.println("引数を一つ入力してください。");
return;
}
if (literalCheck(args[0])==false){
System.out.println("引数に整数を入力して下さい。");
return;
}
//割り算を実行する(小数点以下の数値を管理する)ため、double型に変換します。
System.out.println(Double.parseDouble(args[0]) / 2);
System.out.println("tryブロック終了");
System.out.println("実行終了");
}

//同じクラス内からオブジェクト変数を作成せずに呼ばれる為、Staticを付ける。
static boolean literalCheck(String input) {
long lngTmp;
try {
lngTmp = Long.parseLong(input);
} catch (NumberFormatException e) {
System.out.println("例外:" + e.getClass().getName() + " " + e.getMessage());
return false;
}
return true;
}
}

1日ではありますが、精一杯努力はしたつもりです。
それと、どうしても月日と追いかけっこになってしまうので、できれば早く知って次の課題に進めたいっていう思いが勝ってしまいました。
自分の事を思ってレスを書いて頂いた方へは、もうどういう言葉でも表現できない罪悪感のようなものを感じております。
土下座状態です。
お怒りのコメントもしっかりと受け止めますのでお書き下さい。
姉御も失望したかもしれませんが、どうしてもこういう方法しか無かったのを理解して頂きたいです。
最後に、サンプルを見た事によって(少しソースコードを書き加えたりしてます)新たな知識を得る事ができました。

お礼日時:2009/02/25 08:45

ん~


他の方がつっこんでいるので
あとはガンバと言うところね。

でも一つだけ言わせて。

> 取り敢えず思い浮かんだ形を貼り付けます
貼り付けるんじゃなくて
実行してみなさい。
    • good
    • 0
この回答へのお礼

またまたレスを頂き、感謝しています。
そうですね、実行してみます。
後、これからはaskaaskaさんを姉御と呼ばせてもらいますが、宜しいでしょうか。
お互い年齢が分からないので、逆って場合もアリだと思うんですけど、自分にとって姉御は姉御なんで、嫌いじゃ無かったら許して下さい。
絶対にイヤなら、即やめます。

お礼日時:2009/02/25 00:01

すみませんが, 「条件をちょっとずつ出す」というのはやめてください. 条件があるというのは当然だしかまわないんだけど, 答える立場で考えて「たくさんの条件を一度に出される」というのと「ちょっとずつ出される」というので, どちらがより「うんざりする」と思いますか?


さておき, 少なくとも「Long.parseLong の呼び出しが try ブロックの中になければならない」ことは理解できてます? だから, 端的にいって
try {
Long.parseLong(args[0]);
}
catch (NumberFormatException e) {
println したりなんなり
}
という形にしなきゃいかんよね, ってのが例えば #7 でいっていることだと思う.
    • good
    • 0
この回答へのお礼

まだじっくり考え中のままですが、再度のレスを頂き、ありがとうございます。
まず、別に小出しにしてるつもりはないのですが、お気に触ったのでしたらお詫びします。
自分としては、最初の質問で全てを語ったつもりなんですが、言葉が足りずに申し訳ありませんでした。
これは、実は講義の課題でしてなるべくならヒントだけで自力でチャレンジしたかったんですが、所詮は無理でした。
今は、皆さんのアドバイスを手がかりに頑張ってみようと思います。

お礼日時:2009/02/24 23:55

回答番号:No.7の回答に対するコメントです。


return n;
ではNumberFormatExceptionが発生しないので駄目です。
そもそもStringを数値として扱う(Long.parseLong()とかDouble.parseDouble)ところで発生する例外なのでtryの中で
そういったメソッドを使う必要があります。
メソッドの引数はStringのまま(args[0])でいいです。
    • good
    • 0
この回答へのお礼

レスを頂き、ありがとうございます。
一応努力してやってみます。

お礼日時:2009/02/24 23:57

これじゃダメなのかな?



public static void main(String[] args) {
System.out.println("実行開始");
try{
//以下を実行した瞬間に引数が無いか、整数に直せなかったら例外がスローされる
//割り算を実行する(小数点以下の数値を管理する必要がある)ため、double型に変換します
System.out.println(Double.parseDouble(args[0]) / 2);
} catch(Exception e){
System.out.println(e.getClass().getName() + " " + e.getMessage());
System.out.println("引数を整数で入力して下さい。");
}
System.out.println("tryブロック終了");
System.out.println("実行終了");
}

質問の意図がよくわからない・・・
メソッド外だしして例外処理しないといけないってこと?
    • good
    • 0
この回答へのお礼

レスを頂き、ありがとうございます。
わざわざソースコードを書いて頂いて感謝です。
ですが、最初のlong lngTmp;が無くなっているのと、
例外処理はmainメソッド以外の別メソッドでという事なので、大変有り難いのですが、違うのです。
変数lngTmpを消さずに、しかも、例外処理は別メソッドで処理しないといけないのが条件なので。
折角考えて頂いたのに申し訳ありません。

お礼日時:2009/02/24 21:39

> 問題はどこから新しいメソッドを作ればいいのか、なんですよね。


Long.parseLongを別メソッドで実行するのよ。
#3の方のように呼んで上げればいいの。
戻り値はlong。引数はargs[0]でOKよ。

Long.parseLongをtry-cacthで囲って
NumberFormatExceptionをcatchして
エラーをprintln。
その後発生したNumberFormatExceptionをthrowして
mainでさらにcatch。
何もせずに終了ね。
    • good
    • 0
この回答へのお礼

askaaskaさん、度々のご助力有り難く感じています。
何か、ヒントと言うよりもう既に解答になってしまってますが。
でも、これくらい書いてもらわないと、まだ未熟は自分としてはダメだという事が分かりました。
取り敢えず思い浮かんだ形を貼り付けます。
自分がバカでしたら、バカと言って下さい。

public class TestJava {

public long literalCheck(long n) {
try {
return n;
}catch(NumberFormatException e) {

}
}
public static void main(String[] args) {
System.out.println("実行開始");
long lngTmp;
//以下を実行した瞬間に引数が無いか、整数に直せなかったら例外がスローされる
lngTmp = Long.parseLong(args[0]);
iteralCheck(lngTmp);
//ここで間違っているんですよね。

//割り算を実行する(小数点以下の数値を管理する必要がある)ため、double型に変換します
System.out.println(Double.parseDouble(args[0]) / 2);
System.out.println("tryブロック終了");
System.out.println("実行終了");
}

}

お礼日時:2009/02/24 21:32

うぅん, 意味が分からん.


「問題はどこから新しいメソッドを作ればいいのか、なんですよね。」
の「どこ」とは何を意味するのか (「同じクラスの別のところで作ればいい」などの回答を期待してる?),
「そして、それはString型のメソッドなのかどうかって事ですね。」
の「String型のメソッド」とは何のことなのか (引数の型なのか返り値の型なのかわからん).
作るべきメソッドの仕様は理解できてますか? 理解できていないなら, じっくりと考えてください. 理解できているなら「引数の型」と「返り値の型」および (返り値の型が void でない場合は) 引数がどのような値のときにどのような値を返せばいいのかを書いてみてください.
    • good
    • 0
この回答へのお礼

厳しいお言葉に、胸に突き刺さるほど痛感しています。
どこからと言うのは同じクラス内でという訳ではなく、どこの段階でという事ですかね、はい。
String型のメソッドとは、
public String literalCheck() {
}
という感じですかね。
でも、それだとlong型に変換している意味がなくなるから、ダメだと。
しかも、String型だとNumberFormatExceptionにはかからない。
なので、折角long型の変数に入れたのだから、その先は…………。
少しじっくりと考えさせてもらいます。

お礼日時:2009/02/24 21:04

> String型のメソッドを作るという事はreturnでString型を返すんですよね。



その必要はないですよ。
例えば
lngTmp = Long.parseLong(args[0]);
これはString型を引数にとってlong型を返してますよね。

> そうですよね。やはりargs[0]をmainメソッド以外で使用する事はできない。
可能です。
No.4の方が回答されているようにメソッドの引数で渡していけば使えます。
上記の例でもmainメソッド以外(parseLong)でargs[0]を使用しています。

以下参考までに。
---args[0]が使える範囲(インスタンス変数にセットしない場合)---

public class JTest13 {
//ここでは使えない
public static void main(String[] args) {
/*ここから
・・・
ここまで*/
}
//ここも使えない
}
    • good
    • 0
この回答へのお礼

再度のレスを頂き、ありがとうございます。
情けない事ながら、ヒントだけでは何も出来ない事をヒシヒシと感じています。
基礎の基礎を教わっている事自体お恥ずかしいったらありゃしないです。
まず、args[0]である以上mainメソッド内でしか使えない。
でも、long型で返しているargs[0]はlong型の変数になっているので、別メソッドで使える…………のですか。
それで、ここでtry catchをする。このメソッドから出る。
後は出力されて実行終了って事ですかね。

お礼日時:2009/02/24 20:43

> mainメソッド以外でargs[0]って使用できますか


このままでは使えないわね。
argsはこのmainメソッドの
ローカルな変数ですもの。
メソッドの引数で渡していけば
他のメソッドでも使えるようになるわよ。
    • good
    • 0
この回答へのお礼

askaaskaさん、前回の質問では失礼をしました。
今回もレスを頂き、感謝します。
そうですよね。やはりargs[0]をmainメソッド以外で使用する事はできない。
これだとlomg型に変換してますよね。
問題はどこから新しいメソッドを作ればいいのか、なんですよね。
そして、それはString型のメソッドなのかどうかって事ですね。
String型で返しても、次でdouble型に再び変換する訳なので、コンパイルは通りますね。
考え方はこれでいいのでしょうか。

お礼日時:2009/02/24 10:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!