プログラミングの最近のブログ記事

 前回の記事(SADEE 2を利用したリソース測定試験)で紹介した「jconsole」ですが、J2SE 5.0から利用することが出来ます。Sunに詳しい説明が書いてありますので、jconsole の使用を参照してください。

前回紹介した、リソースの試験では、半日間SADEE 2のシナリオを実行していました。結果は、テスト開始からヒープメモリの使用量が上昇して行き、ある一定値付近でガベージコレクション(GC)が実行された事が、jconsoleのグラフから確認できました。

作成したシナリオが、例えば、全てローカル上の変数で、全て解放されることが予想される場合に、明らかに、テスト開始時のヒープメモリの使用量までメモリが解放されていないということが判明すれば、プログラム上で間違えていると取られる事が出来ます。

 jconsoleは、まだまだこの先、リソース測定試験以外でも利用することが予想されるので、今から使っていこうかなと考えています。

Tomcatをjconsoleで監視する関連Webです。
rough justice jconsoleでTomcat(JVM)の監視

 達人プログラマーを読んでいて、参考になる事は、たくさんあるのですが、今日読んでいて特に気になった事や考えさせられた事を紹介します。

各項目の最後には、演習問題があるのですが、その中で以下の問題がありました。


6. Javaにおいて、(a + 1) <= a となる。

答えは、真となることはないのでしょうか。考え方は、Javaのプログラミング言語以外も同じだと思います。他にも問題がありますが、一番シンプルで一番分かりやすいので、紹介しました。

 

 ここで、私もシンプルな問題を一つ。言語は、Javaを例にしていますが、C++で考えても考え方は、変わりません。次のソースサンプルを見て下さい。

インタフェースで「hoge」メソッドが以下のように定義されていたとします。

void hoge() throws Exception;
以下のプログラムを実行したとします。
try {
    obj.hoge();
} catch (Exception e) {
    e.printStackTrace();
}


「hoge」メソッド内で、例外が発生した場合、「e.printStackTrace();」が実行されない場合があるか?。


通常例外が、発生した場合は、呼び出し元に例外を返すように処理している場合が多いでしょう。今回の場合も、「hoge」メソッドで例外が発生した場合に、例外をスローしていれば、「Exception」がキャッチされ、「e.printStackTrace();」が実行されます。ただ、「hoge」メソッドで、「Exception」をキャッチして、例外をスローしなければ、「e.printStackTrace();」が実行されません。

私が作成した問題は、わざとインタフェースでメソッドの定義を紹介しています。その為に、「Exception」がスローされるものだと思いこむと間違えてしまいます。

よって、答えは、実行されない場合もあるです。「hoge」メソッド内で例外をスローしない場合は、「e.printStackTrace();」が実行されません。

 

今回紹介した2つの問題は、SJC-P試験の問題に出てきてもおかしくない問題だと思います。

 C#で苦戦しました。苦戦したのは、単純な事ですが、1時間ぐらい悩んでいました。C#の機能に、アクセサを作成する機能があります。記述するとこんな感じでした。

public string name {
    set {
        name = value;
    }
    get {
        return name;
    }
}

使用する場合は、obj.nameのように使います。コンパイルは、通りますが、実行するとスタックオーバーフローに、無限ループが起こったようです。nameに設定しようとすると、設定する値が、nameに代入されますが、この時に、nameがsetterを呼びます。後は、この繰り返しで、getterも同じことでしょう。

なぜ、1時間も悩んでいたかと言うと、別の機能では、C++マネージ拡張で作成していて、現在作業している必要な機能が、C#で作成されている為、似たような機能をC++マネージ拡張から真似してC#に移植しました。それで、C++マネージ拡張からC#のコーディングに変えようと一気に変えたのとC#になれていなかったので、原因がなかなか分かりませんでした。

問題なく、コードを記述するには、以下のようにコーディングする必要があります。

string m_name;

public string name {
    set {
        m_name = value;
    }
    get {
        return m_name;
    }
}

これって、そこまでメリットあるの?と思ってしまう機能と思いませんか?扱っているC#は、バージョンが2.0以降ではない為、setter,getterレベルで、アクセス修飾子を変更できないので、さらに厄介です。

Javaに慣れていたら、Eclipseのようなアクセサ作成の方が、楽です。やるならせめてRubyのアクセサレベルなら良いのですが...。