Oracle Java 8u25 を使用した Windows 7 64 ビットで、Spring ツール スイート 3.6.2 (Eclipse クローン) で nullcheck 分析の奇妙な動作に遭遇しました。Java 7 ソース互換性を持つ同じ Maven プロジェクトは、Eclipse で NPE エラーを正常に検出しますが、Maven のコンパイル バージョンを Java 1.8 に変更すると、Eclipse はこのエラーを検出できません。
Eclipse での私の nullcheck 分析構成 (Java->Compiler->Errors/Warnings->Null 分析) は次のとおりです。 (Java 7で動作するため、すべて問題ないようです)
私のmaven pomはここにありますhttp://pastebin.com/pF1yJSG2、上記のように、pomのjava.versionが1.7の場合はnullチェックが機能し、1.8の場合はnullチェックが機能しません。
サンプル ソース コードは次のとおりです。
package test.nullcheckbug.core;
import javax.validation.constraints.NotNull;
public class Program {
/**
* This will fail to compile under java 7 (null analysis works in STS
* 3.6.2). But under java 8 it does not show error in Eclipse Markers -
* static analysis does not work ?!
*
* @return null which is not allowed
*/
@NotNull
public String fail() {
return null;
}
/**
* Simple main.
*
* @param args
* ignored args
*/
public static void main(String[] args) {
}
}
どこに問題があり、nullcheck を jdk 1.8 互換性の下で動作させる方法を知っている人はいますか?
編集: Maven は関与していないようです。同じソースコードとコンパイラの互換性レベルが1.7に設定された非mavenプロジェクトで同じ問題がシミュレートされました。バグですか?
EDITED-2:さらに調査した結果、注釈の次の違いが違いを生むことがわかりました: java.lang.annotation.ElementType.TYPE_USE 、注釈にこれがない場合、Java 8ではnullcheckは検出されませんが、Javaでは検出されます7.しかし、なぜですか?なぜそんなに異なる動作があるのですか?!
EDITED-3: MartinLippert からの調査と私がテストした結果、nullcheck API は Java 7 と Java 8 の間で大幅に変更されたようです。null 検出には (Eclipse ライブラリのバージョン 2.0 から見られるように) java.lang.annotation.ElementType.TYPE_USE が必要です。タイプ @Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER}) は分析では無視されます。質問は次のとおりです。Java 8 で NULL 分析が必要であり、新しい要素タイプでのみ機能するのはなぜですか? (Java 8 では新しい言語機能を十分に活用するのが良いことは理解していますが、なぜ互換性を壊す必要があったのでしょうか?たとえば、javax.validation @NotNull は nullchecking アノテーションとして使用できなくなりました :-((( )