例外処理するソースコードについて質問があります。
まず例外処理される前のファイルのソースコードを見てください。
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]なのでどうやってメソッドを作っていいのか分かりません。
ヒントだけでいいので、どうぞ宜しくお願い致します。
No.13ベストアンサー
- 回答日時:
お疲れ様。
ちなみに私ならこう書くわ。
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;
}
}
}
もっとも出題者の意図に合っているかどうかという問題はあるけど。
あ、コンパイルも動作も試していないので
ミスがあったらゴメン。
姉御、見捨てないでいてくれて物凄く嬉しいです。
自分は今回staticメソッドの事を学びました。
後、エラーの表示方法は2回目ですね。
中々エラーを表示させるところまで頭が回らなくて。
でも、何回もやっていれば少しずつ覚えていくと思っています。
後、ExceptionクラスのgetClass()、getName()、getMessage()についてはここで知りました。
また姉御のお力を借りるときもあると思いますが、不出来な弟(逆かも?)と思って、面倒見てやって下さい。
今回は色々と感謝しています。
でも、誰にポイントを上げればいいのかが悩みですね。
どうしましょう……。
No.12
- 回答日時:
い いいけど・・・
好きにして
姉御~、本当の本当の本当にすみません。
自力ではどうしても無理でした。
次のサンプルソースコードを見て下さい。
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日ではありますが、精一杯努力はしたつもりです。
それと、どうしても月日と追いかけっこになってしまうので、できれば早く知って次の課題に進めたいっていう思いが勝ってしまいました。
自分の事を思ってレスを書いて頂いた方へは、もうどういう言葉でも表現できない罪悪感のようなものを感じております。
土下座状態です。
お怒りのコメントもしっかりと受け止めますのでお書き下さい。
姉御も失望したかもしれませんが、どうしてもこういう方法しか無かったのを理解して頂きたいです。
最後に、サンプルを見た事によって(少しソースコードを書き加えたりしてます)新たな知識を得る事ができました。
No.10
- 回答日時:
すみませんが, 「条件をちょっとずつ出す」というのはやめてください. 条件があるというのは当然だしかまわないんだけど, 答える立場で考えて「たくさんの条件を一度に出される」というのと「ちょっとずつ出される」というので, どちらがより「うんざりする」と思いますか?
さておき, 少なくとも「Long.parseLong の呼び出しが try ブロックの中になければならない」ことは理解できてます? だから, 端的にいって
try {
Long.parseLong(args[0]);
}
catch (NumberFormatException e) {
println したりなんなり
}
という形にしなきゃいかんよね, ってのが例えば #7 でいっていることだと思う.
まだじっくり考え中のままですが、再度のレスを頂き、ありがとうございます。
まず、別に小出しにしてるつもりはないのですが、お気に触ったのでしたらお詫びします。
自分としては、最初の質問で全てを語ったつもりなんですが、言葉が足りずに申し訳ありませんでした。
これは、実は講義の課題でしてなるべくならヒントだけで自力でチャレンジしたかったんですが、所詮は無理でした。
今は、皆さんのアドバイスを手がかりに頑張ってみようと思います。
No.9
- 回答日時:
回答番号:No.7の回答に対するコメントです。
return n;
ではNumberFormatExceptionが発生しないので駄目です。
そもそもStringを数値として扱う(Long.parseLong()とかDouble.parseDouble)ところで発生する例外なのでtryの中で
そういったメソッドを使う必要があります。
メソッドの引数はStringのまま(args[0])でいいです。
No.8
- 回答日時:
これじゃダメなのかな?
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("実行終了");
}
質問の意図がよくわからない・・・
メソッド外だしして例外処理しないといけないってこと?
レスを頂き、ありがとうございます。
わざわざソースコードを書いて頂いて感謝です。
ですが、最初のlong lngTmp;が無くなっているのと、
例外処理はmainメソッド以外の別メソッドでという事なので、大変有り難いのですが、違うのです。
変数lngTmpを消さずに、しかも、例外処理は別メソッドで処理しないといけないのが条件なので。
折角考えて頂いたのに申し訳ありません。
No.7
- 回答日時:
> 問題はどこから新しいメソッドを作ればいいのか、なんですよね。
Long.parseLongを別メソッドで実行するのよ。
#3の方のように呼んで上げればいいの。
戻り値はlong。引数はargs[0]でOKよ。
Long.parseLongをtry-cacthで囲って
NumberFormatExceptionをcatchして
エラーをprintln。
その後発生したNumberFormatExceptionをthrowして
mainでさらにcatch。
何もせずに終了ね。
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("実行終了");
}
}
No.6
- 回答日時:
うぅん, 意味が分からん.
「問題はどこから新しいメソッドを作ればいいのか、なんですよね。」
の「どこ」とは何を意味するのか (「同じクラスの別のところで作ればいい」などの回答を期待してる?),
「そして、それはString型のメソッドなのかどうかって事ですね。」
の「String型のメソッド」とは何のことなのか (引数の型なのか返り値の型なのかわからん).
作るべきメソッドの仕様は理解できてますか? 理解できていないなら, じっくりと考えてください. 理解できているなら「引数の型」と「返り値の型」および (返り値の型が void でない場合は) 引数がどのような値のときにどのような値を返せばいいのかを書いてみてください.
厳しいお言葉に、胸に突き刺さるほど痛感しています。
どこからと言うのは同じクラス内でという訳ではなく、どこの段階でという事ですかね、はい。
String型のメソッドとは、
public String literalCheck() {
}
という感じですかね。
でも、それだとlong型に変換している意味がなくなるから、ダメだと。
しかも、String型だとNumberFormatExceptionにはかからない。
なので、折角long型の変数に入れたのだから、その先は…………。
少しじっくりと考えさせてもらいます。
No.5
- 回答日時:
> 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) {
/*ここから
・・・
ここまで*/
}
//ここも使えない
}
再度のレスを頂き、ありがとうございます。
情けない事ながら、ヒントだけでは何も出来ない事をヒシヒシと感じています。
基礎の基礎を教わっている事自体お恥ずかしいったらありゃしないです。
まず、args[0]である以上mainメソッド内でしか使えない。
でも、long型で返しているargs[0]はlong型の変数になっているので、別メソッドで使える…………のですか。
それで、ここでtry catchをする。このメソッドから出る。
後は出力されて実行終了って事ですかね。
No.4
- 回答日時:
> mainメソッド以外でargs[0]って使用できますか
このままでは使えないわね。
argsはこのmainメソッドの
ローカルな変数ですもの。
メソッドの引数で渡していけば
他のメソッドでも使えるようになるわよ。
askaaskaさん、前回の質問では失礼をしました。
今回もレスを頂き、感謝します。
そうですよね。やはりargs[0]をmainメソッド以外で使用する事はできない。
これだとlomg型に変換してますよね。
問題はどこから新しいメソッドを作ればいいのか、なんですよね。
そして、それはString型のメソッドなのかどうかって事ですね。
String型で返しても、次でdouble型に再び変換する訳なので、コンパイルは通りますね。
考え方はこれでいいのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- Java Java 配列<選挙> 4 2023/07/31 15:07
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
canvasに描画したものを全て削...
-
【sendkeysメソッドが動かずに...
-
『独習JAVA』が難しい
-
javascriptからjavaを呼び出したい
-
mainメソッドのthrows節で設定...
-
アクセスのレポートで円を描きたい
-
Excel VBA でExcelを終了したい...
-
マスターページからコンテンツ...
-
エクセルVBAのInputBoxメソ...
-
pythonのプログラムについての...
-
ウィンドウを最前面にできません
-
FEM解析の読み方は?
-
Labelコントロールに数字を代入...
-
VBAでコピーコマンドを実行する...
-
DataGridViewでセルクリックイ...
-
[VBA]GetSaveAsFilenameメソッ...
-
勝手にアプレットが停止します
-
例外処理をするソースコードに...
-
個々のメソッドの呼び出し時間...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
final修飾子を使っているのに、...
-
JSPで<SELECT>の中にDBから持っ...
-
Labelコントロールに数字を代入...
-
エクセルVBAにおけるON TIMEメ...
-
javascriptからjavaを呼び出したい
-
DataGridViewでセルクリックイ...
-
VBPをダブルクリックするとたま...
-
onClickで関数呼出し後に、結果...
-
コマンドプロンプト実行後に画...
-
配列のメソッド
-
日本の教育って時間が無い中で...
-
Refreshメソッドの使い方
-
mainメソッドのthrows節で設定...
-
【sendkeysメソッドが動かずに...
-
C# 演算 最大値 最小値 表現の仕方
-
VBA コピーが出来ません…!
-
Application.Wait の参照設定
-
ウィンドウを最前面にできません
-
for文(拡張)内の変数(ローカ...
おすすめ情報