12/1 簡単なグラフィクス(2)


質問と回答

Q.
例外処理のページのSumInputの例では,何 度も入力をして,while(true)で囲まれていたので,例外をcatch した出たと きは continueで繰り返し出来たが,1つだけ入力をする時に例外をcatch して 繰り返したい時はどうすればいいか?
A.
例外を入力する限りは,繰り返し実行するので,再実行したい先頭から, 入力の終りまでブロックにして while(true)文にする.例外が発生しなかった ときにはbreak すれば良い.
Q.
catchで渡ってくる例外処理の引数はどのように利用できるか?
A.
例外処理に対応するクラスの定義を見ると分かる.たとえば,NumberFormatExceptionは,先祖クラスの Throwableのメソッドが使える.
 o fillInStackTrace()
実行スタックトレースを塗りつぶす。
 o getLocalizedMessage()
この Throwable の断片的な記述を作成する。
 o getMessage()
このThrowableオブジェクトの詳細メッセージを返す。
 o printStackTrace()
この Throwable とそのバックトレースを標準エラーストリームに出力する。
 o printStackTrace(PrintStream)
この Throwable とそのバックトレースを指定された印刷ストリームに出力する。
 o printStackTrace(PrintWriter)
Throwable とそのバックとレースを指定された印刷書き込みルーチンに出力する。
 o toString()
このThrowableオブジェクトの短い記述を返す。
eを使った例をあげる.
プログラム

class test {
  public static void main(String[] args){
    try{
      Integer.parseInt("abc");
    }
    catch(NumberFormatException e){
      System.out.println("e="+e);
      e.printStackTrace();
    }
  }
}

実行例

e=java.lang.NumberFormatException: abc
java.lang.NumberFormatException: abc
	at java.lang.Throwable.(Compiled Code)
	at java.lang.Exception.(Compiled Code)
	at java.lang.RuntimeException.(Compiled Code)
	at java.lang.IllegalArgumentException.(Compiled Code)
	at java.lang.NumberFormatException.(Compiled Code)
	at java.lang.Integer.parseInt(Compiled Code)
	at java.lang.Integer.parseInt(Compiled Code)
	at test.main(Compiled Code)


前回の課題について

課題1

前回までにこの授業のページに現れたサンプルプログラムで,「例外が起き る可能性があるのに例外処理をきちんとやっていなかった」ものを適当に1つ 選び,「適切と思われる例外処理をする」ように書き直し,例外処理をしてい ることがわかるような実行例を書きなさい.

解説
前回までのすべての範囲からサンプルプログラムを選ぶため,もう少し分か れるかと思ったが,以下のものに集中した.

提出された課題の中に,コンパイラを通らないような解答があった.

課題2

yukidaruma

上の絵と似た絵を描くプログラム Yukidaruma を完成させて下さい(月と雪ダ ルマが描かれればどんなものでも合格とします).

  // AWTを使うので java.awt.*を import する
import java.awt.*;

  // 独立したウィンドウを開くので,
class Yukidaruma extends Frame{
  public Yukidaruma(String title){
    super(title);
  }
  public static void main(String[] args){
    Yukidaruma frame=new Yukidaruma("Yukidaruma");
    frame.setSize(400,400);
    frame.setVisible(true);    
  }
  public void paint(Graphics g){
 // この部分を埋めてください. 
  }
}
解答例(埋める部分)
import java.awt.*;

class Yukidaruma extends Frame{
  public Yukidaruma(String title){
    super(title);
  }
  public static void main(String[] args){
    Yukidaruma frame=new Yukidaruma("Yukidaruma");
    frame.setSize(400,400);
    frame.setVisible(true);
  }
  public void paint(Graphics g){
    g.setColor(Color.black);
    g.fillRect(0,0,400,200);
    g.setColor(new Color(230,230,230));
    g.fillRect(0,200,400,200);
    g.setColor(new Color(200,255,255));
    g.fillArc(50,50,40,40,225,180);
    g.setColor(Color.white);
    g.fillOval(200,150,80,80);    
    g.fillOval(190,220,100,100);    
    g.setColor(Color.black);
    g.fillOval(210,175,10,10);
    g.fillOval(230,175,10,10);
    g.setColor(Color.red);
    int xs[]={210,230,230};
    int ys[]={195,200,190};
    g.fillPolygon(xs,ys,3);
  }
}
「似た絵」ということで,かなり頑張ってプログラムを書いてくれた人の絵 を11/24 雪だるまの絵で紹介する.
提出された課題の中に,全く同じプログラムがあった.
次に進む