アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは.
java初心者です.

try~catchでエラー処理を行うことについて質問です.
try~catchでは,エラーを起こした変数を特定することは出来ないのでしょうか?

例えばアプレットで画像を表示させる下記のコードについて,
img1とimg2の変数を使いますが,img1に読ませるファイルは存在するが
img2に読ませるファイルが存在しない場合に,「img2に読み込ませるファイルが存在しません」と表示したいのです.
このようにどの変数がエラーを起こしたかを特定することはできますか?


==============

import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class Sample extends Applet{

Image img1, img2;
int x=0, y=0;

public void init() {
System.out.println("init");
try{
img1 = getImage(getClass().getResource("img/sample1.jpg"));
img2 = getImage(getClass().getResource("img/sample2.png"));
}
catch(Exception e){
System.out.println("エラー" + e + "が返されました.");
}
}



public void paint(Graphics g){
g.drawImage(img1, 0, 0, this);
g.drawImage(img2, 50, 50, this);
}
}

==============

try{
 img1に関する処理
}
catch(Exception e){
img1に関するエラー処理
}

try{
 img2に関する処理
}
catch(Exception e){
img2に関するエラー処理
}

とやればできそうですが,あまりに冗長なので他に方法があると思うのですが…
自分もまだ勉強しはじめたばかりなので,初歩的な質問で恐縮です.
教本やネットで調べても分からなかったので質問させていただきました.
よろしくお願いいたします.

A 回答 (3件)

こんにちは。



このやり方が合っているかはわかりませんが、以下のようにするとどの画像でエラーが起きたかわかります。
無駄なクラスだ!ってなるのであれば
String error = "";
try {
error = "img1";
img1 = getImage(getClass().getResource("img/sample1.jpg"));
error = "img2";
img2 = getImage(getClass().getResource("img/sample2.png"));
} catch ( Exception e ) {
System.out.println ( error + "の読込エラー" );
}

のようにするとimg1で例外が発生すればerrorは"img1"、img2のgetImageで例外が発生すればerrorは"img2"になっているのでこれでも判別出来ますね。



==== ImageInfo.java(画像名とパスを保持するクラス)
public class ImageInfo {


private String name;
private String src;


public ImageInfo ( String name, String src ) {
this.name = name;
this.src = src;
}


public String getName() {
return this.name;
}

public String getSrc() {
return this.src;
}

}

==== Test.java(メイン)
public class Test extends Applet {

public Test() {

try {
ImageInfo imageInfo1 = new ImageInfo("img1","path" );
ImageInfo imageInfo2 = new ImageInfo("img2","path" );
Image img1 = this.loadImage(imageInfo1);
Image img2 = this.loadImage(imageInfo2);
} catch ( Exception e ) {
System.out.println(e.getMessage());
}
}


private Image loadImage ( ImageInfo imageInfo ) throws Exception {
try {
return getImage(getClass().getResource(imageInfo.getSrc()));
} catch ( Exception e ) {
throw new Exception ( imageInfo.getName() + "の読込みに失敗しました。" );
}
}
}
    • good
    • 0
この回答へのお礼

こんにちは.
回答ありがとうございます.
ソースコード例も載せてくださりとても分かりやすいです!
Stringにあらかじめ変数名を入れておくのは楽でいいですね!
参考にさせていただきます.

お礼日時:2013/03/10 18:22

もし、ファイルが無いことが想定されるのなら、Exception を発生させるのではなく、


処理の前にファイルが存在するかチェックをすべきです。

参考URL:http://docs.oracle.com/javase/jp/6/api/java/io/F …
    • good
    • 0
この回答へのお礼

こんにちは.
回答ありがとうございます.
参考URLもありがとうございます.
ファイルが存在するかどうかをチェックする関数があるのですね.はじめて知りました.
ご指摘の通り,処理の前にファイルの存在をチェックする方が,Exceptionを発生させるより良い方法ですね.
URL先には他にも今後よく使いそうな関数ばかりでとても勉強になりました.
どうもありがとうございます.

お礼日時:2013/03/10 18:25

まずはException を


System.out.println("エラー" + e + "が返されました");
にしてしまうとtoString()しているだけなので、
System.out.println("エラー" + e.getMessage() + "が返されました");
などにしてちゃんとメッセージを確認してみてはいかがでしょうか。

大体のファイル系のエラーはファイル名が出てきた気がします。

また、「読ませるファイルが存在しない場合」は
FileNotFoundExceptionが発生すると思うので、
catchの部分は分けたほうがいいと思います。
try{
//・・・省略
}catch(FileNotFoundException e){
//ファイルがない場合の処理
}catch(Exception e){
//その他の異常処理
}

URLは参考までに

参考URL:http://www7a.biglobe.ne.jp/~java-master/samples/ …
    • good
    • 0
この回答へのお礼

こんにちは.
回答ありがとうございます.
e.getMessage()は使ったことが無く,初めて知りました.
また,参考URLやコード例を示して下さりありがとうございます.とても勉強になります.
お二人のおっしゃる通り,exists()の関数を用いようと思います.
ありがとうございます.

お礼日時:2013/03/10 18:27

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