Java中处理空指针异常方式

一、那些情况会抛出NullPointerException

在Java语言在,null被分配给一个对象的引用以表示对象指向未知数据块。当应用程序使用或访问一个指向null的引用,会被抛出。
下列情况会抛出NullPointerException。
NullPointerException 是一个 RuntimeException,Javac编译器报错,执行时才会报错。
有以下几种情况会抛出空指针异常
1.调用null对象的方法。
2.访问或修改null对象的域。
3.如果null是一个数组,并获取null的长度。
4.如果null对象是一个对象数组,并访问会修改null对象的子元素。
5.如果对象是一个 Throwable值,并抛出null。
6.试图对null对象同步。

二、为什么要有null值

null是一个Java中的特殊情况,是特殊值。
一般来说,Null用在设计模式中,比如对象模式与单例模式。
1.在单例模式时确保只有一个类的实例被创建。并且提供一个该类的全局访问方法。
2.作为代理,在对象模式中提供一个对象作为缺少给定类型对象的代理。

三、如何避免空NullPointerException

使用时,要确保所有对象使用前被初始化。
当声明一个变量的引用时,就是在创建一个指向对象的指针,在使用该对象的方法或域之前,必须检验指针不为null值。
为了方便调试,在异常抛出时,提前添加异常处理机制,捕获异常,查看异常堆栈的信息。

1.带有字面值的字符串比较
 使用 固定字符串值 equals中放入对象,保证程序正常执行。
 例如:
 String str = null;
if(“Demo”.equals(str)) { }
2.检查一个方法的参数
参数传入后,判断是否为空值。如果为null,可以抛出IllegalArgumentException异常,来说明调用方法传入的参数有误。
例如:
public static int testDemo(String str) {
if (str == null)
throw new IllegalArgumentException(“The argument cannot be null”);
return s;
}
3.优先使用String.valueOf()而不是toString()
如果需要使用一个对象的字符串值,避免使用toString方法。如果你的对象的引用为null,NullPointerException将会被抛出。
要考虑使用静态方法String.valueOf(),该方法不会抛出任何异常并且在函数参数为null的情况下会打印null。
例如:
String str = null;
return str.valueOf();

4.创建返回空集合而不是null的方法
涉及返回结果为集合的形式,判断集合是否为空值。如果是空值,返回空集合对象。
例如:
public class getNumber{
private static List getNumbers = null;
public static List getList() {
if (getNumbers == null)
return Collections.emptyList();
else
return getNumbers;
}
}

5.使用三元运算符
三元运算符避免空指针格式:boolean expression ? value1:value2;
计算规则:首先,计算布尔表达式,如果表达式为true,value1被返回,否则value2被返回。我们能使用三元运算符来处理null指针,例如:
String getStr= (str = = null) ? “”: str.substring(0, 2);
如果str的引用时空对象,变量getStr将为空;如果str指向实际的数据,getStr将获取str的前2个字符。

6.使用contains(), containsKey(), containsValue() 方法
涉及Maps集合时,可以使用Map集合本身的判断空值方法,contains(), containsKey(), containsValue()。
例如,在验证某些键存在与Map中时,返回特定键的值。

7.使用外部类库
通过类库中定义的方法,确保返回的引用不为空值。

四、存在空指针不报错的情况

1.访问静态成员或类方法
当访问静态变量或一个类的方法,即使对象的引用是空的,虚拟机也不会报错。
原因是在编译过程中,Java编译器存储静态方法和域在特殊的位置。静态方法指向的是引用的地址。
例如:
class TestClass{
public static void printMessage() {
System.out.println(“hello my firend!”);
}
}
public class TestStaticDemo{
public static void main(String[] args) {
TestClass ts= null;
ts.printMessage();
}
}
一般情况下,当方法或域为静态时,应该以“静态”的方式来访问,即通过类名来访问。例如:TestClass.printMessage()
2. instanceof 操作符
当对象的引用为null时,instanceof 操作符返回false,不会抛出NullPointerException。
例如:
String testStr= null;
if(testStr instanceof String)
System.out.println(" testStr 是字符串!");
else
System.out.println(“testStr 不是字符串”);
输出结果:
testStr 不是字符串

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值