画像読み込みのエラー処理

このQ&Aのポイント
  • 画像読み込み時のエラー処理について解説します。
  • 不正なファイル名や存在しない画像へのアクセス時にエラーが発生するケースがあります。
  • 適切なエラー処理を行うためには、getImage()メソッドの戻り値をチェックし、エラーが発生した場合に対応する処理を行います。
回答を見る
  • ベストアンサー

画像読み込みのエラー処理

画像を表示するアプレットのソースです。 ファイル名はstrで設定します。 Image img; String str; str = "xx.jpg"; img = getImage(getDocumentBase(), str); if (img.equals(null)) { mydbg("001"); } else { mydbg("002"); } //strがでたらめで、そのパスの画像が存在しなくても //getImage()は成功するんですか?実験してみるとそのようでした。 //その画像が存在しない場合、この下のソースでmydbg("003");が //実行されるはずなのに実行されません。 //画像が存在しない場合のエラー処理のよいソースを教えてください。 MediaTracker mt = new MediaTracker(this); mt.addImage(img, 0); try { mt.waitForID(0); repaint(); } catch (Exception e) { mydbg("003"); }

  • Java
  • 回答数1
  • ありがとう数5

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

  • ベストアンサー
  • takaP-
  • ベストアンサー率79% (83/105)
回答No.1

>strがでたらめで、そのパスの画像が存在しなくても >getImage()は成功するんですか?実験してみるとそ >のようでした。 成功する・しないに関わらずアプレット(getDocumentBase()からの推測) のgetImage()は例外を投げません。 APIリファレンスにはこう書かれています。。。 //このメソッドは、イメージがあるかどうかにかかわらず、 //すぐに復帰します。 それと、メディアトラッカーのwaitForID()が投げる 例外はInterruptedExceptionであり、イメージのロード が上手くいったかどうかは関係ありません。 もし、ロードエラーをチェックしたいのであれば。。。 MediaTracker mt=new MediaTracker(this); mt.addImage(img,0); try{   mt.waitForID(0); } catch(InterruptedException e){   e.printStackTrace();   System.exit(0); } if(mt.isErrorID(0)){   mydbg("003"); } else {   repaint(); } とメディアトラッカーのisErrorID()を使ったり すれば良いのではないでしょうか。 イメージのロードに失敗しているとtrueを返します。

rasuck
質問者

お礼

ありがとうございます。その方法で解決できました。

