国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

什么是 NullPointerException,我該如何修復(fù)它?

什么是 Null Pointer Exceptions ( java.lang.NullPointerException) 以及導(dǎo)致它們的原因是什么?

可以使用哪些方法/工具來(lái)確定原因,以便您阻止異常導(dǎo)致程序過(guò)早終止?


文章來(lái)源地址http://www.zghlxwxcb.cn/article/261.html

Java 中有兩種主要類(lèi)型的變量:

  1. 原語(yǔ):包含數(shù)據(jù)的變量。如果您想操作原始變量中的數(shù)據(jù),您可以直接操作該變量。按照慣例,基本類(lèi)型以小寫(xiě)字母開(kāi)頭。例如類(lèi)型變量int or char是原語(yǔ)。

  2. References:包含 an 的內(nèi)存地址的變量,Object 即引用 Object. 如果你想操作 Object 引用變量引用的對(duì)象,你必須取消引用它。取消引用通常需要使用.來(lái)訪(fǎng)問(wèn)方法或字段,或者使用 [ 來(lái)索引數(shù)組。按照慣例,引用類(lèi)型通常用以大寫(xiě)字母開(kāi)頭的類(lèi)型表示。例如,類(lèi)型變量 Object 是引用。


考慮以下代碼,您在其中聲明了一個(gè)原始類(lèi)型的變量 int 并且不對(duì)其進(jìn)行初始化:

int x;int y = x + x;

這兩行會(huì)使程序崩潰,因?yàn)闆](méi)有指定值

這兩行會(huì)使程序崩潰,因?yàn)闆](méi)有指定值 ,而我們正試圖使用 x 的值來(lái)指定 y。所有原語(yǔ)在被操作之前都必須被初始化為一個(gè)可用的值。


現(xiàn)在事情變得有趣了。引用變量可以設(shè)置為 null我沒(méi)有引用任何東西”。null如果您以這種方式顯式設(shè)置引用變量,或者引用變量未初始化且編譯器未捕獲它(Java 會(huì)自動(dòng)將變量設(shè)置為null),則可以獲得引用變量中的值。


如果引用變量由您顯式設(shè)置或通過(guò) Java 自動(dòng)設(shè)置為 null,并且您嘗試取消引用它,您會(huì)得到一個(gè)NullPointerException.


( NullPointerExceptionNPE) 通常發(fā)生在聲明變量但未創(chuàng)建對(duì)象并將其分配給變量時(shí),然后再?lài)L試使用變量的內(nèi)容。所以你引用了一些實(shí)際上不存在的東西。


采取以下代碼:

Integer num;
num = new Integer(10);


第一行聲明了一個(gè)名為 的變量num,但它實(shí)際上還沒(méi)有包含一個(gè)引用值。由于您尚未說(shuō)明要指向什么,因此 Java 將其設(shè)置為null.


在第二行中,new關(guān)鍵字用于實(shí)例化(或創(chuàng)建)類(lèi)型的對(duì)象Integer,并將引用變量num分配給該Integer對(duì)象。


如果您在創(chuàng)建對(duì)象num 之前嘗試取消引用,您會(huì)得到一個(gè)NullPointerException. 在最普通的情況下,編譯器會(huì)發(fā)現(xiàn)問(wèn)題并讓您知道“ num may not have been initialized,”,但有時(shí)您可能會(huì)編寫(xiě)不直接創(chuàng)建對(duì)象的代碼。


例如,您可能有如下方法:

public void doSomething(SomeObject obj) {
   // Do something to obj, assumes obj is not null
   obj.myMethod();}

在這種情況下,您不是在創(chuàng)建對(duì)象obj,而是假設(shè)它是在doSomething()調(diào)用方法之前創(chuàng)建的。注意,可以這樣調(diào)用方法:

doSomething(null);

在這種情況下,

在這種情況下,obj是null,語(yǔ)句obj.myMethod()將拋出一個(gè)NullPointerException。


如果該方法打算像上述方法一樣對(duì)傳入的對(duì)象執(zhí)行某些操作,則拋出是合適的,NullPointerException因?yàn)檫@是程序員錯(cuò)誤,程序員將需要該信息進(jìn)行調(diào)試。

