java.lang.IllegalArgumentExceptionjava.awt.Color コンストラクタでスローされる


症状

アプレットを Sun JRE を使用したブラウザで実行している場合、IllegalArgumentExceptionjava.awt.Color コンストラクタでスローされます。同じアプレットが Microsoft VM では実行できます。

原因

この例外は、Sun JRE で境界値を超えた値や境界値に達しない値が Sun JRE の Color コンストラクタで渡されるために起こります。

Sun JRE の Java クラスライブラリは時間の経過とともに変化してきました。詳細になった API もあれば、廃止された API もあります。また、実装が変更された API もあります。

範囲外の値を Color コンストラクタに渡した場合の結果は詳細に定義されていないため、Microsoft VM では値を最大のカラー値や最小のカラー値に自動的に再調整します。Sun JRE では別のアプローチをとっており、IllegalArgumentException を使用して、範囲外の値を指定したことをプログラマに通知します。

解決方法

有効なカラー値だけが Color コンストラクタに渡されるように対策を講じたコードを記述します。次に例を示します。

  void Color newColor(int r, int g, int b)
        {
            return new Color(r, g, b);
        }

このコードを次のように変更します。

        int ensureColorRange(int v)
        {
            if (v < 0)
                return 0;
            else if (v > 255)
                return 255;
            else
                return v;
        }
        void Color newColor(int r, int g, int b)
        {
            r = ensureColorRange(r);
            g = ensureColorRange(g);
            b = ensureColorRange(b);

            return new Color(r, g, b);
        }

詳細情報

        なし