Java中的null和初始化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ld3205/article/details/83175863

最近在学习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

com.dong.java8.TestE@299a06ac

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

(空格)()

 

文章如有问题,欢迎提出,谢谢.

 

 

 

 

猜你喜欢

转载自blog.csdn.net/ld3205/article/details/83175863