導航:首頁 > 編程語言 > 空引用java

空引用java

發布時間:2022-12-21 10:42:03

A. java空指針引用!

空指針異常
空指針異常產生的主要原因如下:
(1) 當一個對象不存在時又調用其方法會產生異常
obj.method() // obj對象不存在
(2) 當訪問或修改一個對象不存在的欄位時會產生異常
obj.method() // method方法不存在

具體情況如下:
空指針錯誤( Java.lang.NullPointerException)
使用基本的Java數據類型,變數的值要麼已經是默認值,如果沒有對其正常賦值,程序便不能通過編譯,因此使用基本的Java數據類型(double,float,boolean,char,int,long)一般不會引起空指針異常。
由此可見,空指針異常主要跟與對象的操作相關。
下面先列出了可能發生空指針異常的幾種情況及相應解決方案:
情況一:不管對象是否為空就直接開始使用。
(JSP)代碼段1:
out.println(request.getParameter("username"));
描述:
代碼段1的功能十分簡單,就是輸出用戶輸入的表域"username"的值。
說明:
看上去,上面的語句找不出什麼語法錯誤,而且在大多數情況下也遇不到什麼問題。但是,如果某個用戶在輸入數據時並沒有提供表單域"username" 的值,或通過某種途徑繞過表單直接輸入時,此時request.getParameter("username")的值為空(不是空字元串,是空對象 null。),out對象的println方法是無法直接對空對象操作,因此代碼段1所在的JSP頁面將會拋出 "Java.lang.NullPointerException"異常。
情況二:即使對象可能為空時,也調用Java.lang.Object或Object對象本身的一些方法如toString(), equals(Object obj)等操作。
(JSP)代碼段2:
String userName = request.getParameter("username");
If (userName.equals("root"))
{....}
描述:
代碼段2的功能是檢測用戶提供的用戶名,如果是用戶名稱為"root"的用戶時,就執行一些特別的操作。
說明:
在代碼段2中,如果有用戶沒有提供表單域"username"的值時,字元串對象userName為null值,不能夠將一個null的對象與另一個對象直接比較,同樣,代碼段2所在的JSP頁面就會拋出(Java.lang.NullPointerException)空指針錯誤。
(JSP)代碼段3:
String userName = session.getAttribute
("session.username").toString();
描述:
代碼段3的功能是將session中session.username的值取出,並將該值賦給字元串對象 userName。
說明:
在一般情況下,如果在用戶已經進行某個會話,則不會出現什麼問題;但是,如果此時應用伺服器重新啟動,而用戶還沒有重新登錄,(也可能是用戶關閉瀏覽器,但是仍打開原來的頁面。)那麼,此時該session的值就會失效,同時導致session中的session.username的值為空。對一個為 null的對象的直接執行toString()操作,就會導致系統拋出(Java.lang.NullPointerException)空指針異常。

解決方案:

為了確保進行操作或引用的對象非空,假若我們要對某對象進行操作或引用,我們首先去檢查該對象是否已經實例化且不為空;並且在系統中加入針對對象為空時情況的處理。
如:採用String對象保存用戶提交的結果;在如果涉及對象的操作時,先檢測其是否為空後,檢查到對象為空後,可再選擇進行以下任一種處理方式:
處理方式 1) 檢查到對象為空時,設置對象值為空字元串或一個默認值;
處理方式 2) 檢測到對象為空時,根本不執行某操作,直接跳轉到其他處理中。
處理方式 3) 檢查到對象為空時,提示用戶操作有錯誤。
將代碼段2按以上方式進行改寫,得到:
方式1:
String userName = request.getParameter("username");
// 該變數值為空時,轉化為默認空字元串
If (userName == null)
userName = "";
If (userName.equals("root"))
{..........}
方式2:
String userName = request.getParameter("username");
// 該變數值為空時,轉化為默認空字元串,不執行有關操作。
If (usreName != null)
{
If (userName.equals("root"))
{..........}
}
方式3:
String userName = request.getParameter("username");
// 該變數值為空時,轉化為默認空字元串,不執行有關操作。
If (usreName == null)
{// 提示用戶輸入信息為空
}
實際中,上面提供到三種處理方式也同樣適用於其他異常的處理:
異常處理方式 1) 檢查到異常出現,設置對象值為空字元串或一個默認值;
異常處理方式 2) 檢測到異常出現,根本不執行某操作,直接跳轉到其他處理中。
異常處理方式 3) 檢查到異常出現,提示用戶操作有錯誤。

