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 | 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
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 | (空格)(␠) |
文章如有问题,欢迎提出,谢谢.