电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

詳解Java中NullPointerException異常的原因詳解以及解決方法

瀏覽:69日期:2022-08-27 13:17:52

NullPointerException是當(dāng)您嘗試使用指向內(nèi)存中空位置的引用(null)時(shí)發(fā)生的異常,就好像它引用了一個(gè)對(duì)象一樣。

當(dāng)我們聲明引用變量(即對(duì)象)時(shí),實(shí)際上是在創(chuàng)建指向?qū)ο蟮闹羔槨?紤]以下代碼,您可以在其中聲明基本類型的整型變量x:

int x;x = 10;

在此示例中,變量x是一個(gè)整型變量,Java將為您初始化為0。當(dāng)您在第二行中將其分配給10時(shí),值10將被寫入x指向的內(nèi)存中。

但是,當(dāng)您嘗試聲明引用類型時(shí)會(huì)發(fā)生不同的事情。請(qǐng)使用以下代碼:

Integer num;num = new Integer(10);

第一行聲明了一個(gè)名為的變量num,但它不包含原始值。相反,它包含一個(gè)指針(因?yàn)轭愋虸nteger是一個(gè)引用類型)。既然你還沒(méi)有說(shuō)什么指向Java,它將它設(shè)置為null,意思是“ 我什么都沒(méi)有指向”。

在第二行中,new關(guān)鍵字用于實(shí)例化(或創(chuàng)建)Integer類型的對(duì)象,并為指針變量num分配此對(duì)象。您現(xiàn)在可以使用解引用運(yùn)算符.(點(diǎn))來(lái)引用對(duì)象。

在當(dāng)你聲明了一個(gè)變量,但是沒(méi)有創(chuàng)建一個(gè)對(duì)象,會(huì)發(fā)生Exception。如果您在創(chuàng)建num對(duì)象之前嘗試取消引用,則會(huì)得到一個(gè)NullPointerException。在最瑣碎的情況下,編譯器將捕獲問(wèn)題并讓您知道“num可能尚未初始化”,但有時(shí)您編寫的代碼不會(huì)直接創(chuàng)建對(duì)象。

例如,您可能使用了如下的方法:

public void doSomething(SomeObject obj) { //do something to obj}

在這種情況下,您沒(méi)有創(chuàng)建對(duì)象obj,而是假設(shè)它是在doSomething調(diào)用方法之前創(chuàng)建的。如果你像這樣調(diào)用方法:

doSomething(null);

在這種情況下obj為null。如果該方法旨在對(duì)傳入的對(duì)象執(zhí)行某些操作,則需要拋出異常,因?yàn)镹ullPointerException它是程序錯(cuò)誤,程序員將需要該信息用于調(diào)試的目的。

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