B. 什麼是null引用

null引用時Java對類類型變數的內存分配採取的方式,說明變數時,在內存中為其建立一個引用,並置初值null,表示不指向任何內存空間。然後,需要程序員用new申請相應的內存空間,其大小依class的定義而定,並將該段內存的首地址賦給剛才建立的引用

C. true,false,null是java關鍵字嗎它們在內存中究竟是以什麼值來存儲

樓上的請注意了,一個對象賦值成null再被調用會不出空指針異常么?請考慮清楚,別誤導人家!

作為關鍵字true,false,null都分別代表不同的含義。

"位"是內存中作為存儲數據的基本單位,而我們又通常說,一個位元組是8位,也就是 1byte = 8bit。

因為內存中,"位"是使用0和1來表示的,所以作為關鍵字,true的值在內存中就表示1,false在內存中就是表示0。

但是這里不要和整數(int)中的0和1相比,他們佔用的內存空間是不一樣的。一個int型的變數,佔用的內存空間是4個位元組,也就是4 * 8 = 32位,與true和false佔用的內存空間是不同的。

而作為關鍵字null,解釋起來就更是麻煩了。

當一個對象被聲明時(Object o;),這個對象會以一個整數的位元組數,只在內存堆棧(stack)中開辟一個內存指針。例如,我們使用Object o = new Object();實例化一個對象,那麼在內存中的運行則是:在內存堆棧(stack)中開辟一個4個位元組的指針,然後在內存堆區(heap)開辟這個對象所要存儲的數據並初始化,然後在將之前在stack中的內存指針中賦上在heap中開辟的空間的首地址。

而如果Object o;沒有進行實例化,則不可能使用o的引用。這時為了方便使用,則出現了null關鍵字。null關鍵字的意義也就是一個用來初始化對象的空引用。

D. null是不是對象(java)

Object
o
=
null;只是定義了一個object類的值為空引用
並沒有初始化
所以在內存中不指向任何對象。
Object
obj
=
new
Object();這時候初始化
obj才指向堆內存中值為空(null)的對象
這么說明白嗎?

E. Java中的null如何理解

null,int,float.....等這些用關鍵字表示的類型,都不屬於Object.
至於可以把null作為參數,只是特殊規定而已.
可以這么理解:
對象的引用代表的是一個內存的值,null是一個空引用,可以理解為內存的值為0;按這個意思對代碼進行一下轉換:
Object obj = new Object();
list.add(obj); ------> list.add(112);//把112看成內存地址.
list.add(null) ------> list.add(0);//null引用的值為0
如果在list.add方法裡面沒有對參數進行方法或屬性的調用,則程序正常運行;否則會報NullPointException.

F. 下面的代碼中的「NULL;」是什麼意思

NULL表示空指針,題中表示具有保留的值。

NULL是在計算中具有保留的值,用於指示指針不引用有效對象。程序通常使用空指針來表示條件,例如未知長度列表的結尾或未執行某些操作; 這種空指針的使用可以與可空類型和選項類型中的Nothing值進行比較。

空指針不應與未初始化的指針混淆:保證空指針與指向有效對象的任何指針進行比較。但是,根據語言和實現,未初始化的指針可能沒有任何此類保證。它可能與其他有效指針相等; 或者它可能比較等於空指針。它可能在不同的時間做兩件事。

(6)空引用java擴展閱讀

函數null用來求解零空間,即滿足方程組A*X=0的解空間。實際上是求出解空間的一組解(基礎解系)。

