Report7

    
1.偶数奇数判定プログラム(GUIaa)をタイプし、その動作を考察せよ。
  2.例外処理について、考察せよ。
  3.上述のサンプルプログラムに出てきたGUI部品を、全て使ったプログラムを作成せよ。
  4.摂氏から華氏、華氏から摂氏への温度換算ができるプログラムを作成せよ。
  5.「電卓」プログラム。中身は自分の思うように。
    


プログラム1
 偶数奇数判定プログラム(GUIaa)をタイプし、その動作を考察せよ。
import java.awt.*;       //GUI関係のパッケージクラス群をインポートする。  
import java.awt.event.*;  

public class GUIaa extends Frame {             //Frameクラスの継承。ウインドウを表すクラスはFrameクラスを使う。
    Button    b0 = new Button("Even/Odd?");    //インスタンス変数としてボタンを生成・初期化する。"()"の文字はボタンの中に出力される。  
    Label     x0 = new Label("Type a number and press...");  
     /*インスタンス変数として表示欄を生成・初期化する。"()"の文字は表示欄の中に出力される。*/
    TextField t0 = new TextField();              //インスタンス変数として入力欄を生成・初期化。
    
    public GUIaa() {                   //コンストラクタでウインドウの初期設定をする。
        setLayout(null);                         //部品の自動配置機能をoffにする
        add(t0); t0.setBounds(10, 40, 90, 30);   //入力欄の貼付け(左上隅のx/y座標、幅、高さ)
        add(b0); b0.setBounds(110, 40, 90, 30);
        add(x0); x0.setBounds(10, 80, 180, 30);
        b0.addActionListener(new ActionListener() {   //ボタンb0が押された時のイベントを無名クラスで定義する
            public void actionPerformed(ActionEvent evt) {
                int i = (new Integer(t0.getText())).intValue();
                   /*「t0.getText」はテキスト内に書かれた文字列を返す。Integer(値)は値をint型として返し、iに代入する。*/   
                t0.setText("");                  //t0のテキスト内を空欄にする。
                if(i % 2 == 0) {                 //偶数奇数の判定。値を2で割って余りが0ならEven、1ならOddにする、結果をラベルに表示する。
                    x0.setText(i + " is Even");
                } else {
                    x0.setText(i + " is Odd");
                }
            }
        });
    }
    public static void main(String[] args) {
        Frame win = new GUIaa();
           /*前述のFrameオブジェクトを。変数winへ生成・初期化する。*/
        win.setSize(200, 150); win.setVisible(true);    //ウィンドウのサイズを決め、ディスプレイに表示。
        win.addWindowListener(new WindowAdapter() {     //ウィンドウを閉じる時のイベントを無名クラスで定義する。
            public void windowClosing(WindowEvent evt) {
                System.exit(0);    //現在実行しているJava仮想マシンを終了。ゼロ以外の値は異常終了を示す。
            }
        });
    }
}


実行結果
 

考察
 イベントリスナ
 イベント別に定義されているリスナーインターフェイスの事。しかし、インタフェイスなので定義されているメソッド全てをクラスに実装する必要がある。
<example>
 1.マウスのクリックなどのイベントを処理するためには、まずイベント別に定義されているリスナーインターフェイス(イベントリスナー)を実装するクラスを
   作成し、イベント処理をメソッドに記述する。
  2.続いて、イベントリナーオブジェクトをイベントが発生するコンポーネント(ボタンなど)に登録する。

※※これにより、ボタンでイベントが発生すると、実装したメソッドが呼び出されるようになる。
  上記のプログラムではActionListenerがイベントリスナである。

 アダプタクラス
 このアダプタクラスは上記のイベントリスナと違い、必要なメソッドだけで良い。
 その理由は、このクラスが特定のイベントリスナの全てのメソッドの空実装が定義されているからである。これを継承すれば必要なメソッドをオーバーライドして
 使う事ができる。

※※上記のプログラムではWindowAdapterを使用している。これはWindowListenerイベントリスナの全ての空メソッドを実装したクラスである。

 インナクラス
 式または別のクラスのスコープ内で定義されるクラスである。
