2015年5月26日火曜日

Java1.7 Compile で検知できないキャストエラーについて

Java1.6 で動作しているJenkins で、ビルドがコケた。
理由は、キャストエラー。これをJava1.7 のデフォルトではコンパイルエラーとして表示してくれないため、開発環境ではエラーがでないが、Java1.6 でBuild したらコケる。


以下、テストコード
package test;

import java.util.Map;
import java.util.HashMap;

public class Test {
    public static void main(String args[]) {
     Map result = new HashMap();
     result.put("key",new Integer(2));
     int errorCode = (int)result.get( "key" );
     System.err.println("errorCode: " + errorCode);
    }
}

で、問題は以下の部分。
int errorCode = (int)result.get( "key" );

以下のようにキャストすべき。
int errorCode = (Integer)result.get( "key" );

-source option に1.6 を指定すると、キャスト失敗。
javac -source 1.6 -bootclasspath "C:\Program Files\Java\jdk1.7.0_67\jre\lib\rt.jar" Test.java
Test.java:11: エラー: 変換できない型
        int errorCode = (int)result.get( "key" );
                                       ^
  期待値: int
  検出値:    Object
エラー1個

しかし、source を1.7 に指定すれば、コンパイルに問題は起きない。
javac -source 1.7 -bootclasspath "C:\Program Files\Java\jdk1.7.0_67\jre\lib\rt.jar" Test.java

で、開発中にどうやってこれを検知するか(コンパイルエラーとして表示させるか)という点ですが、 Eclipse の以下の設定で、実行環境をJava1.7 から、1.6 に変更すれば検知可能です。
Right click on the project > Build Path > Java Build Path > Libraries

0 件のコメント:

コメントを投稿