語法:z=null(A) %z的列向量為方程組的正交規范基,滿足z『 x z=I。

z=null(A,'r') %z的列向量是方程A*X=0的有理基。

java中的null是一個關鍵字,通常用來聲明一個空引用,Objecto=null;

表示對象o是一個空引用,如果程序員對它進行了引用,就會拋出一個NullPointerException異常。

G. java中null和'的區別

null和""的區別

問題一:

null和""的區別

String s=null;

string.trim()就會拋出為空的exception

String s="";

string.trim()就不會拋,為什麼?

答:

NULL代表聲明了一個空對象,根本就不是一個字元串。

""代表聲明了一個對象實例,這個對象實例的值是一個長度為0的空字元串。

NULL代表聲明了一個空對象,對空對象做任何操作都不行的,除了=和==

""是一個字元串了,只是這個字元串裡面沒有內容了

String s=null;只是定義了一個句柄,也就是說你有了個引用,但是這個引用未指向任何內存空間

String s="";這個引用已經指向了一塊是空字元串的內存空間,是一個實際的東東了,所以你可以對它操作,而不用擔心什麼了

你說數字0和沒有是不是一種概念啊??道理一樣的

而且,null可以賦值給任何對象.""就不行了.

這里""和NULL絕對是兩個概念

""代表一個字元串存在,它的值就是「」

NULL代表字元串根本沒有實際的值,你並不知道它是什麼。。。

哦,我明白了,意思就是String string = null 跟String string;是一回事兒

null是空對象 ""是空字元串

String s=null;//null是未分配堆內存空間

String a;//分配了一個內存空間,沒存入任何對象

String a="";//分配了一個內存空間,存了一個字元串對象

問題二:

String s;和String s=null;和String s="a";有什麼區別?

針對這三種情況,使用out.println(s);的時候,第一個會出現異常,第二個會輸出null.第三個則會輸出a.

這是為什麼呢?這三句聲明語句,各自作了什麼呢?

答:

第一個只是定義了一個String類型變數s,並沒有給它賦初值,在Java中,默認在使用一個變數的時候必須賦予它初值(降低風險)。

第二個和第三個都定義了String類型變數s,並賦予它初值,只不過第二個賦予的值為null(空)罷了

主要要理解的是String s; s為一個引用~~它不是對象

第一個是沒有初始化的引用;

第二個為空引用;

第三個是在字元串池裡寫入一個字元'a',然後用s指向它。

另外,

String s="a"和String s=new String("a");是有本質上的區別的

前者是在字元串池裡寫入一個字元'a',然後用s指向它;

後者是在堆上創建一個內容為"a"的字元串對象。

String str="aaa"; //於棧上分配內存

String str=new String("aaa"); //於堆上分配內存

String s; 系統會自動賦值null

String s;只是給s分配一個內存空間

String s=null;是分配的空間中存儲的值為空值

String s="a";這句就不用我多說了分配的空間的值為字元a

問題三:

聲明了一個string a;變數

在以後的判斷中,a==""和a==null有何不同?

答:

如果沒有給a賦過值,a==""會導致異常。

在實際處理時,往往認為""和null代表相同的含義,即都代表無值。

此時建議用如下語法:

if(a==null || a=="")

{

}

如果a為null,就不會執行後面的判斷,直接返回true。

null是用來判斷引用類型是否分配了存儲空間

""是針對字元串的;

string類型實際上是字元串指針,也即是一個引用類型

所以如果沒有給a賦過值,a==""會導致異常

所以if(a==null || a==""){}這種寫法也是正確的

問題四:

String abc=null;String abc="";String abc;三種寫法有什麼區別?

答:

1:創建一個空字元串對象,

2:創建一個字元串為空的字元串對象。

3:聲明一個字元串對象,但並沒有分配內存,而1,2已經分配了內存

對於最後一種表示,你不能if(abc==null),或者int length = abc.length();編譯的時候會提示可能沒有初始化.

String abc=null;

String abc="";

一般推薦使用第二種

