Java中的null和初始化
最近在學習Java8的過程中,在寫行為引數化以及lambad表示式的例子中,一個將陣列中的偶數輸出儲存到一個ArrayList中,出現的問題?
具體程式碼如下:
package com.dong.java8;
import java.util.ArrayList;
public class testLambda2 {
public static void main(String[] args) {
int [] numbers = {1,2,3,4,5,6,7,8,9,10};
testLambda2 tdb2 =new testLambda2();
ArrayList results = tdb2.toPredicted(numbers, (int number) -> number % 2 == 0 );
System.out.println(results);
}
public ArrayList<Integer> toPredicted(int [] numbers,predicted p ) {
ArrayList result =null;
for (int number : numbers) {
if
result.add((Integer)number);
}
return result;
}
}
interface predicted{
boolean toTest(int number);
}
當執行這個函式的時候,會丟擲空指標異常?
經過幾次檢查,終於知道問題在於ArrayList result = null;但是這個操作時系統提示的初始化null,為什麼會報錯?
解決方法是: 改成 ArrayList result = new ArrayList();
引出問題:有關變數的初始化和null?
變數有基本型別和引用型別:
基本型別:byte,short ,int ,long ,float ,double,boolean,char
引用型別:String,陣列,物件;
如下表:
序號 |
資料型別 |
大小/位 |
封裝類 |
預設值 |
可表示資料範圍 |
1 |
byte(位) |
8 |
Byte |
0 |
-128~127 |
2 |
short(短整數) |
16 |
Short |
0 |
-32768~32767 |
3 |
int(整數) |
32 |
Integer |
0 |
-2147483648~2147483647 |
4 |
long(長整數) |
64 |
Long |
0 |
-9223372036854775808~9223372036854775807 |
5 |
float(單精度) |
32 |
Float |
0 |
1.4E-45~3.4028235E38 |
6 |
double(雙精度) |
64 |
Double |
0 |
4.9E-324~1.7976931348623157E308 |
7 |
char(字元) |
16 |
Character |
'\u0000'空字元(Null) |
0~65535 |
8 |
boolean |
8 |
Boolean |
flase |
true或false |
預設型別的作用?
剛開始我有一些不明白我們在使用變數的時候都指定了具體的型別,那麼要預設型別做什麼?
⑴進行型別轉換,當我們定義一個變數,然後對變數進行賦值,對於每個型別的資料,都有一個預設型別,例如數字,預設為int型別,字元,預設為char,布林值,預設值false;如果變數之間可以進行型別轉換,則不會報錯,如果不行,則會出錯;
⑵初始化變數: 類載入過程:載入,驗證,準備,解析,初始化,使用,解除安裝 ;
在準備階段:為類變數(static變數)分配記憶體並且設定該類變數的初始值即零值,這裡不包含用final修飾的static,因為final在編譯的時候就會分配了,同時這裡也不會為例項變數分配初始化。類變數會分配在方法區中,而例項變數是會隨著物件一起分配到Java堆中。
在初始化過程:初始化階段依舊是初始化類變數和其他資源,這裡將執行使用者的static欄位和靜態語句塊的賦值操作。這個過程就是執行類構造器方法的過程。
預設型別的預設值在類載入過程中會被使用;
null:任何引用物件都可以被賦值為null,但不可以將null賦給基本型別變數。當我們給一個引用物件賦值null, 實際在堆中是沒有為這個物件分配記憶體的,然後呼叫這個物件的方法時,自然而然的會丟擲空指標異常,因為沒有沒有啊。
那為什麼還要用null?
null本身雖然能代表一個不確定的物件,不是物件,也不知道什麼型別,也不是java.lang.Object的例項,當我們在建立一個物件時,無法給出確定的值時,我們下面使用變數的時候就會報錯,可以先給變數指定一個null值,問題就解決了.
例如
static int a ;
static int b = 0;
static Integer c = 0;
static Integer d = null;
static ArrayList axx = null;
static ArrayList ayy =new ArrayList();
static TestE te2 = null;
static TestE te = new TestE();
static String str = null;
static String str2 = new String();
static String str3 = new String(" ");
static String str4 = new String("null");
輸出為:
0
0
0
null
null
[]
null
null
ß什麼都木有
ß這裡有一個空格
null
當我們使用如下方法時,會丟擲空指標異常:
System.out.println(te2.getClass());
因為我們沒有在堆中給物件分配記憶體,只是定義了一個引用變數,這個引用變數指向null,null中當然沒有例項方法了,當我們訪問例項方法時,因為沒有建立真實的例項物件,所以是空指標異常;
而 例如:
ArrayList alist = new ArrayList();
ArrayList alist2 = null;
因此alist 就相當於只是一個引用變數而已,沒有任何物件
還有注意:null 和 空格 和 空字元的關係?
null代表一個不確定的物件;在Ascii中,它表示什麼都沒有,空字元
空格 代表一個char型別的字元,在Ascii中,它代表一個空格
ASCII控制字元
二進位制 |
十進位制 |
十六進位制 |
縮寫 |
可以顯示的表示法 |
名稱/意義 |
0000 0000 |
0 |
00 |
NUL |
␀ |
空字元(Null) |
ASCII可顯示字元
二進位制 |
十進位制 |
十六進位制 |
圖形 |
0010 0000 |
32 |
20 |
(空格)(␠) |
文章如有問題,歡迎提出,謝謝.