2012-09-19

Rhinoでprintfやformatに整数フォーマット(%d)を使うとエラー

以下の記述はIllegalFormatConversionExceptionを引き起こす(大量のスタックトレースが出力されるので注意)。

a-1. エラーを引き起こすスクリプト:
java.lang.String.format("%d", [10]); // error
java.lang.System.out.printf("%d", [10]); // error

a-2. エラーメッセージ(抜粋):
org.mozilla.javascript.WrappedException: Wrapped java.util.IllegalFormatConversionException: d != java.lang.Double

数値(Number)をパラメータ配列に直接入れた結果、 整数フォーマット(%d)に対してjava.lang.Doubleが渡されてしまったようだ。
対策として、数値をjava.lang.Integer.valueOf()メソッドでjava.lang.Integerに変換してから パラメータ配列に入れることにする。

b-1. 実行するスクリプト(printf-format.js):
var stdout = java.lang.System.out;
var n = 10; // Number
try {
    stdout.println(java.lang.String.format("%d", [n])); // error
} catch (e) {
    stdout.println(e.message);
}
try {
    stdout.printf("%d\n", [n]); // error
} catch (e) {
    stdout.println(e.message);
}
stdout.println(java.lang.String.format("%d", [java.lang.Integer.valueOf(n)]));
stdout.printf("%d\n", [java.lang.Integer.valueOf(n)]);

b-2-1. Rhino1.7で実行する:
>java -classpath .;js.jar org.mozilla.javascript.tools.shell.Main -w -debug printf-format.js
java.util.IllegalFormatConversionException: d != java.lang.Double
java.util.IllegalFormatConversionException: d != java.lang.Double
10
10

b-2-2. jrunscript(Java1.7)で実行する:
>jrunscript printf-format.js
java.util.IllegalFormatConversionException: d != java.lang.Double
java.util.IllegalFormatConversionException: d != java.lang.Double
10
10

0 件のコメント:

コメントを投稿