1. 程式人生 > >Java中的null和初始化

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

(p.toTest(number))

              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

truefalse

預設型別的作用?

剛開始我有一些不明白我們在使用變數的時候都指定了具體的型別,那麼要預設型別做什麼?

⑴進行型別轉換,當我們定義一個變數,然後對變數進行賦值,對於每個型別的資料,都有一個預設型別,例如數字,預設為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

[email protected]

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

(空格)()

文章如有問題,歡迎提出,謝謝.