<特徴>
 ・このクラスは、別のクラスのスコープ内に定義されている変数やメソッドを使用する事が出来る。
 ・このインナクラスにアダプタクラスを継承させると別のクラスのオブジェクトを作成しそれを使ってメソッドや変数を呼び出す手間が省けるようになり、
 プログラムを簡単にできる。

 無名インナクラス
 ・これは名前を持たない(無名)インナクラスである。下記のクラス名とあるがこれは無名インナクラスのスーパークラスの名前である。
  new クラス名() {...}

※※上記のプログラムではb0.addActionListener(new ActionListener() {
                   win.addWindowListener(new WindowAdapter(){    の部分がそうである。


プログラム2
 例外処理について、考察せよ。

public class Rep2 {

    public static void main(String[] args) {
        System.out.println("実行開始");      //"実行開始"を出力
        int i=1,j=0,k=0;
        try{
                k=cal(i,j);
                System.out.println(k);
        } catch (ArithmeticException e) {   //例外の発生
                System.out.println("例外:" + e);
        }
        System.out.println("実行終了");     //"実行終了"を出力
     }
     
     static int cal(int i, int j) throws ArithmeticException {
        return i/j;
     }
}

実行結果
実行開始
例外:java.lang.ArithmeticException: / by zero
実行終了

考察
 例外
 コンパイルはできるがプログラム実行時に予期していなかった問題が発生し、それを通知するために生成されるオブジェクトの事である。
<種類>
 1.Error・・・致命的なエラー。JVMかその外部で発生した例外であり、Javaプログラムで処理する事はできない。
 2.RuntimeException・・・正常なJavaプログラムでは発生しない例外。例外処理は任意。
 3.Exception・・・正常なJavaプログラムであっても、環境によっては発生する可能性がある。例外処理は必須。

※※例外処理はtry catchvブロックを用いたり、throwステートメントを使う。
 
 try catch
   
 try{
        //例外の発生が予測されるコード
  }
    catch(例外の型名 変数名){
        //例外発生時の処理
    }
    finally{
        //共通処理
    }

 これは例外が発生しそうなコードを最初のtryブロックで囲み、エラーが発生しなければそのコードを実行し、共通処理がその次に処理される。
 例外が発生した場合はcatchブロックに在る処理が実行され、共通処理がその次に実行される。もし、tryブロックで例外が発生し、catchブロックで例外が処理
できない、tryブロックは実行されず共通処理が実行される。
 ちなみに例外が発生したtryブロック内は制御は戻らない。
 catchで扱う例外クラスはそれぞれ階層があり全ての例外処理を扱う事が出来るExceptionクラスがある。それらのサブクラスが例外別に定義されている。
 catchブロックはtryブロックのすぐ下にある物から順番に例外オブジェクトをcatchしようとする。Exceptionで例外オブジェクトをcatchすると次のcatchブロッ
クには絶対制御が回る事はありません。だからExceptionクラスで例外オブジェクトをcatchするcatchブロックは最後にしたほうが良い。

キーワード意味
ArithmeticException算術例外が発生した場合にスローされる
ArrayIndexOutOfBoundsException不正なindexで配列がアクセスされた事を示すためにスローされる
ArrayStoreExceptionオブジェクト配列に不適切な型のオブジェクトを保存しようとした事を示すためにスローされる
ClassCastExceptionサブクラスにそのインスタンスでないオブジェクトをキャストしようとした場合にスローされる
ClassNotFoundExceptionメソッドにクラス名の文字列を指定してクラスを読み込もうとした時、その名前のクラスの定義が見つからなかった場合にスローされる
CloneNotSupportedExceptionオブジェクトのクローンを作成するためにObjectクラスのcloneメソッドを呼び出した場合、オブジェクトのクラスがCloneableインタフェイスをインプリメントしていない時にスローされる
IllegalAccessExceptionアプリケーションがClassクラスのnewInstanceメソッドを使用してクラスのインスタンスを構築しようとした時、現在のメソッドが引数のない適切なコンストラクタにアクセスできない場合にもこのクラスのインスタンスがスローされる
IllegalArgumentExceptionメソッドに渡された引数が正しくない場合にスルーされる
IllegalMonitorStateExceptionスレッドがオブジェクトのモニター待機しようとしたり、オブジェクトのモニター待機している他のスレッドに通知しようとした時、そのモニターを所有していなかった場合にスローされる
throwsステートメント  throwsステートメントはメソッドやコンストラクタを定義で発生しそうな例外を明示しておく事ができる。    メソッドの場合 修飾子 戻り値 メソッド(シグネチャ) throw 例外クラスリスト { 処理 } コンストラクタの場合   コンストラクタ(シグネチャ) throws 例外クラスリスト {    初期化処理 }  このように明示しておくと、当該メソッド利用者に分かりやすいだけでなく、コンパイル時に、スローされた例外が呼び出し元でキャッチされているかどうかチェック される。キャッチされていなければ、コンパイルエラーになる。 プログラム3  上述のサンプルプログラムに出てきたGUI部品を、全て使ったプログラムを作成せよ。 import java.awt.*; import java.awt.event.*; public class rep3 extends Frame{ Button bt1 = new Button("start!!"); Button bt2 = new Button("clear"); Label l1 = new Label("First Line"); Label l2 = new Label("Second Line"); Label l3 = new Label("Third Line"); Label l4 = new Label("Result"); TextField t1 = new TextField(); TextField t2 = new TextField(); TextField t3 = new TextField(); TextField t4 = new TextField(); public rep3(){ setLayout(null); add(l1); l1.setBounds(20, 50, 60, 30); add(l2); l2.setBounds(20, 100, 60, 30); add(l3); l3.setBounds(20, 150, 60, 30); add(l4); l4.setBounds(20, 250, 60, 30); add(t1); t1.setBounds(150, 50, 100, 30); add(t2); t2.setBounds(150, 100, 100, 30); add(t3); t3.setBounds(150, 150, 100, 30); add(t4); t4.setBounds(150, 250, 150, 30); add(bt1);bt1.setBounds( 20, 200, 100, 40); add(bt2);bt2.setBounds( 140, 200, 100, 40); bt1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent evt){ try{ double length1 = (new Double(t1.getText())).doubleValu\e(); double length2 = (new Double(t2.getText())).doubleValue\(); double length3 = (new Double(t3.getText())).doubleValue\(); double hlap = 1.0/2.0 * (length1 + length2 +length3); double result1 = hlap*((hlap-length1)*(hlap-length2)*(h\lap-length3)); double answer = Math.pow(result1,1.0/2.0); t4.setText(Double.toString(answer)); }catch(Exception ex){ t4.setText("数字を入力せよ"); } } }); bt2.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent evt){ t1.setText(""); t2.setText(""); t3.setText(""); t4.setText(""); } }); } public static void main(String[] args) { Frame win = new rep3(); win.setTitle("TRIANGLE AREA"); win.setSize(350, 300); win.setVisible(true); win.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { System.exit(0); } }); } } 実行結果 考察 このプログラムはサンプルプログラムで使用したButton,Label,TextFieldのコンポーネントを使用している。  まずmainメソッドから説明する。まずReport7_triangleクラスをインスタンス化しコンストラクタを呼び出す。そして、Frameコンテナを表示する。 ウィンドウを閉じる動作をそのFrameコンテナに登録している。  importしているものはGUI関係のパッケージをimportしている。 プログラム4  摂氏から華氏、華氏から摂氏への温度換算が出来るプログラムを作成せよ。 import java.awt.*; import java.awt.event.*; public class henkan extends Frame{ Button b0 = new Button("C --> F"); Button b1 = new Button("F --> C"); TextField t0 = new TextField(); TextField t1 = new TextField(); public henkan(){ setLayout(null); add(t0); t0.setBounds(30,50,100,20); add(b0); b0.setBounds(140,40,90,20); add(b1); b1.setBounds(140,60,90,20); add(t1); t1.setBounds(240,50,100,20); b0.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { try{ int i = (new Integer(t0.getText())).intValue(); t1.setText("" + (i*1.8+32)); }catch(Exception ex){ t1.setText("error"); } } }); b1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { try{ int i = (new Integer(t0.getText())).intValue(); t1.setText("" + (i-32)/1.8); }catch(Exception ex){ t1.setText("error"); } } }); } public static void main(String[] args) { Frame win = new henkan(); win.setSize(370, 100); win.setVisible(true); win.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { System.exit(0); } }); } } 実行結果
摂氏から華氏へ華氏から摂氏へ
考察 (華氏温度) = 1.8 * (摂氏温度) + 32  の式から(華氏温度-32) / 1.8 = (摂氏温度)となるのでこの式をボタンの中に記述する。華氏温度は入力された文字列をdouble型にしたものとする。 整数以外を入力すると例外が発生しcarchで捕まえて処理する。例外が発生する理由は文字列をdouble型に型変換できない事に在る。 プログラム5  「電卓」プログラム。中身は自分の思うように。 import java.awt.*; import java.awt.event.*; public class den extends Frame{ Button b0 = new Button("+"); Button b1 = new Button("-"); Label x0 = new Label("and"); TextField t0 = new TextField(); TextField t1 = new TextField(); TextField t2 = new TextField(); public den(){ setLayout(null); add(t0); t0.setBounds(30,50,100,20); add(b0); b0.setBounds(340,40,50,20); add(b1); b1.setBounds(340,60,50,20); add(t1); t1.setBounds(180,50,100,20); public class den extends Frame{ Button b0 = new Button("+"); Button b1 = new Button("-"); Button b2 = new Button("*"); Button b3 = new Button("/"); Label x0 = new Label("and"); TextField t0 = new TextField(); TextField t1 = new TextField(); TextField t2 = new TextField(); public den(){ setLayout(null); add(t0); t0.setBounds(30,50,100,20); add(b0); b0.setBounds(300,40,50,20); add(b1); b1.setBounds(300,60,50,20); add(t1); t1.setBounds(180,50,100,20); add(t2); t2.setBounds(370,50,100,20); b1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { try{ int i = (new Integer(t0.getText())).intValue(); int k = (new Integer(t1.getText())).intValue(); t2.setText("" + (i - k)); }catch(Exception ex){ t1.setText("error"); } } import java.awt.event.*; public class den extends Frame{ Button b0 = new Button("+"); Button b1 = new Button("-"); Button b2 = new Button("*"); Button b3 = new Button("/"); Label x0 = new Label("and"); TextField t0 = new TextField(); TextField t1 = new TextField(); TextField t2 = new TextField(); public den(){ setLayout(null); add(t0); t0.setBounds(30,50,100,20); add(b0); b0.setBounds(300,40,50,20); add(b1); b1.setBounds(300,60,50,20); add(b2); b2.setBounds(300,80,50,20); b3.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { try{ int i = (new Integer(t0.getText())).intValue(); int k = (new Integer(t1.getText())).intValue(); t2.setText("" + (i / k)); }catch(Exception ex){ t1.setText("error"); } } }); } public static void main(String[] args) { Frame win = new den(); win.setSize(570, 150); win.setVisible(true); win.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { System.exit(0); } }); } } 実行結果 考察 この最後のプログラムは上の4のプログラムににいくつか追加して作成しました。 出来上がったのを見てみると加算、減算、乗算、除算の四則演算した結果となっています。  今回新たに追加した部分というのは、まず、計算したい二数をある演算により処理した 値を出力するテキストフィールドと、int型変数kを追加して四則演算させたい二数を入力 できるようにしてみました。 反省・感想  今回のレポートはやる事がたくさんあって大変でした。だけど、実行して作っ ていくとなかなか楽しかったです。友達に沢山助けてもらいました。最後のレポー ト8も頑張りたいです。 参考文献 ・独習JAVA