平成14年度 プログラミング言語II 試験問題

水野2003/1/30    

※ レポートの配点を40点としていますのでこの試験問題の満点は60点です

問1 次のプログラムについて以下の問いに答えなさい。(各10点、計20点)

public class Test14{
        static String list[]={"1","Two","3","Hello","27","END","15"};
        static public void main(String arg[]){
                int t=0,i,k;
                for(i=0;i<list.length;i++){     
                        if(list[i].equals("END"))break;
                        try{
                                k=Integer.parseInt(list[i]);
                                System.out.println("OK");
                                t+=k;
                        }catch(Exception ex){
                                System.out.println("例外");
                        }
                }
                System.out.println("t="+t);
        }
}

(1) Test14クラスがアプリケ-ションプログラムとして実行された時の出力を示しなさい。

(2)if文の条件式 list[i].equals("END") を list[i]=="END" とするのが好ましくない理由を示しなさい。

問2 以下から4項目を選択しjava言語の場合について具体的に説明しなさい。
   (各10点、計40点)


解答


問1
(1)例外処理の流れを追うことができたでしょうか?解答は下記のようになります。
OK
例外
OK
例外
OK
t=31
(2) 基本データ型と参照データ型の違いを十分に理解できているかの確認の為の問題です。
残念ながら正解率は非常に低かった
==演算子は変数のが等しい場合に真となります。
基本データ型でははデータそのものなので、これはデータが等しい場合に真となります。
参照データ型のは参照対象を特定するものなので、が等しい場合は参照するインスタンスが同一であることを意味します。従って、list[i]=="END"とするとlist[i]から参照するStringインスタンス"END"と==演算子の右辺のStringインスタンス"END"が同じインスタンスの場合のみ真となります。
これに対してlist[i].equals("END")はlist[i]から参照するStringインスタンスとequalsメソッドの引数のStringインスタンス"END"の内容が等しい場合に真となります。このとき2つのStringが同一のインスタンスである必要はありません。
問題の場合はstatic String list[]={"1","Two","3","Hello","27","END","15"};とif(list[i].equals("END"))break;のString「END」が同じインスタンスとは限らないため、list[i]=="END"とするのは好ましくないのです。
※javaのコンパイラはメモリーを節約する為に、同じ内容の二つのStringインスタンスを作らずに1個ですませることが多い。従って==でプログラムを書いても期待どうりの動作をすることがありますが、これは保証の限りではありません。
さらに、Stringクラスではequalsはインスタンスの内容を比較する処理として実装されていますが、自分で作ったようなクラスについてはequalsを上書きして内容を比較する処理を実装する必要があります。

問2

 下記の様な単語を含む解答を期待していました。具体的な解答は自分で考えましょう。あえてここでは示しません。