関連するQ&A

  • アプレットに画像が表示されません

     今晩は、java初心者です、宜しくお願いします。  下のようなプログラムを書きましたが、画像がアプレットに表示されません。  画像はeclipseで同じプロジェクト(フォルダ)内に置いています。  文法上のエラーは出ておりません。  原因がわかりません宜しくお願いします。 ============================ public class Test extends Applet { MediaTracker tracker ; Image img ; public void init() {   tracker = new MediaTracker( this ) ; img = getImage( getDocumentBase() , "a.jpg" ) ; tracker.addImage( img , 0 ) ; } public void start() {              try { tracker.waitForAll(); } catch (InterruptedException e) { } } public void paint( )      { Graphics g2 = getGraphics(); g2.drawImage( img , 0 , 0 , 50 , 50 , this ) ; } }

    • ベストアンサー
    • Java
  • 画像がうまく表示されません

    下のプログラムを実行すると、 最初の読みこみはうまくいくのですが、(一部出なくなる画像がありますが…) Internet Explorerの更新ボタンを押した時、 (1)の部分で止まってしまうようで、画像が表示されなくなります。 (ローカルドライブで実行した場合はうまく表示できるのですが、ネットワークで実行した場合にこのようになってしまいます) import java.applet.Applet; import java.awt.*; public class met extends Applet{ Image img[] = new Image[6]; MediaTracker mt; public void init(){ mt = new MediaTracker(this); for(int i = 0;i < 6;i++){ img[i] = getImage(getCodeBase(),i+".gif"); mt.addImage(img[i],0); } try{ mt.waitForID(0); }catch(InterruptedException e){} } public void paint(Graphics g){ // (1) if(!mt.checkID(0)){ g.clearRect(0,0,500,500); g.drawString("読み込み中",200,240); return; } g.setColor(Color.white); g.fillRect(0,0,500,500); for(int i = 0;i < 6;i++){ g.drawImage(img[i],i*50,0,this); } } }

    • ベストアンサー
    • Java
  • なぜエラーになるのかがわかりません?(長文です。)

    下記のクラス(Panel_Middle)内でパネル(pnlFd)を作成してます。しかし、メインフォームからこのクラスの"CreateMainPanel"関数を呼ぶと "pnlFd.setBounds(new Rectangle(5, 5, 110, 38));" の後に"java.lang.NullPointerException "とエラーが出ます。色々考えたのですが、理由がわかりません。 public class Panel_Middle extends Panel{ Panel_Main pnlFd = new Panel_Main("A.gif","B.gif"); Image im; //CONSTRUCT public Panel_Middle(String img) { im = Toolkit.getDefaultToolkit().getImage(img); //MediaTracker画像入力監視 MediaTracker mt = new MediaTracker(this); mt.addImage(im, 0); try { mt.waitForID(0); } catch (InterruptedException e) { } } //Print public void paint(Graphics g) { if (g.drawImage(im, 0, 0, this) != true) { System.out.println("ng"); } } public void CreateMainPanel(){   this.add(pnlFd, null); pnlFd.setBounds(new Rectangle(5, 5, 110, 38)); pnlFd.setImageInit(); } }

    • ベストアンサー
    • Java
  • Java アプレットで画像をコピーして配置

    Javaアプレットでなのですが、画面上に自分で持っている画像をコピーして配置したいです。 http://oshiete1.goo.ne.jp/qa2452081.html​ のソースを参考にさせて頂いたのですが、 コピー元のオブジェクトを自分の持っている画像(アイコン)にしたいです。 Path指定をするとできるのかなと思っていて、以下の2行を加えてみたのですができません。 img[0] = getImage(getDocumentBase(), "../../img/01.jpg"); g.drawImage( img[0],20,20, this ); ご教授よろしくお願いします。

    • ベストアンサー
    • Java
  • 画像がうまく表示されない。

    アプレットを作っています。 左クリックすると、次の画像へ進む、といった処理を実装したのですが、1回は次の画像へ進むのですが、2回目以降が進みません(しかも、「1.jpg」から「2.jpg」へ進めたいのですが、何故か「1.jpg」から「10.jpg」にいってしまいます。)以下が現在のコードです。 余分な部分は削除しました。よろしくお願いします。 public class Main extends Applet implements MouseListener, Runnable{ Image nowImage, nextImage; static int i; MediaTracker mt = new MediaTracker(this); MediaTracker mt2 = new MediaTracker(this); int yousosu,w,h; Thread thread; static float alpha; static boolean runflag = true; static boolean flag = true; static int j = 1; Image buf; Graphics ct; int sleeptime = 300; Image img; Vector imgs = new Vector(); public void init(){ i = 0; thread = new Thread(this); yousosu = Integer.parseInt(getParameter("NumImage"));//配列(画像)の要素数 for(int t = 0; t < yousosu; t++){ img = getImage(getDocumentBase(),"imagesyukusyo/" + t+1 + ".JPG"); imgs.addElement(img); img = null; } int kazu = imgs.size(); addMouseListener(this); w = getSize().width; h = getSize().height; buf = createImage(w,h);//バッファ取得 //*******最初の画像のロード******* nowImage = getImage(getDocumentBase(), "imagesyukusyo/1.JPG");//←Vectorの[0]要素? } public void update(Graphics g){ paint(g); } public void paint(Graphics g){//drawImageファイルを表示するだけ ct = buf.getGraphics(); Graphics2D ct2 = (Graphics2D) ct; Graphics2D g2 = (Graphics2D) g;//Grahics2Dクラス AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); mt.addImage(nowImage,0); mt2.addImage(nextImage, 0); try { mt.waitForID(0); mt2.waitForID(0); } catch (InterruptedException e) { e.printStackTrace(); } ct2.drawImage(nowImage,0,0,w,h,this); ct2.setComposite(composite); //次からはcompositeを設定した後の描画になる。 ct2.drawImage(nextImage,0,0,w,h,this); g2.drawImage(buf,0,0,w,h,this); } //*********マウスイベント************ public void mouseClicked(MouseEvent e) { int btn = e.getButton(); //*******左クリック********** if(btn == MouseEvent.BUTTON1){//左クリック=進め System.out.println("左クリック"); System.out.println("iは"+i); System.out.println("elementAtの数は"+imgs.size()); if(i >= yousosu){//要素数より多くなったら… i = 0; } nowImage = (Image)imgs.elementAt(i); if(i == yousosu-1){ nextImage = (Image) imgs.elementAt(0); }else{ //通常こっち nextImage = (Image) imgs.elementAt(i+1); } thread = new Thread(this); thread.start(); thread = null; i++; } } public void run(){ alpha = 0.2f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.3f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.4f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.5f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.6f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.7f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.8f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.9f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 1f; repaint(); } }

    • ベストアンサー
    • Java
  • Javaのゲーム、ボタンの種類で攻撃画像を変える

    Javaでゲームを書いていてどうしてもできないところがあります。 スペースボタンを押したときと、Bボタンを押したときの攻撃のグラフィックを変えたいのですが、どちらのボタンを押してもスペースのときの画像になってしまいます。 ソースが長いため一部しか載せていませんが必要であれば分割して載せることも可能です。 どなたか教えていただけますでしょうか。 public void keyPressed ( KeyEvent e ){//(KeyEvent e ){ //キーが押された時に実行//void外したら if(e.getID()==KeyEvent.KEY_PRESSED){ switch (e.getKeyCode()){ case KeyEvent.VK_SPACE : smokeflag = true; iceflag = false; sh_x=0; sh_y=0; //return smokeflag; // magictype = 0; break; case KeyEvent.VK_B ://氷魔法 iceflag = true; smokeflag = false; sh_x=0; sh_y=0; // magictype = 1; //return iceflag; break; } } } public void dataload() { MediaTracker mt = new MediaTracker(this); TitleImage = getImage(getCodeBase(), "image/title.jpg"); mt.addImage(TitleImage, 0); for(int i=0;i<2;i++){ if( smokeflag == true ){ magictype = 0; } else if( iceflag == true ){ magictype = 1; } MagicImage[i] = getImage(getCodeBase(), "car/image/magic/" + magictype + "_" + i + ".gif");//car//magictype mt.addImage(MagicImage[i], 0); } try{ mt.waitForID(0); } catch(InterruptedException e) { showStatus(""+e); } }

  • 【Java】画像表示が出来ない!

    Java初心者です。 Eclipseを使って、Javaアプレットでjpeg画像を表示させようとしたのですが、上手くいきません。表示したい画像をインポートして、このようなコードを書きました。 import java.applet.Applet; import java.awt.*; /* <applet code="クラス名.class" width="497" height="600"> <param name="img" value="img/test.jpg"> </applet>*/ public class クラス名 extends Applet { Image img; public void init() { img = getImage(getDocumentBase() , getParameter("/test.jpg")); } public void paint(Graphics g) { g.drawImage(img , 0 , 0 , this); } } Javaアプレットで実行しても、アプレットは真っ白なままです。GIF画像でも試してみましたが、同じく失敗でした。他のJavaアプレットのプログラム(図形を表示したり)は成功したので、私のパソコンのJavaは問題ないと思います。回答よろしくお願いします。

    • ベストアンサー
    • Java
  • jpeg画像でアニメーションを作る

    jpeg画像10枚くらいをつかい、アニメーションを作りたく以下のようなプログラム(全部載せられませんでした)を組んでみました。しかし、画像読み込みにすごく時間がかかり、アニメーションという感じがしないほど、さっと画像が表示されて終わってしまいます。もっと、一枚一枚をゆっくり表示させたく画像読み込みの時間も短縮したいのですが、何か良い方法はありますでしょうか(ちなみに画像のキャンバスサイズは512×384です) import java.applet.*; import java.awt.*; import java.net.*; public class im2a extends Applet implements Runnable{ Image im[] = new Image[10]; URL url; String fn[]={"anime10.jpg","anime11.jpg","anime4.jpg","anime5.jpg",  "anime1.jpg","anime2.jpg","anime1.jpg","anime2.jpg",  "anime8.jpg","anime7.jpg"}; Thread th; MediaTracker mt = new MediaTracker(this); String ms =""; String s =""; int i=0; int j=0; int dt=100; int phase=2 ; boolean ok=false;   public void start(){ th =new Thread(this); th.start(); }    public void readImage(){ ms ="画像入力準備中"; repaint(); for(i=0;i<9;++i){ im[i]=getImage(getDocumentBase(),fn[i]); mt.addImage(im[i],i); ok=false; while(!ok){ try{ Thread.sleep(2000); } catch(InterruptedException ee) { } ok=mt.checkID(i,true); } ms="画像"+i+"読み込み終了"; repaint(); } }

  • 作ったクラスにイベントを追加するには?

    パネルを継承したクラスを作りました(パネルA)。 そのパネルAをメインフレームに作成しました。 作ったパネルAの上にサブパネルBを作りました。 サブパネルのイベントを書きたいのですがコードは作ったクラス内に書けないのでしょうか? 例)下記が作ったパネル継承クラスです。この中でpnlSubを作っているのです。で、このpnlSubのクリックイベントを書きたいのですが、どのようにイベントを用意すればよいのでしょう? package ### import java.awt.*; public class PanelA extends Panel{ Image im; Panel pnlSub = new Panel(); //CONSTRUCT public PanelA(String img) { im = Toolkit.getDefaultToolkit().getImage(img); //MediaTracker画像入力監視 MediaTracker mt = new MediaTracker(this); mt.addImage(im, 0); try { mt.waitForID(0); } catch (InterruptedException e) { } //パネル(pnlVolume)設定 this.add(pnlVolume, null); pnlSub.setBackground(Color.red); pnlSub.setBounds(new Rectangle(5, 8, 108, 5)); } //Print public void paint(Graphics g) { if (g.drawImage(im, 0, 0, this) != true) { System.out.println("ng"); } } }

    • ベストアンサー
    • Java
  • ★Appletで画像読み込み&画像表示★

    import java.awt.*; import java.applet.*; public class S1 extends Applet { Image img; public void init() { img=getImage(getCodeBase(),"sample.jpeg"); } public void paint(Graphics g){ g.drawImage(img,50,50,this); } } 以上プログラムでアプレット上に拡張子がjpeg形式のsampleという100*100の画像を表示しようとしています。 クラス名はS1で問題なくエラーもありません。 java関連のサイトでも同じようにして画像が表示できるとされていたのですが、私のパソコンではアプレット上には何も表示されないまま、アプレットのみが起動するという状態になりました。 Eclipse SDKというものを使用していますが、それが原因なのかどうかもわからず困っています。 お手数をお掛けしますが、回答の程よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう