簡體   English   中英

Java:如何仍然發生不可能的NullPointerException?

[英]Java: how can an impossible NullPointerException still occur?

我剛收到以下關於我們軟件的錯誤報告:

java.lang.NullPointerException
    at java.util.Arrays.equals(Unknown Source)
    at our.app.OurMain(OurMain.java:13)

這種情況發生在Windows上的JRE 1.7.0_45上,對應的源代碼是Arrays.equals

public static boolean equals(byte[] a, byte[] a2) {
    if (a==a2)
        return true;
    if (a==null || a2==null)
        return false;

    int length = a.length;
    if (a2.length != length)
        return false;

    for (int i=0; i<length; i++)
        if (a[i] != a2[i])
            return false;

    return true;
}

調用代碼是:

final byte[] b1 = ... // populate array
final byte[] b2 = ... // populate array
final boolean equal = Arrays.equals(b1, b2);

顯然沒有辦法在這里引發NullPointerException 它怎么還能發生? 錯誤報告可以被認為是值得信賴的。

這不是一個答案,但因為評論太長了......

尚未提出的一個問題是:問題什么時候開始出現? 你的軟件或出藍色的具體更新后? 您可能無法追蹤它第一次出現時的確切日期,但如果它可以與時間相關聯,那么您作為軟件提供的任何內容都可能會發生變化(例如,您是否捆綁了JRE?)導致問題。 然后,您將有條不紊地將已知的錯誤前版本與第一個錯誤清單發布之間的更改進行區分。

如果它突然出現,最有可能的問題來源(據我所知,你所披露的內容)隱藏在軟件執行環境的某個地方(可能不在你的直接控制之下)。 它可能是JRE本身,相關的庫或系統服務,甚至可能是硬件和軟件的特定組合(信不信由你,有時顯然甚至工作站的BIOS都會產生巨大的影響: https://www.daniweb。 com / hardware-and-software / microsoft-windows / windows-vista-and-windows-7-8 / threads / 271699 )。

為了提高實際解決問題原因的機會,您需要收集錯誤實際出現的環境的信息,並盡可能地(至少JRE版本,32/64位,操作系統;最好安裝補丁,CPU型號;最好包括掩模設置修訂版,主板型號;最好包括BIOS版本和主板版本)。 不要忘記確切的版本或導致問題的軟件。 如果您的用戶群具有非常均勻的環境(例如,在大型公司中只購買了幾個工作站模型,可能全部來自同一供應商),那么與用戶群非常異質(例如,許多獨立客戶使用)相比,更多的細節更有意義。完全不同的配置)。

給定足夠的數據模式應該出現(所有錯誤報告都有共同點,例如特定的JRE;或者一組JRE版本,特定的工作站模型等)。

如果可能,您的用戶可以與您合作(故意改變遇到問題的機器/用戶的環境)來測試候選人。 這可能涉及安裝JDK以獲取更多錯誤上下文,更改VM設置等。

只是粗略的輪廓,但如果沒有快速解決方案出現,從長遠來看,有條理的方法最有可能產生解決方案。

如果您的數組實際上是“ java.lang.Byte ”數組,並且將null作為其中一個值,則會發生這種情況,因此在取消裝箱時a[i] != a2[i] )會出現此異常。

您可以使用javap檢查字節代碼指令。 或者是逆向工程工具。

進行單元測試:

  • a,a2:4例無效或無效。
  • a [0]是否為空,a2 [0]是否為空。

以上區分了陣列或陣列項目上的NPE。

我非常模糊的猜測:你正在將byte[](Object) Byte[] (而不是byte[] !)進行比較,而當Byte [i]為null時,隱式byteValue()也會拋出空指針異常。

我無法立即看到如何調用該錯誤。 也許還有另一個等於? 不在byte[]

我發現java.util.Arrays.equals(Unknown Source)可疑。 我原本期望JRE / SDK的rt.jar包含行號信息。 所以,也許有人在該系統上安裝了一些其他JDK,可能是適用於嵌入式設備的東西,或其他一些實驗性JDK或類似東西,這些東西會導致您使用與以前不同的JRE。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM