こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

例外処理throws

例外処理ではthrowsかtry~catchを使いますよね。

で、ほとんどの場合はtry~catchを使うようで、ほとんどthrowsを使った例しかなく(まあ、throwsでの例外処理はプログラムが停止してしまうので推奨できないでしょうが)よくわから中区なってしまったので教えてほしいです

class Input{
int set(String Toi)throws IOException{
System.out.println(Toi);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int a = Integer.parseInt(str);
return a;
}
}

のようにInputクラスを用いて外部からこれを使うために

Input input = new Input();
x1 = input.set("x座標を入力");

とすると、「キャッチかスロー宣言をしろ」と怒られてしまいました。(コンパイルエラー)

この場合どうすればいいでしょうか?

投稿日時 - 2003-04-15 20:15:42

QNo.523692

困ってます

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

修正する必要のあるのは、Inputクラスのコードではありません。
それを呼び出しているコード、つまり
Input input = new Input();
x1 = input.set("x座標を入力");
の書かれているコードです。
対処方法はご存知のはずです。
> 例外処理ではthrowsかtry~catchを使いますよね。

投稿日時 - 2003-04-15 20:37:57

お礼

すみません。

try~catchを使わなければいけないということですか?

Input input = new Input()throws IOException;

とためしにしてみたのですが・・・

だめでした。頓珍漢なことを言ってますでしょうか(;_;)

投稿日時 - 2003-04-15 20:58:20

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

ざっと見たのですがthrowsの使い方を理解されていないようですね。
throwsとtry-catchの使い分けの方法を思い出してみてください。
try-catchはそのロジック内(クラス内のプログラム)で例外が発生した場合の処理方法を書きます。
これは例外は通知先を指定するようなコードを明確に書かない限りどこにも通知はされず、
その例外処理の中で処理されて終了します。
ですが、throwsはそのクラスを呼びだした元へ例外が発生したことを報告するためのものです。
つまり呼び出し元へその報告を受け取るための用意が必要となります。
その用意としてInputクラスを呼び出す場所でのtry-catchや
そのメソッドなどにthrows(さらに上位の呼び出し元へリレーで通知)が必要となります。
それを理解するとどうすればよいかがわかると思います。

参考URL:http://msugai.fc2web.com/java/

投稿日時 - 2003-04-16 11:24:10

ANo.4

> つまるところ、try~catchでやるしかないですよね・・・?
・・・しかないかどうかは、質問に記述された内容からだけでは分かりません。
要するに以下のいずれかが必要だということです。

class Caller {
 void methodB() throws IOException {
  Input input = new Input();
 }
}

class Caller {
 void methodB() {
  try {
   Input input = new Input();
  }
  catch (IOException e) {
   ・・・
  }
 }
}

いずれにしろ、一番外側ではtry~catchを使うしかありませんが。

投稿日時 - 2003-04-16 09:54:39

ANo.3

最初のエラーは外部から使う方のエラーじゃなかったですか?
Inputクラスのsetメソッドがエラーが発生した場合 IOExceptionが発生したら呼び出し側に戻るようになっているから、
呼び出す側に try - catch をしなければいけないと思います。

try{
 Input input = new Input();
 x1 = input.set("x座標を入力");

} catch(IOException e) {
}

みたいに。

投稿日時 - 2003-04-16 08:33:16

ANo.2

> Input input = new Input()throws IOException;
> とためしにしてみたのですが・・・
あ、これはダメですね。
throws はメソッドの引数並びに続けて書きます。
azichanさん自身
> int set(String Toi)throws IOException
と正しく記述しているのにどうしたのかな。
このように記述しておけばset()内でIOExceptionが発生したら
外に投げてくれるわけです。
ただし、抽象メソッドの実装などで、勝手にthrowできない場合もあります。
そのような場合はtry~catchを使うしかありません。
なお、ステートメントの一種でthrowというのがあります。
これはそのExceptionを投げて、以降の処理を中断します。
Input input = new Input();
throw IOException;
と記述されていたら、Inputのインスタンスを作った後、
何もしないでExceptionを投げます。

投稿日時 - 2003-04-15 21:34:20

補足

>throws はメソッドの引数並びに続けて書きます

うーん。引数ならび・・・・?
ごめんなさい。よくわからないです。
メソッド定義の段階の
int set(String Toi)throws IOException{
のことでしょうか・・・?

つまるところ、try~catchでやるしかないですよね・・・?

投稿日時 - 2003-04-15 22:16:17