HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

例外クラスのコンストラクタの引数

java.lang.Throwable クラスでは、次の4つのコンストラクタが提供されている(Java 2 SE 1.4 以降)

  • Throwable()
  • Throwable(String message)
  • Throwable(String message, Throwable cause)
  • Throwable(Throwable cause)

で、Java 2 SE 1.3 以前では Throwable を引数に持つコンストラクタが提供されていなかった。そのせいなのかどうかは分からないが、Java 2 SE 1.4 において、Throwable をパラメータとして渡したいのに対応するコンストラクタがなくて唸っていたことがあったので、Java 2 SE 5.0 ではどれくらいの例外クラスに対して、Throwable をパラメータとして渡せるコンストラクタが追加されたのかを調べてみた。
次のようなスクリプトで、rt.jar に含まれるクラスについて調べた。

#! /bin/bash

pushd `dirname $0`

WJAVA_14_HOME=D:/lang/java/j2sdk1.4.2_18
WJAVA_15_HOME=D:/lang/java/jdk1.5.0_11
JAVA_14_HOME=/D/lang/java/j2sdk1.4.2_18
JAVA_15_HOME=/D/lang/java/jdk1.5.0_11

jar tf ${WJAVA_14_HOME}/jre/lib/rt.jar |\
    grep '^java[x]*/.*Exception.class' |\
    sort |\
    sed -e 's/[.]class$//' -e 's|/|.|g' > clslist.txt

for c in `cat clslist.txt` ; do
    echo "=== ${c} ==="
    ${JAVA_14_HOME}/bin/javap.exe ${c} | grep "public ${c}" | sort > $$_14.txt
    ${JAVA_15_HOME}/bin/javap.exe ${c} | grep "public ${c}" | sort > $$_15.txt
    diff -w $$_14.txt $$_15.txt
    rm -f $$_14.txt $$_15.txt
done > result.txt
${JAVA_14_HOME}/bin/java.exe -version
${JAVA_15_HOME}/bin/java.exe -version

Windows 上の cygwin 環境で動かしているので、変な感じのスクリプトになっている。
結果。

  • java.lang.IllegalArgumentException
  • java.lang.IllegalStateException
  • java.lang.SecurityException
  • java.lang.UnsupportedOperationException
  • java.security.DigestException
  • java.security.GeneralSecurityException
  • java.security.InvalidAlgorithmParameterException
  • java.security.InvalidKeyException
  • java.security.KeyException
  • java.security.KeyManagementException
  • java.security.KeyStoreException
  • java.security.NoSuchAlgorithmException
  • java.security.ProviderException
  • java.security.SignatureException
  • java.security.cert.CRLException
  • java.security.cert.CertificateEncodingException
  • java.security.cert.CertificateException
  • java.security.cert.CertificateParsingException
  • java.security.spec.InvalidKeySpecException

java.security パッケージを除くと、意外と少なかった。
逆に、Throwable クラスへのコンストラクタの追加が Java 2 SE 1.4 で行われているので、Java 2 SE 1.3 と 1.4 の違いを見てみるともっとたくさんあるのかもしれない。
Java 2 SE 1.3 の環境をセットアップすることがあったらちょっと確かめてみるかな‥ (いつになるやら)