先日、JDK7に乗り換えました。だけどFindBugsはJDK7に対応していないので、"-source 1.6 -target 1.6"で使っています。
ここまでは先日の日記で書いたとおり。
で、FindBugs on JDK7に新たな問題(と言えるか微妙だけど)があることを発見しました。
JDK7では、System.outが明示的にnullとして宣言されているため、
System.out、System.err、System.inを使っているすべての箇所において
FindBugsの、「Foo.bar() の中でnullポインタSystem.outを参照外しをしています。」
という警告が出てしまい、大層ウザいことになるという。
なぜかというと、
全くもってFindBugsの警告メッセージ通りでして、JDK6までは
public final static PrintStream out = nullPrintStream(); /** * The following two methods exist because in, out, and err must be * initialized to null. The compiler, however, cannot be permitted to * inline access to them, since they are later set to more sensible values * by initializeSystemClass(). */ private static PrintStream nullPrintStream() throws NullPointerException { if (currentTimeMillis() > 0) { return null; } throw new NullPointerException(); }
という定義だったためにコンパイラやFindBugsを騙すことに成功していた一方、JDK7では
public final static PrintStream out = null;
と宣言されているから。
まぁこのケースにおいては、FindBugsは無罪であるといえるでしょう。
解決策は…ざっと調べてみたところ、FindBugsが対応してくれるのを待つしかないようです。
参考URL
http://stackoverflow.com/questions/6599571/findbugs-gives-null-pointer-dereference-of-system-out-why