10

私はこの短いコードをあまりにも長い間見つめてきましたが、6 行目にどのようにスローNullPointerExceptionされるのか、私の人生では理解できません。なぜ NPE なのですか?

class ConvertTest {

    public static void main(String[] args) throws Exception {
        byte[] b = "Ha".getBytes("UTF-8");
        System.out.println("bytes: " + b.length);
        javax.xml.bind.DatatypeConverter.printBase64Binary(b);  // NPE!
    }
}

出力

bytes: 2
Exception in thread "main" java.lang.NullPointerException
        at javax.xml.bind.DatatypeConverter.printBase64Binary(DatatypeConverter.java:547)
        at ConvertTest.main(ConvertTest.java:6)
Press any key to continue . . .

アップデート

バグ レポートの多くは 1.7 の亜種を指摘していますが、Eclipse が使用するように構成され1.6.0_32ており、TextPad が のバージョンを検出したことに驚きました1.6.0-b105(それがインストールされていることさえ認識していませんでした!)。

その NPE で両方の JRE が失敗します。

4

3 に答える 3

3

Camel のこの問題で証明されているように、現在 JDK7 内の JAXB にバグがあるようです。

https://issues.apache.org/jira/browse/CAMEL-4893

これは最終的に、java.net の JAXB プロジェクトのこの問題https://github.com/javaee/jaxb-v2/issues/860にリンクしています。

これと同じ問題が発生しているかどうかは完全にはわかりませんが、最新の JAXB バージョンで JDK6 を使用してみて、同じ NPE が発生するかどうかを確認してください。

于 2012-09-19T15:54:33.463 に答える
2

環境の詳細がなければ、これが事実であると確信することはできませんが、JAXB RI を使用している場合は、この JAXB バグで説明されている問題が発生している可能性があります: http://java.net/jira/browse/JAXB -761 .

バグはあなたが抱えていた問題に具体的に対処していませんが (parseDateメソッドに関連しています)、根本的な原因は同じである可能性があります。これは JAXB のバージョン 2.2.1 で検出されましたが、以前は 2.1.x バージョンに存在していた可能性があり、JAXB 2.1.1 は 1.6 に統合された (1.6u14 に統合された) 最新のリリースのようです。

この問題は、1.7 に統合された JAXB 2.2.4 で解決されたと述べています。

追加の注意- 1.6u31 で使用しようとする場合の NPE に関する関連する問題が文書化parseBooleanされています (ほとんど役に立ちませんが、説明は非常に短いです): http://java.net/jira/browse/JAXB- 902 . これは、RI を使用しているか、別の JAXB 実装を使用しているかによって、これがまだ進行中の問題である可能性があることを示唆しています。

于 2012-09-19T18:26:57.407 に答える
1
public static String printBase64Binary( byte[] val ) {
    return theConverter.printBase64Binary( val );
}

JAXB プロバイダーは、最初の整列化または非整列化操作の前のある時点で (おそらく JAXBContext.newInstance の呼び出し中)、setDatatypeConverter API を呼び出す必要があります。この手順は、印刷および解析機能を実行するために使用する必要があるコンバーターを構成するために必要です。

最初にコンバーターを設定してみてください

/**
     * This method is for JAXB provider use only.
     * <p>
     * JAXB Providers are required to call this method at some point before
     * allowing any of the JAXB client marshal or unmarshal operations to
     * occur.  This is necessary to configure the datatype converter that 
     * should be used to perform the print and parse conversions.
     * 
     * <p>
     * Calling this api repeatedly will have no effect - the 
     * DatatypeConverterInterface instance passed into the first invocation is 
     * the one that will be used from then on.
     * 
     * @param converter an instance of a class that implements the 
     * DatatypeConverterInterface class - this parameter must not be null.
     * @throws IllegalArgumentException if the parameter is null
     */
    public static void setDatatypeConverter( DatatypeConverterInterface converter ) {
        if( converter == null ) {
            throw new IllegalArgumentException( 
                Messages.format( Messages.CONVERTER_MUST_NOT_BE_NULL ) );
        } else if( theConverter == null ) {
            theConverter = converter;
        }
    }
于 2012-09-19T15:54:26.743 に答える