系统运维系列 之java.lang.NullPointerException出现原因研究和解决方案分析
Posted 琅晓琳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统运维系列 之java.lang.NullPointerException出现原因研究和解决方案分析相关的知识,希望对你有一定的参考价值。
1 原因分析:
空指针异常都是因为调用null对象的方法,就是一个对象还没有没有正常初始化 就先调用它的方法;程序在使用或访问一个对象的引用时,而该对象等于null则被抛出。
2 场景分析:
2.1 接口类型的对象没有用具体的类初始化;
2.2 访问或修改一个null对象的字段或者求一个数组为null对象的长度或者访问或修改一个数组为null对象中的某一个值;
2.3 返回null,方法的返回值不要定义成为一般的类型,而是用数组。
3 Java中空格字符串" “,空字符串”",和null的区别:
3.1 " “空格字符串 此字符有对应的ASCII码,跟abcd什么的没有区别;
3.2 “”是一个空字符串,是个对象,长度为0在内存中分配一个空间,可以使用Object对象的方法,表示一个字符串对象引用的值为空,String a =”" 声明了一个字符串变量a,变量a的值为空;
3.3 null表示一个对象的值没有分配内存,调用null的字符串的方法会抛出空指针异常,null不是对象,String a=null声明了一个字符串变量a,变量a的引用为空,a没有指向任何的内存空间,在堆中也没有开辟任何的空间。
String str1="";
//创建一个字符串对象的默认值为""
String str2=new String();
String str3=null;
//str1和str2被实例化,而str3没有实例化,但str1和str2所指的地址不同,但值一样,都为空
System.out.println(str1==str1); //内存地址的比较,返回false
System.out.println(str1.equals(str2)); //值的比较,返回true
System.out.println(str2==str3); //内存地址的比较,返回false
System.out.println(str2.equals(str3)); //值的比较,返回false
System.out.println(str1==str3); //内存地址的比较,返回false
System.out.println(str1.equals(str3)); //值的比较,返回false
//空字符串的判断方法:
if(str1.equals(""))
System.out.println("str1是一个空字符串");
if(str1=="")
System.out.println("str1是一个空字符串");
if(str1.length()==0)
System.out.println("str1是一个空字符串");
if(str1.isEmpty())
System.out.println("str1是一个空字符串");
//Result:均输出str1是一个空字符串
if(str2.equals(""))
System.out.println("a、str2是一个空字符串");
//内存地址的比较,不相等,所有没有输出
if(str2=="")
System.out.println("b、str2是一个空字符串");
if(str2.length()==0)
System.out.println("c、str2是一个空字符串");
if(str2.isEmpty())
System.out.println("d、str2是一个空字符串");
//Result:输出a、c、d
if(str3==null)
System.out.println("str3是null字符串");
//解释:为什么null判断不用equals方法
//由于 null 不是对象,"" 是对象,所以比较的方式是==
//str3.equals(Object o),后面应该是对象
/*
if(str3.equals(null))
System.out.println("str3是null字符串");
//这里会报Exception in thread "main" java.lang.NullPointerException
*/
4 如何避免空指针异常:
4.1 优先使用String.valueOf()方法代替toString(),当程序代码需要对象的字符串表示形式时,请避免使用该对象的toString方法。如果你的对象的引用等于null,NullPointerException则会抛出,使用静态String.valueOf方法,该方法不会抛出任何异常并打印"null";
4.2 举例:
假如现在要对一个object对象判断:
//地址比较,永远也不会为false
if (!object =="")
//code
//值比较,如果object = null的情况下,程序将抛出NullPointerException异常
if(!object.equals(""))
//code
//修改:先加上object != null的条件
if(object!= null && !object.equals(""))
//code
OR:
if(!"".equals(object)&& !null.equals ) //将""写在前头,这样,不管object是否为null,都不会出错
//code
4.3 通过布尔表达式来判断,如果表达式结果为true,则返回value1,否则返回value2;可以使用三元运算符来处理空指针;
4.4 instanceof 即使对象的引用等于 null,也可以使用该运算符。在 instanceof 操作时,参考值等于为null,不抛出 NullPointerException,而是返回 false。
以上是关于系统运维系列 之java.lang.NullPointerException出现原因研究和解决方案分析的主要内容,如果未能解决你的问题,请参考以下文章