// Throws an NPE with a custom error message if obj is null
Objects.requireNonNull(obj, "obj must not be null");


除了作為NullPointerException方法邏輯結(jié)果拋出的 s 之外,您還可以檢查方法參數(shù)的null值并通過(guò)在方法開(kāi)頭附近添加如下內(nèi)容來(lái)顯式拋出 NPE:


請(qǐng)注意,在您的錯(cuò)誤消息中清楚說(shuō)明哪個(gè)對(duì)象不能是很有幫助的null。驗(yàn)證這一點(diǎn)的好處是 1) 您可以返回自己更清晰的錯(cuò)誤消息,以及 2) 對(duì)于您知道的方法的其余部分,除非obj重新分配,否則它不為 null 并且可以安全地取消引用。


或者,在某些情況下,該方法的目的不僅僅是對(duì)傳入的對(duì)象進(jìn)行操作,因此 null 參數(shù)可能是可以接受的。在這種情況下,您需要檢查空參數(shù)并采取不同的行為。您還應(yīng)該在文檔中解釋這一點(diǎn)。例如,doSomething()可以寫(xiě)成:

/**
  * @param obj An optional foo for ____. May be null, in which case
  *  the result will be ____.
  */public void doSomething(SomeObject obj) {
    if(obj == null) {
       // Do something
    } else {
       // Do something else
    }}


最后,如何使用 Stack Trace 查明異常和原因

【可以使用哪些方法/工具來(lái)確定原因,以便您阻止異常導(dǎo)致程序過(guò)早終止?】

帶有 find bugs 的 Sonar 可以檢測(cè) NPE。 sonar能否動(dòng)態(tài)捕獲JVM引起的空指針異常


現(xiàn)在 Java 14 添加了一個(gè)新的語(yǔ)言特性來(lái)顯示 NullPointerException 的根本原因。自 2006 年以來(lái),此語(yǔ)言功能已成為 SAP 商業(yè) JVM 的一部分。


在 Java 14 中,以下是 NullPointerException 異常消息的示例:


【在線(xiàn)程“main”中 java.lang.NullPointerException:無(wú)法調(diào)用“java.util.List.size()”,因?yàn)椤發(fā)ist”為空】


NullPointerException導(dǎo)致 a發(fā)生的情況列表

NullPointerException以下是Java 語(yǔ)言規(guī)范直接*提到的所有發(fā)生 a 的情況:

  • 訪(fǎng)問(wèn)(即獲取或設(shè)置)空引用的實(shí)例字段。(靜態(tài)字段不算數(shù)!)

  • 調(diào)用空引用的實(shí)例方法。(靜態(tài)方法不算!)

  • throw null;

  • 訪(fǎng)問(wèn)空數(shù)組的元素。

  • 同步空 -synchronized (someNullReference) { ... }

  • NullPointerException如果其操作數(shù)之一是裝箱的空引用,則任何整數(shù)/浮點(diǎn)運(yùn)算符都可以?huà)伋?a

  • NullPointerException如果裝箱值為 null,則取消裝箱轉(zhuǎn)換將拋出 a 。

  • 調(diào)用super空引用會(huì)拋出一個(gè)NullPointerException如果您感到困惑,這是在談?wù)摵细竦某?lèi)構(gòu)造函數(shù)調(diào)用:

class Outer {
    class Inner {}}class ChildOfInner extends Outer.Inner {
    ChildOfInner(Outer o) { 
        o.super(); // if o is null, NPE gets thrown
    }}
  • 使用for (element : iterable)循環(huán)遍歷空集合/數(shù)組。

  • switch (foo) { ... }(無(wú)論是表達(dá)式還是語(yǔ)句)可以?huà)伋鲆粋€(gè)NullPointerExceptionwhen foois null。

  • foo.new SomeInnerClass()NullPointerException當(dāng)為空時(shí)拋出一個(gè)foo

  • 形式的方法引用name1::name2or primaryExpression::namethrows a NullPointerExceptionwhen evaluated when name1or primaryExpressionevaluates to null.

    JLS here 的一條注釋說(shuō),someInstance.someStaticMethod()不會(huì)拋出 NPE,因?yàn)樗?/span>someStaticMethod是靜態(tài)的,但someInstance::someStaticMethod仍然會(huì)拋出 NPE!