/** * @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 }}

我如何解決它?

所以你有一個(gè)NullPointerException。應(yīng)該如何解決?讓我們舉一個(gè)簡(jiǎn)單的例子,它拋出NullPointerException:

public class Printer { private String name; public void setName(String name) { this.name = name; } public void print() { printString(name); } private void printString(String s) { System.out.println(s + ' (' + s.length() + ')'); } public static void main(String[] args) { Printer printer = new Printer(); printer.print(); }}

標(biāo)識(shí)空值

第一步是確切地確定導(dǎo)致異常的值。為此,我們需要做一些調(diào)試。學(xué)習(xí)閱讀堆棧跟蹤很重要。這將顯示拋出異常的位置:

Exception in thread 'main' java.lang.NullPointerException at Printer.printString(Printer.java:13) at Printer.print(Printer.java:9) at Printer.main(Printer.java:19)

在這里,我們看到在第13行拋出異常(在printString方法中)。查看該行并通過(guò)添加日志記錄語(yǔ)句或使用調(diào)試器來(lái)檢查哪些值為空。我們發(fā)現(xiàn)它s是null,并且調(diào)用length方法會(huì)拋出異常。我們可以看到程序在s.length()方法中刪除時(shí)停止拋出異常。

追蹤這些值來(lái)自哪里

接下來(lái)檢查此值的來(lái)源。按照該方法的調(diào)用者,我們可以看到,s與傳遞printString(name)的print()方法,并this.name為空。

跟蹤應(yīng)設(shè)置這些值的位置

在哪里this.name設(shè)置?在setName(String)方法中。通過(guò)一些更多的調(diào)試,我們可以看到根本沒(méi)有調(diào)用此方法。如果調(diào)用該方法,請(qǐng)確保檢查調(diào)用這些方法的順序,并且在print方法之后不調(diào)用set 方法。

這足以為我們提供一個(gè)解決方案:在調(diào)用printer.setName()之前添加調(diào)用printer.print()。

其他修正

該變量可以具有默認(rèn)值(并且setName可以防止將其設(shè)置為null):

private String name = '';

任一print或printString方法可以檢查空,例如:

printString((name == null) ? '' : name);

或者您可以設(shè)計(jì)如下所示的類,以便name 始終具有非null值:

public class Printer { private final String name; public Printer(String name) { this.name = Objects.requireNonNull(name); } public void print() { printString(name); } private void printString(String s) { System.out.println(s + ' (' + s.length() + ')'); } public static void main(String[] args) { Printer printer = new Printer('123'); printer.print(); }}

到此這篇關(guān)于詳解Java中NullPointerException異常的原因詳解以及解決方法的文章就介紹到這了,更多相關(guān)Java NullPointerException異常內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 新能源汽车电机定转子合装机 - 电机维修设备 - 睿望达 | 曙光腾达官网-天津脚手架租赁-木板架出租-移动门式脚手架租赁「免费搭设」 | CCC验厂-家用电器|服务器CCC认证咨询-奥测世纪 | 西宁装修_西宁装修公司-西宁业之峰装饰-青海业之峰墅级装饰设计公司【官网】 | 户外健身路径_小区健身器材_室外健身器材厂家_价格-浩然体育 | 税筹星_灵活用工平台_企业财务顾问_财税法薪综合服务平台 | 识禅_对禅的了解,从这里开始 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | 招商帮-一站式网络营销服务|搜索营销推广|信息流推广|短视视频营销推广|互联网整合营销|网络推广代运营|招商帮企业招商好帮手 | 工业冷却塔维修厂家_方形不锈钢工业凉水塔维修改造方案-广东康明节能空调有限公司 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-沼河浸过滤器 | 「钾冰晶石」氟铝酸钾_冰晶石_氟铝酸钠「价格用途」-亚铝氟化物厂家 | 青岛代理记账_青岛李沧代理记账公司_青岛崂山代理记账一个月多少钱_青岛德辉财税事务所官网 | 日本细胞免疫疗法_肿瘤免疫治疗_NK细胞疗法 - 免疫密码 | 山东PE给水管厂家,山东双壁波纹管,山东钢带增强波纹管,山东PE穿线管,山东PE农田灌溉管,山东MPP电力保护套管-山东德诺塑业有限公司 | 预制舱-电力集装箱预制舱-模块化预制舱生产厂家-腾达电器设备 | 电动球阀_不锈钢电动球阀_电动三通球阀_电动调节球阀_上海湖泉阀门有限公司 | 硫酸钡厂家_高光沉淀硫酸钡价格-河南钡丰化工有限公司 | 细砂提取机,隔膜板框泥浆污泥压滤机,螺旋洗砂机设备,轮式洗砂机械,机制砂,圆锥颚式反击式破碎机,振动筛,滚筒筛,喂料机- 上海重睿环保设备有限公司 | 气动|电动调节阀|球阀|蝶阀-自力式调节阀-上海渠工阀门管道工程有限公司 | 「钾冰晶石」氟铝酸钾_冰晶石_氟铝酸钠「价格用途」-亚铝氟化物厂家 | 黄石东方妇产医院_黄石妇科医院哪家好_黄石无痛人流医院 | 机构创新组合设计实验台_液压实验台_气动实训台-戴育教仪厂 | 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 培训一点通 - 合肥驾校 - 合肥新亚驾校 - 合肥八一驾校 | 深圳公司注册-工商注册代理-注册公司流程和费用_护航财税 | 外贮压-柜式-悬挂式-七氟丙烷-灭火器-灭火系统-药剂-价格-厂家-IG541-混合气体-贮压-非贮压-超细干粉-自动-灭火装置-气体灭火设备-探火管灭火厂家-东莞汇建消防科技有限公司 | 成都中天自动化控制技术有限公司 | 培训中心-翰香原香酥板栗饼加盟店总部-正宗板栗酥饼技术 | 水稻烘干机,小麦烘干机,大豆烘干机,玉米烘干机,粮食烘干机_巩义市锦华粮食烘干机械制造有限公司 水环真空泵厂家,2bv真空泵,2be真空泵-淄博真空设备厂 | 找培训机构_找学习课程_励普教育| 玻璃钢格栅盖板|玻璃钢盖板|玻璃钢格栅板|树篦子-长沙川皖玻璃钢制品有限公司 | 低粘度纤维素|混凝土灌浆料|有机硅憎水粉|聚羧酸减水剂-南京斯泰宝 | 广东之窗网 | 雄松华章(广州华章MBA)官网-专注MBA/MPA/MPAcc/MEM辅导培训 | 济南电缆桥架|山东桥架-济南航丰实业有限公司 | 上海道勤塑化有限公司| 汽车整车综合环境舱_军标砂尘_盐雾试验室试验箱-无锡苏南试验设备有限公司 | 锂电混合机-新能源混合机-正极材料混料机-高镍,三元材料混料机-负极,包覆混合机-贝尔专业混合混料搅拌机械系统设备厂家 | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | 广东风淋室_广东风淋室厂家_广东风淋室价格_广州开源_传递窗_FFU-广州开源净化科技有限公司 |