- - PR -
エラーメッセージのキャッチされてませんについて
| 投稿者 | 投稿内容 | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-10-03 16:42
格言 プログラムは思ったようには決して動かない。作ったように動くものである。 #引用元どこか忘れた。 で、本題。
こんなコード書いてるんじゃないの?
分かっているかもしれませんが、特別な理由がない限り、基本的に、非キャッチ例外(ArrayIndexOutOfBoundsExceptionなど)はキャッチすべきではないです。 これは、非キャッチ例外がプログラムのコーディングミスにより発生しているからです。 この例外を受け取り、何もなかったかのように素通りしてしまうと、このバグに起因した問題が遅かれ早かれ出現することとなります。この問題は出現位置と実際の問題の位置が異なっているため、デバッグを困難なものにしてしまいます。 ちなみに特別な場合のひとつとして、文字列の数字チェックが挙げられます。 Integer.parseInt(str)は数字に変換できないと、NumberFormatExceptionを送出するので、これをキャッチすることで、数字かどうかを調べることが可能です。 # 整数であれば、一文字一文字、Charactor.isDigit(c)で調べた方が速いかもしれない。 逆に絶対やってはいけないキャッチ例として
です。理由は自身で考えてみてください。 } | ||||||||||||||||
|
投稿日時: 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; } } | ||||||||||||||||
|
投稿日時: 2003-10-03 23:02
かずくんさんすごいですね。ほぼ予想的中といっていいでしょう。
蔵さんへ コードはだいぶ違いますが,ちゃんと解析すれば本質的には かずくんさんの予想したコードと同じになってるのがわかると思います。 ちゃんと要素数超えないように判定しようとしたようですが,惜しいですね。 # ちょっとした見落としや勘違いですけどね。でもそのワンミスが命取り。 # 私もよくしょぼいミスでバグったりするので,人のことは言えない・・・。 | ||||||||||||||||
|
投稿日時: 2003-10-03 23:41
raccoonさん、かずくんさんへ
checkPos()のところ、m_ImagePos = 11 のとき、m_ImagePos++; で m_ImagePos = 12 に なりますね、、、、 ところで、このようにあらかじめ範囲外を指定する可能性があるときには、m_ImagePos = 11 になっていなくても、エラーになるのでしょうか | ||||||||||||||||
|
投稿日時: 2003-10-04 00:12
おかげさまで、動きました!
はじめて質問したのですが、どのように書けばいいのか大変に参考になりました。 みなさん、本当にありがとうございました。 問題が解決したら、削除するべきでしょうか? | ||||||||||||||||
|
投稿日時: 2003-10-06 09:47
それは駄目です。 同じ症状で悩んでいる方の為に残しておきましょう。 | ||||||||||||||||
|
投稿日時: 2003-10-06 15:07
はい、わかりました。
みなさん、お世話になりました。 | ||||||||||||||||
