- PR -

エラーメッセージのキャッチされてませんについて

投稿者投稿内容
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-10-03 16:42
引用:

そうなるようにコーディングしているからですね。



格言
プログラムは思ったようには決して動かない。作ったように動くものである。

#引用元どこか忘れた。

で、本題。
コード:

while(m_ImagePos < STOP.length) {
    m_ImagePos++;
    hairetu(STOP);
}



こんなコード書いてるんじゃないの?

引用:

キャッチされていないというのは、例外処理の記述がないということだったのですね。



分かっているかもしれませんが、特別な理由がない限り、基本的に、非キャッチ例外(ArrayIndexOutOfBoundsExceptionなど)はキャッチすべきではないです。
これは、非キャッチ例外がプログラムのコーディングミスにより発生しているからです。
この例外を受け取り、何もなかったかのように素通りしてしまうと、このバグに起因した問題が遅かれ早かれ出現することとなります。この問題は出現位置と実際の問題の位置が異なっているため、デバッグを困難なものにしてしまいます。

ちなみに特別な場合のひとつとして、文字列の数字チェックが挙げられます。
Integer.parseInt(str)は数字に変換できないと、NumberFormatExceptionを送出するので、これをキャッチすることで、数字かどうかを調べることが可能です。
# 整数であれば、一文字一文字、Charactor.isDigit(c)で調べた方が速いかもしれない。

逆に絶対やってはいけないキャッチ例として
コード:
try {
    int i = 0;
    while(true) {
       array[i++];
    }
}
catch (ArrayIndexOutOfBoundsException e) {
}


です。理由は自身で考えてみてください。

}
会議室デビュー日: 2003/10/03
投稿数: 11
投稿日時: 2003-10-03 22:09
みなさん、色々書き込みありがとうございます。

ゆうさんへ
下のソースコードは少し違いますが、同じエラーが起きます。

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

public class Test8 extends Applet implements Runnable {

//イメージ数
public static final int LUCIA_NUM = 4;

//イメージ番号定数
public static final int STOP[] = {0,0,1,1,2,2,3,3,2,2,1,1};

//背景の大きさ(幅、高さ)
public static final int W = 384;
public static final int H = 243;

//kageの初期位置
private static int x = 200;
private static int y = 150;

MediaTracker m_Med;

private Image imgbg;
private Image imgkage;
private Image m_ImgLucia;
private Image imgLuciaR[] = new Image[LUCIA_NUM];

//現在位置
private int m_ImagePos = 0;
private int m_Num = 0;

//オフイメージ
private Image imgOff;
private Graphics graOff;

Thread thread = null;

private int m_X = 196; //Luciaを表示するx座標
private int m_Y = 90; //Luciaを表示するy座標

//初期化
//**********************************************************************

//初期化
//------------------------------------------------------------------
public void init() {

m_Med = new MediaTracker(this);

//イメージ・ファイルの読み込み
imgbg = getImage(getCodeBase(),"Bg-g1.gif");
imgkage = getImage(getCodeBase(),"kage-1.gif");

m_Med.addImage(imgbg,0);
m_Med.addImage(imgkage,0);

for(int i=0; i<LUCIA_NUM; i++) {
imgLuciaR[i] = getImage("Lucia-R" + i + ".gif");
}

m_ImgLucia = imgLuciaR[0];

//オフスクリーンの設定
imgOff = createImage(W,H);
graOff = imgOff.getGraphics();
}

//メソッド
//**********************************************************************

public void paint(Graphics g) {
update(g);
}
public void update(Graphics g) {

graOff.drawImage(imgbg,0,0,this);
graOff.drawImage(imgkage,x,y,this);
graOff.drawImage(m_ImgLucia,m_X,m_Y,this);

g.drawImage(imgOff,0,0,this);
}

public void start() {

if(thread == null) {

//スレッドを実行させる
thread = new Thread(this);
thread.start();
}
}

public void stop() {

//スレッドを止める
thread = null;
}

public void run() {

//実行中のスレッドをチェック
Thread thisThread = Thread.currentThread();

while(thread == thisThread) {

formerStatus();

try{
thisThread.sleep(30);
}catch(InterruptedException e){
}
}
}

public Image getImage(String fileName) {
Image image;
m_Med.addImage(image = getImage(getCodeBase(),fileName),0);
return image;
}

//前の動作を判別する
public synchronized void formerStatus() {
processSTOP();
getImageNum();
repaint();
}

//判別された動作から新しい動作を結びつける(フィルムも管理)
public void processSTOP() {
checkPos(STOP);
}

//最後なら最初に戻して、それ以外なら1つ進める
public void checkPos(int imageNum[]) {
if(m_ImagePos >= imageNum.length) m_ImagePos = 0;
else m_ImagePos++;
}

public void getImageNum() {
getHairetu(STOP);
m_ImgLucia = imgLuciaR[m_Num];
}

public void getHairetu(int imageNum[]) {
int num = 0;
num = imageNum[m_ImagePos];
m_Num = num;
}

}
raccoon
ベテラン
会議室デビュー日: 2002/12/18
投稿数: 58
投稿日時: 2003-10-03 23:02
かずくんさんすごいですね。ほぼ予想的中といっていいでしょう。

蔵さんへ
コードはだいぶ違いますが,ちゃんと解析すれば本質的には
かずくんさんの予想したコードと同じになってるのがわかると思います。

ちゃんと要素数超えないように判定しようとしたようですが,惜しいですね。
# ちょっとした見落としや勘違いですけどね。でもそのワンミスが命取り。
# 私もよくしょぼいミスでバグったりするので,人のことは言えない・・・。
会議室デビュー日: 2003/10/03
投稿数: 11
投稿日時: 2003-10-03 23:41
raccoonさん、かずくんさんへ
checkPos()のところ、m_ImagePos = 11 のとき、m_ImagePos++; で m_ImagePos = 12 に
なりますね、、、、

ところで、このようにあらかじめ範囲外を指定する可能性があるときには、m_ImagePos = 11
になっていなくても、エラーになるのでしょうか

会議室デビュー日: 2003/10/03
投稿数: 11
投稿日時: 2003-10-04 00:12
おかげさまで、動きました!
はじめて質問したのですが、どのように書けばいいのか大変に参考になりました。
みなさん、本当にありがとうございました。

問題が解決したら、削除するべきでしょうか?
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2003-10-06 09:47
引用:

蔵さんの書き込み (2003-10-04 00:12) より:
問題が解決したら、削除するべきでしょうか?


 それは駄目です。
同じ症状で悩んでいる方の為に残しておきましょう。
会議室デビュー日: 2003/10/03
投稿数: 11
投稿日時: 2003-10-06 15:07
はい、わかりました。

みなさん、お世話になりました。

スキルアップ/キャリアアップ(JOB@IT)