第一種abc指向null,很多時候要判斷字元串是否為空時,容易漏掉這種情況,在調用String的相關方法的時候就會出錯

第二種則相對簡單,String的方法都可以用,判斷的時候也不會出錯

1) String abc=null;

2) String abc;

3)String a="";

4) String b="";

5) String c=new String("");

6) String d=new String("");

//1)等於2),和C語言不同,JAVA為安全原因不允許一個懸掛引用,沒有賦值的引用地址一律自動賦值為NULL,以防止訪問到任意內存

//3)和4)中,變數a和b將會指向同一內存地址(""的地址)

//5)和6)中,變數c和d不會指向同一地址,而是兩個""內容的地址,並且和a,b不同,實際上,3)和4)相當於new String("").intern().

//String類維護著一個字元串池,對於像3)和4)這樣的賦值方法,String會在這個池中查找字元串是否已經在池中,如果在,就直接指向該地址,

如果不在,生成一個實例放入池中再指向那個地址,可見對於同樣內容的字元串多次引用時3)4)的方法要比5)6)的方法剩內存,之所以這樣做,是

因為String是一個內容不可變的量,運用的是設計模式GOF.FlyWeight

但有個關鍵的一點,沒有人說到,這就是:

String s;在什麼情況下可以等同於String s=null;而在什麼情況下又不等同?!

考慮下面的代碼:

//StringTest.java

public class StringTest {

static String s; //*

public static void main(String[] args) {

//String s; //**

System.out.println(s);

}

}

編譯並運行上面的代碼,將列印null。

可見標有*號的行是自動初始化了的(s被自動初始化為null)。

而如果把標有**號的行取消注釋,代碼將不能通過編譯,這是因為這行定義的是本地變數,而本地變數是不會自動初始化的。

由此得出結論:

在成員變數的定義中,String s;等同於String s=null;

而在本地變數(方法變數)的定義中,String s;不等同於String s=null;,這時要使用s必須顯式地賦值。

這些雖然是小知識點,但在實際應用中很重要,也很容易被一些人忽視,特此提出。

還有一點要說明的是:

只要是在方法在中定義變數都要顯示賦初值,main()方法也不例外,而在方法之外編譯器回自動賦初值。

H. null表示什麼意思

Null是什麼意思

Null翻譯為空的。在計算機中常表示無結果,空值。是一種表示這個指標並不指向任何的對象的引用,它的元素只有零,Null是在計算中具有保留的值,用於指示指針不引用有效對象。

在JAVA:java中的null是一個關鍵字,通常用來聲明一個空引用,表示對象o是一個空引用,如果程序員對它進行了引用,就會拋出一個NullPointerException異常。

I. Java中的null是個什麼東西

一、null是代表不確定的對象

Java中,null是一個關鍵字,用來標識一個不確定的對象。因此可以將null賦給引用類型變數,但不可以將null賦給基本類型變數。

比如:int a = null;是錯誤的。Ojbect o = null是正確的。

Java中,變數的適用都遵循一個原則,先定義,並且初始化後,才可以使用。我們不能int a後,不給a指定值,就去列印a的值。這條對對於引用類型變數也是適用的。

有時候,我們定義一個引用類型變數,在剛開始的時候,無法給出一個確定的值,但是不指定值,程序可能會在try語句塊中初始化值。這時候,我們下面使用變數的時候就會報錯。這時候,可以先給變數指定一個null值,問題就解決了。例如:

Connection conn = null;
try {
conn = DriverManager.getConnection("url", "user", "password");
} catch (SQLException e) {
e.printStackTrace();
}

String catalog = conn.getCatalog();

如果剛開始的時候不指定conn = null,則最後一句就會報錯。

二、null本身不是對象,也不是Objcet的實例

null本身雖然能代表一個不確定的對象,但就null本身來說,它不是對象,也不知道什麼類型,也不是java.lang.Object的實例。
可以做一個簡單的例子:

//null是對象嗎? 屬於Object類型嗎?
if (null instanceof java.lang.Object) {
System.out.println("null屬於java.lang.Object類型");
} else {
System.out.println("null不屬於java.lang.Object類型");
}

結果會輸出:null不屬於java.lang.Object類型

三、Java默認給變數賦值

在定義變數的時候,如果定義後沒有給變數賦值,則Java在運行時會自動給變數賦值。賦值原則是整數類型int、byte、short、long的自動賦值為0,帶小數點的float、double自動賦值為0.0,boolean的自動賦值為false,其他各供引用類型變數自動賦值為null。
這個具體可以通過調試來看。

四、容器類型與null

List:允許重復元素,可以加入任意多個null。
Set:不允許重復元素,最多可以加入一個null。
Map:Map的key最多可以加入一個null,value欄位沒有限制。
數組:基本類型數組,定義後,如果不給定初始值,則java運行時會自動給定值。引用類型數組,不給定初始值,則所有的元素值為null。

五、null的其他作用

1、判斷一個引用類型數據是否null。 用==來判斷。
2、釋放內存,讓一個非null的引用類型變數指向null。這樣這個對象就不再被任何對象應用了。等待JVM垃圾回收機制去回收。

J. java中的null跟null有區別嗎

在代碼中:
1 //name可以為"",即:name == ""
2 //但是name不可以為null,即:name != null

下面是java中的null和""區別:

1 null和""的區別
2 問題一:
3 null和""的區別
4 String s=null;
5 string.trim()就會拋出為空的exception
6 String s="";
7 string.trim()就不會拋,為什麼?
8 答:
9 NULL代表聲明了一個空對象,根本就不是一個字元串。
10 ""代表聲明了一個對象實例,這個對象實例的值是一個長度為0的空字元串。
11
12 NULL代表聲明了一個空對象,對空對象做任何操作都不行的,除了=和==
13 ""是一個字元串了,只是這個字元串裡面沒有內容了
14
15 String s=null;只是定義了一個句柄,也就是說你有了個引用,但是這個引用未指向任何內存空間
16 String s="";這個引用已經指向了一塊是空字元串的內存空間,是一個實際的東東了,所以你可以對它操作,而不用擔心什麼了
17
18 你說數字0和沒有是不是一種概念啊??道理一樣的
19
20 而且,null可以賦值給任何對象.""就不行了.
21
22 這里""和NULL絕對是兩個概念
23 ""代表一個字元串存在,它的值就是「」
24 NULL代表字元串根本沒有實際的值,你並不知道它是什麼。。。
25
26 哦,我明白了,意思就是String string = null 跟String string;是一回事兒
27
28 null是空對象 ""是空字元串
29 String s=null;//null是未分配堆內存空間
30 String a;//分配了一個內存空間,沒存入任何對象
31 String a="";//分配了一個內存空間,存了一個字元串對象
32
33
34
35 問題二:
36 String s;和String s=null;和String s="a";有什麼區別?
37 針對這三種情況,使用out.println(s);的時候,第一個會出現異常,第二個會輸出null.第三個則會輸出a.
38 這是為什麼呢?這三句聲明語句,各自作了什麼呢?
39
40 答:
41 第一個只是定義了一個String類型變數s,並沒有給它賦初值,在Java中,默認在使用一個變數的時候必須賦予它初值(降低風險)。
42 第二個和第三個都定義了String類型變數s,並賦予它初值,只不過第二個賦予的值為null(空)罷了
43
44 主要要理解的是String s; s為一個引用~~它不是對象
45 第一個是沒有初始化的引用;
46 第二個為空引用;
47 第三個是在字元串池裡寫入一個字元'a',然後用s指向它。
48 另外,
49 String s="a"和String s=new String("a");是有本質上的區別的
50 前者是在字元串池裡寫入一個字元'a',然後用s指向它;
51 後者是在堆上創建一個內容為"a"的字元串對象。
52 String str="aaa"; //於棧上分配內存
53 String str=new String("aaa"); //於堆上分配內存
54
55 String s; 系統會自動賦值null
56
57 String s;只是給s分配一個內存空間
58 String s=null;是分配的空間中存儲的值為空值
59 String s="a";這句就不用我多說了分配的空間的值為字元a
60
61
62
63 問題三:
64 聲明了一個string a;變數
65 在以後的判斷中,a==""和a==null有何不同?
66
67 答:
68 如果沒有給a賦過值,a==""會導致異常。
69 在實際處理時,往往認為""和null代表相同的含義,即都代表無值。
70 此時建議用如下語法:
71 if(a==null || a=="")
72 {
73 }
74 如果a為null,就不會執行後面的判斷,直接返回true。
75
76 null是用來判斷引用類型是否分配了存儲空間
77 ""是針對字元串的;
78 string類型實際上是字元串指針,也即是一個引用類型
79 所以如果沒有給a賦過值,a==""會導致異常
80 所以if(a==null || a==""){}這種寫法也是正確的
81
82
83 問題四:
84 String abc=null;String abc="";String abc;三種寫法有什麼區別?
85
86 答:
87 1:創建一個空字元串對象,
88 2:創建一個字元串為空的字元串對象。
89 3:聲明一個字元串對象,但並沒有分配內存,而1,2已經分配了內存
90 對於最後一種表示,你不能if(abc==null),或者int length = abc.length();編譯的時候會提示可能沒有初始化.
91
92
93 String abc=null;
94 String abc="";
95 一般推薦使用第二種
96 第一種abc指向null,很多時候要判斷字元串是否為空時,容易漏掉這種情況,在調用String的相關方法的時候就會出錯
97 第二種則相對簡單,String的方法都可以用,判斷的時候也不會出錯
98
99 1) String abc=null;
100 2) String abc;
101 3)String a="";
102 4) String b="";
103 5) String c=new String("");
104 6) String d=new String("");
105 //1)等於2),和C語言不同,JAVA為安全原因不允許一個懸掛引用,沒有賦值的引用地址一律自動賦值為NULL,以防止訪問到任意內存
106 //3)和4)中,變數a和b將會指向同一內存地址(""的地址)
107 //5)和6)中,變數c和d不會指向同一地址,而是兩個""內容的地址,並且和a,b不同,實際上,3)和4)相當於new String("").intern().
108 //String類維護著一個字元串池,對於像3)和4)這樣的賦值方法,String會在這個池中查找字元串是否已經在池中,如果在,就直接指向該地址,
109
110 如果不在,生成一個實例放入池中再指向那個地址,可見對於同樣內容的字元串多次引用時3)4)的方法要比5)6)的方法剩內存,之所以這樣做,是
111
112 因為String是一個內容不可變的量,運用的是設計模式GOF.FlyWeight
113
114
115
116
117 但有個關鍵的一點,沒有人說到,這就是:
118 String s;在什麼情況下可以等同於String s=null;而在什麼情況下又不等同?!
119 考慮下面的代碼:
120 //StringTest.java
121 public class StringTest {
122 static String s; //*
123 public static void main(String[] args) {
124 //String s; //**
125 System.out.println(s);
126 }
127 }
128 編譯並運行上面的代碼,將列印null。
129 可見標有*號的行是自動初始化了的(s被自動初始化為null)。
130 而如果把標有**號的行取消注釋,代碼將不能通過編譯,這是因為這行定義的是本地變數,而本地變數是不會自動初始化的。
131 由此得出結論:
132 在成員變數的定義中,String s;等同於String s=null;
133 而在本地變數(方法變數)的定義中,String s;不等同於String s=null;,這時要使用s必須顯式地賦值。
134 這些雖然是小知識點,但在實際應用中很重要,也很容易被一些人忽視,特此提出。
135 還有一點要說明的是:
136 只要是在方法在中定義變數都要顯示賦初值,main()方法也不例外,而在方法之外編譯器回自動賦初值。
137
138

閱讀全文

與空引用java相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:963
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:145
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:485
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:382
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:349
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163