読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり、所属会社の見解ではありません。 GitHub: takahashikzn

FindBugs on JDK7において、System.outは常にnullであると警告される

Java

先日、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