當(dāng)應(yīng)用程序試圖null在需要對(duì)象的情況下使用時(shí)拋出。這些包括:
創(chuàng)新互聯(lián)公司是專(zhuān)業(yè)的興安網(wǎng)站建設(shè)公司,興安接單;提供成都做網(wǎng)站、成都網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行興安網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
為什么我們需要空值?
例如,最多創(chuàng)建一個(gè)類(lèi)實(shí)例的示例方法是將其所有構(gòu)造函數(shù)聲明為private,然后創(chuàng)建一個(gè)返回該類(lèi)的唯一實(shí)例的公共方法:
TestSingleton.java:
import java.util.UUID; class Singleton { private static Singleton single = null; private String ID = null; private Singleton() { /* Make it private, in order to prevent the creation of new instances of * the Singleton class. */ ID = UUID.randomUUID().toString(); // Create a random ID. } public static Singleton getInstance() { if (single == null) single = new Singleton(); return single; } public String getID() { return this.ID; } } public class TestSingleton { public static void main(String[] args) { Singleton s = Singleton.getInstance(); System.out.println(s.getID()); } }
在這個(gè)例子中,我們聲明了一個(gè)Singleton類(lèi)的靜態(tài)實(shí)例。該實(shí)例在該getInstance方法內(nèi)最多初始化一次。注意使用null啟用唯一實(shí)例創(chuàng)建的值。
如何避免NullPointerException
為了避免這種情況NullPointerException,請(qǐng)確保在使用它們之前,所有對(duì)象都已正確初始化。注意,當(dāng)你聲明一個(gè)引用變量時(shí),你真的創(chuàng)建了一個(gè)指向?qū)ο蟮闹羔?。在向?qū)ο笳?qǐng)求方法或字段之前,您必須驗(yàn)證指針是否為空。
另外,如果引發(fā)異常,請(qǐng)使用駐留在異常堆棧跟蹤中的信息。執(zhí)行的堆棧跟蹤由JVM提供,以啟用應(yīng)用程序的調(diào)試。找到捕獲異常的方法和行,然后確定哪個(gè)引用等于在特定行中為null。
在本節(jié)的其余部分中,我們將介紹一些處理上述例外的技術(shù)。但是,它們并沒(méi)有消除這個(gè)問(wèn)題,程序員在編寫(xiě)應(yīng)用程序時(shí)應(yīng)該小心。
1.字符串與文字的比較
應(yīng)用程序執(zhí)行代碼中的一個(gè)非常常見(jiàn)的情況涉及字符串變量和文字之間的比較。文字可以是一個(gè)字符串或Enum的元素。不要從空對(duì)象調(diào)用方法,而應(yīng)考慮從文字中調(diào)用它。例如,觀(guān)察以下情況:
String str = null; if(str.equals(“Test”)){ / *這里的代碼將不會(huì)被觸發(fā),因?yàn)闀?huì)拋出異常。* / }
上面的代碼片段會(huì)拋出一個(gè)NullPointerException。但是,如果我們從文字中調(diào)用方法,那么執(zhí)行流程通常會(huì)繼續(xù):
String str = null; if(“Test”.equals(str)){ / *正確的用例。不會(huì)拋出異常。* / }
2.檢查方法的參數(shù)
在執(zhí)行你自己的方法的主體之前,一定要檢查它的參數(shù)為空值。只有在正確檢查了參數(shù)后,才繼續(xù)執(zhí)行該方法。否則,您可以?huà)伋鲆粋€(gè)IllegalArgumentException并通知調(diào)用方法傳遞的參數(shù)有問(wèn)題。
例如:
public static int getLength(String s){ 如果(s == null) 拋出新的IllegalArgumentException(“參數(shù)不能為空”); return s.length(); }
3.優(yōu)先使用String.valueOf()方法代替toString()
當(dāng)您的應(yīng)用程序代碼需要對(duì)象的字符串表示形式時(shí),請(qǐng)避免使用該對(duì)象的toString方法。如果你的對(duì)象的引用等于null,NullPointerException則會(huì)拋出a。
相反,考慮使用靜態(tài)String.valueOf方法,該方法不會(huì)拋出任何異常并打印"null",以防函數(shù)的參數(shù)等于null。
4.使用三元運(yùn)算符
該ternary操作是非常有用的,可以幫助我們避免了NullPointerException。運(yùn)營(yíng)商的形式是:
布爾表達(dá)式?value1:value2;
首先,評(píng)估布爾表達(dá)式。如果表達(dá)式為true,則返回value1,否則返回value2。我們可以使用ternary運(yùn)算符來(lái)處理空指針,如下所示:
String message =(str == null)?"":str.substring(0,10);
如果str引用為空,則消息變量將為空。否則,如果str指向?qū)嶋H數(shù)據(jù),則消息將檢索它的前10個(gè)字符。
5.創(chuàng)建返回空集合而不是null的方法
一個(gè)非常好的技術(shù)是創(chuàng)建返回一個(gè)空集合的方法,而不是一個(gè)null值。你的應(yīng)用程序的代碼可以遍歷空集合并使用它的方法和字段,而不會(huì)拋出一個(gè)NullPointerException。例如:
Example.java
public class Example { private static List<Integer> numbers = null; public static List<Integer> getList() { if (numbers == null) return Collections.emptyList(); else return numbers; } }
6.使用Apache的StringUtils類(lèi)
Apache的Commons Lang是一個(gè)為java.langAPI 提供幫助工具的庫(kù),比如字符串操作方法。提供字符串操作的示例類(lèi)是StringUtils.java,它null靜靜地處理輸入字符串。
你可以使用StringUtils.isNotEmpty, StringUtils.IsEmpty和StringUtils.equals方法,以避免NullPointerException。例如:
if(StringUtils.isNotEmpty(str)){ System.out.println(str.toString()); }
7.使用contains(),containsKey(),containsValue()方法
如果您的應(yīng)用程序代碼使用集合,例如Maps考慮使用包含containsKey和containsValue方法。例如,在地圖中驗(yàn)證其存在之后,檢索特定鍵的值:
Map <String,String> map = ... ... String key = ... String value = map.get(key); 的System.out.println(value.toString()); //如果值為null,則會(huì)拋出異常。
在上面的代碼片段中,我們不檢查密鑰是否真的存在于內(nèi)部Map,因此返回的值可以是null。最安全的方法如下:
Map <String,String> map = ... ... String key = ... if(map.containsKey(key)){ String value = map.get(key); 的System.out.println(value.toString()); //不會(huì)拋出異常。 }
8.檢查外部方法的返回值
在實(shí)踐中使用外部庫(kù)是很常見(jiàn)的。這些庫(kù)包含返回引用的方法。確保返回的參考不是null。另外,請(qǐng)考慮閱讀該方法的Javadoc,以便更好地理解其功能和返回值。
9.使用斷言
斷言在測(cè)試代碼時(shí)非常有用,并且可以被使用,以避免執(zhí)行代碼片斷,從而導(dǎo)致錯(cuò)誤NullPointerException。Java斷言是用assert關(guān)鍵字實(shí)現(xiàn)的,并拋出一個(gè)AssertionError。
請(qǐng)注意,您必須顯式啟用JVM的斷言標(biāo)志,方法是使用–ea參數(shù)執(zhí)行該標(biāo)志。否則,斷言將被完全忽略。
使用Java斷言的示例示例如下:
public static int getLength(String s){ / *確保String不為null。* / assert(s!= null); return s.length(); }
如果您執(zhí)行上面的代碼段并傳遞一個(gè)空參數(shù)getLength,則會(huì)出現(xiàn)以下錯(cuò)誤消息:
Exception in thread "main" java.lang.AssertionError
最后,您可以使用測(cè)試框架Assert提供的類(lèi)jUnit。
10.單元測(cè)試
在測(cè)試代碼的功能和正確性時(shí),單元測(cè)試可能非常有用。花一些時(shí)間編寫(xiě)一些測(cè)試用例,驗(yàn)證NullPointerException應(yīng)用程序的代碼是否經(jīng)歷了特定的執(zhí)行流程,否則將引發(fā)no 。
現(xiàn)有的NullPointerException安全方法
1.訪(fǎng)問(wèn)類(lèi)的靜態(tài)成員或方法
當(dāng)你的代碼試圖訪(fǎng)問(wèn)靜態(tài)變量或類(lèi)的方法時(shí),即使對(duì)象的引用等于null,JVM也不會(huì)拋出一個(gè)NullPointerException。這是由于Java編譯器在編譯過(guò)程中將靜態(tài)方法和字段存儲(chǔ)在特殊位置。因此,靜態(tài)字段和方法不與對(duì)象相關(guān)聯(lián),而與類(lèi)的名稱(chēng)相關(guān)聯(lián)。
例如,下面的代碼不會(huì)拋出NullPointerException:
TestStatic.java:
class SampleClass { public static void printMessage(){ System.out.println(“Hello Java Geeks!”); } } public class TestStatic { public static void main(String [] args){ SampleClass sc = null; sc.printMessage(); } }
注意,盡管SampleClass等于的實(shí)例null將會(huì)被正確執(zhí)行。但是,對(duì)于靜態(tài)方法或字段,最好以靜態(tài)方式訪(fǎng)問(wèn)它們,比如SampleClass.printMessage()。
2.運(yùn)營(yíng)商的instanceof
instanceof即使對(duì)象的引用等于,也可以使用該運(yùn)算符null。在instanceof操作時(shí),參考值等于為null,不拋出一個(gè)返回false NullPointerException。例如,考慮下面的代碼片段:
String str = null; if(str instanceof String) System.out.println("It's an instance of the String class!"); else System.out.println("Not an instance of the String class!");
正如預(yù)期的那樣,執(zhí)行的結(jié)果是:
Not an instance of the String class!
這是一篇關(guān)于如何處理Java的教程N(yùn)ullPointerException。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
本文標(biāo)題:java.lang.NullPointerException如何處理空指針異常的實(shí)現(xiàn)
當(dāng)前地址:http://chinadenli.net/article0/giieoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)、定制開(kāi)發(fā)、商城網(wǎng)站、微信公眾號(hào)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)