到此這篇關(guān)于什么是 NullPointerException,我該如何修復(fù)它?的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

原文地址:http://www.zghlxwxcb.cn/article/261.html

如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)聯(lián)系站長(zhǎng)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • PMP考試 I 我該如何高效準(zhǔn)備?

    PMP考試 I 我該如何高效準(zhǔn)備?

    可把PMP考試當(dāng)成一個(gè)項(xiàng)目,先規(guī)劃出此項(xiàng)目的生命周期,進(jìn)行嚴(yán)格的生命周期管理和階段治理工作,可簡(jiǎn)單分成3個(gè)階段(1個(gè)月每階段): 階段一:找到感覺(jué) 第一階段你需參加完成35個(gè)課時(shí)的PMP?培訓(xùn),是老師帶著你找PMBOK?指南所有知識(shí)領(lǐng)域的感覺(jué),注意一定要課前預(yù)習(xí)、課

    2024年02月08日
    瀏覽(24)
  • HTTP代理出現(xiàn)503錯(cuò)誤是什么意思,要如何修復(fù)?

    在使用HTTP代理的時(shí)候,我們常常會(huì)遇到各種問(wèn)題,想要解決,就需要根據(jù)返回碼來(lái)解決。今天我們來(lái)說(shuō)說(shuō),遇到HTTP?代理出現(xiàn)?503?服務(wù)不可用錯(cuò)誤要怎么辦,該如何解決呢? 首先,我們要明白,HTTP?代理出現(xiàn)503錯(cuò)誤,意味著代理服務(wù)器無(wú)法連接到目標(biāo)服務(wù)器或目標(biāo)服務(wù)器出

    2024年02月03日
    瀏覽(25)
  • 什么是HTTP500內(nèi)部服務(wù)器錯(cuò)誤,要如何修復(fù)

    HTTP 500內(nèi)部服務(wù)器錯(cuò)誤是指在服務(wù)器端處理請(qǐng)求時(shí)發(fā)生了錯(cuò)誤,導(dǎo)致無(wú)法完成請(qǐng)求并返回錯(cuò)誤信息。這種錯(cuò)誤通常由服務(wù)器端的程序錯(cuò)誤、數(shù)據(jù)庫(kù)連接問(wèn)題、權(quán)限問(wèn)題或配置問(wèn)題引起。下面將詳細(xì)介紹HTTP 500錯(cuò)誤的常見(jiàn)原因及解決方案。 1.服務(wù)器端程序錯(cuò)誤 如果服務(wù)器端程序

    2024年02月06日
    瀏覽(32)
  • 2023年測(cè)試崗,自動(dòng)化測(cè)試我該如何進(jìn)階?卷出方向...

    2023年測(cè)試崗,自動(dòng)化測(cè)試我該如何進(jìn)階?卷出方向...

    先編程語(yǔ)言打好基礎(chǔ) Python自動(dòng)化測(cè)試:https://www.bilibili.com/video/BV16G411x76E/ 語(yǔ)言選擇上Java或者Python都是可以的,可以先從Python入手,之后再開(kāi)始Java。在學(xué)習(xí)語(yǔ)言的過(guò)程中,一定要忘掉你是做測(cè)試的,把自己當(dāng)成開(kāi)發(fā),系統(tǒng)的去學(xué)相關(guān)的編程知識(shí),因?yàn)檎Z(yǔ)言水平的高低,很大程

    2023年04月26日
    瀏覽(22)
  • 計(jì)算機(jī)丟失msvcp110.dll是什么意思?如何修復(fù)?

    計(jì)算機(jī)丟失msvcp110.dll是什么意思?如何修復(fù)?

    在日常使用電腦的時(shí)候,有時(shí)候會(huì)遇到一些使用問(wèn)題。 比如,有一次遇到了這樣一個(gè)問(wèn)題。 那就是,因?yàn)椤癿svcp110.dll”這個(gè)文件丟失,有些軟件安裝不了。 計(jì)算機(jī)丟失msvcp110.dll是什么意思?該如何修復(fù)呢? ? 刪除文件:可能是因?yàn)檎`操作或病毒感染而導(dǎo)致文件被刪除。 損

    2024年02月12日
    瀏覽(157)
  • 在yolov5的detect中我該如何調(diào)用第三方攝像頭?

    要在 YOLOv5 的 detect 中調(diào)用第三方攝像頭,你可以使用 OpenCV 庫(kù)中的 VideoCapture 類(lèi)來(lái)讀取攝像頭的視頻流。 你可以這樣做: 首先,安裝 OpenCV 庫(kù)。 然后,在你的代碼中包含以下頭文件: 接下來(lái),創(chuàng)建一個(gè) VideoCapture 對(duì)象,用于獲取攝像頭的視頻流: 然后,打開(kāi)攝像頭,并檢查

    2024年02月12日
    瀏覽(24)
  • macos中回退鍵是Command+shift+z,我該如何改成Command+y?

    macos中回退鍵是Command+shift+z,我該如何改成Command+y?

    在使用 macOS 操作系統(tǒng)時(shí),回退鍵的默認(rèn)快捷鍵是 Command+Shift+Z。然而,對(duì)于一些用戶(hù)來(lái)說(shuō),這種組合鍵可能不太方便,因此他們希望將其改為其他組合鍵,例如 Command+Y。如果你也想更改回退鍵的快捷鍵,請(qǐng)按照以下步驟進(jìn)行操作。 操作如下,打開(kāi)系統(tǒng)設(shè)置-鍵盤(pán) ? m a c 技 巧

    2024年02月11日
    瀏覽(15)
  • 單元測(cè)試-java.lang.NullPointerException

    單元測(cè)試-java.lang.NullPointerException

    報(bào)錯(cuò)信息 java.lang.NullPointerException 空指針異常 空對(duì)象引用 來(lái)源 對(duì) Controller 層進(jìn)行單元測(cè)試,解決完Spring上下文報(bào)錯(cuò)后繼續(xù)報(bào)錯(cuò)。 解決 在測(cè)試方法執(zhí)行前要 為字段完成對(duì)象的注入 ,否則就報(bào)空指針異常。 測(cè)試?yán)?不完整啟動(dòng)Spring框架 完整啟動(dòng)Spring框架 避免手動(dòng)注入字段。

    2024年02月03日
    瀏覽(24)
  • java.lang.NullPointerException: null

    java.lang.NullPointerException: null

    錯(cuò)誤提示的大意是:空指針異常。說(shuō)明報(bào)錯(cuò)位置缺少信息或者是數(shù)據(jù)對(duì)應(yīng)不上。 知道大概意思后現(xiàn)在開(kāi)始排查,點(diǎn)擊 Debug ,就是下圖的這個(gè)按鈕 ?然后根據(jù)前面提示的報(bào)錯(cuò)行,再打開(kāi)項(xiàng)目運(yùn)行。 ?接著看報(bào)錯(cuò)信息,它說(shuō)這個(gè)類(lèi)型等于null,但是查看該頁(yè)面,發(fā)現(xiàn)上述頁(yè)面沒(méi)有

    2024年02月15日
    瀏覽(17)
  • 上一任留下的 Eureka,我該如何提升她的性能和穩(wěn)定性(含數(shù)據(jù)比對(duì))?

    上一任留下的 Eureka,我該如何提升她的性能和穩(wěn)定性(含數(shù)據(jù)比對(duì))?

    開(kāi)篇:一次小小的技術(shù)討論 Aliware 周末的時(shí)候,和一位在國(guó)內(nèi)某互聯(lián)網(wǎng)公司負(fù)責(zé)運(yùn)維的朋友聊天,由于工作相關(guān),剛好聊到了公司項(xiàng)目中微服務(wù)架構(gòu)這塊的一些問(wèn)題,他們公司的微服務(wù)架構(gòu)使用的是業(yè)界比較常用的 Spring Cloud Netflix 那一套作為底座,有專(zhuān)門(mén)的同學(xué)負(fù)責(zé)運(yùn)維一套

    2024年02月04日
    瀏覽(19)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包