每日一BUG NullPointerException

简介: 每日一BUG NullPointerException

每日一BUG NullPointerException

空指针: 指针只存在于c语言中,Java中是没有指针的,空指针就是空引用,java空指针异常就是引用本身为空,却调用了方法,这个时候就会出现空指针异常。可以理解,成员变量和方法是属于对象的(除去静态),在对象中才存在相对应的成员变量和方法,然后通过对象去调用这些成员变量和方法。对于空指针来说,它不指向任何对象,也就没有所谓的成员变量和方法,这个时候用它去调用某些属性和方法,当然会出现空指针异常。

什么情况下会发生

调用null对象的实例方法。

  • 访问或修改null对象的字段。
  • 把长度null当作一个数组。
  • 像访问或修改null阵列一样访问或修改插槽。
  • 投掷null就好像它是一个Throwable 价值。
  • 应用程序应该抛出此类的实例来指示null对象的其他非法使用。
  • NullPointerException对象可以由虚拟机构造,就像抑制被禁用和/或堆栈跟踪不可写一样。

如何避免NullPointerException

为了避免这种情况NullPointerException,请确保在使用它们之前,所有对象都已正确初始化。注意,当你声明一个引用变量时,你真的创建了一个指向对象的指针。在向对象请求方法或字段之前,您必须验证指针是否为空。

另外,如果引发异常,请使用驻留在异常堆栈跟踪中的信息。执行的堆栈跟踪由JVM提供,以启用应用程序的调试。找到捕获异常的方法和行,然后确定哪个引用等于在特定行中为null

在本节的其余部分中,我们将介绍一些处理上述例外的技术。但是,它们并没有消除这个问题,程序员在编写应用程序时应该小心。

1.字符串与文字的比较

应用程序执行代码中的一个非常常见的情况涉及字符串变量和文字之间的比较。文字可以是一个字符串或Enum的元素。不要从空对象调用方法,而应考虑从文字中调用它。例如,观察以下情况:

String str = null;
if(str.equals(“Test”)){
     / *这里的代码将不会被触发,因为会抛出异常。* /
}

上面的代码片段会抛出一个NullPointerException。但是,如果我们从文字中调用方法,那么执行流程通常会继续:

String str = null;
if(“Test”.equals(str)){
     / *正确的用例。不会抛出异常。* /
}

2.优先使用String.valueOf()方法代替toString()

当您的应用程序代码需要对象的字符串表示形式时,请避免使用该对象的toString方法。如果你的对象的引用等于null,NullPointerException则会抛出。

相反,考虑使用静态·方法,该方法不会抛出任何异常并打印"null",以防函数的参数等于null

3.创建返回空集合而不是null的方法

一个非常好的技术是创建返回一个空集合的方法,而不是一个null值。你的应用程序的代码可以遍历空集合并使用它的方法和字段,而不会抛出一个NullPointerException。例如:

public class Example {
     private static List<Integer> numbers = null;

     public static List<Integer> getList() {
          if (numbers == null)
               return Collections.emptyList();
          else
               return numbers;
     }
}

4.使用Apache的StringUtils类

ApacheCommons Lang是一个为java.langAPI提供帮助工具的库,比如字符串操作方法。提供字符串操作的示例类是StringUtils.java,它null静静地处理输入字符串。

你可以使用StringUtils.isNotEmpty,StringUtils.IsEmptyStringUtils.equals方法,以避免NullPointerException。例如:

if(StringUtils.isNotEmpty(str)){ 
     System.out.println(str.toString()); 
}

5.使用contains(),containsKey(),containsValue()方法

如果您的应用程序代码使用集合,例如Maps考虑使用包含containsKeycontainsValue方法。例如,在地图中验证其存在之后,检索特定键的值:

Map <String,String> map = ... 
... 
String key = ... 
String value = map.get(key); 
的System.out.println(value.toString());
//如果值为null,则会抛出异常。

在上面的代码片段中,我们不检查密钥是否真的存在于内部Map,因此返回的值可以是null。最安全的方法如下:

Map <String,String> map = ... 
... 
String key = ... 
if(map.containsKey(key)){ 
     String value = map.get(key); 
     的System.out.println(value.toString()); 
     //不会抛出异常。
}

简单测试

class SampleClass { 
     public static void printMessage(){ 
          System.out.println(“Hello Java Geeks!”); 
     } 
} 
public class TestStatic { 
     public static void main(String [] args){ 
          SampleClass sc = null; 
          sc.printMessage(); 
     } 
}

这么写有问题吗?😏

参考: https://me.csdn.net/qq_35376421

相关文章
Mockito框架抛出NullPointerException
一文详细讲解Mockito框架是怎么抛出NullPointerException的整个过程和解决方式。
6065 0
|
3月前
|
安全 Java 程序员
NullPointerException3-21
NullPointerException3-21
|
4月前
|
Java API
JDK版本特性问题之使用 ofNullable 方法来预防 NullPointerException,如何解决
JDK版本特性问题之使用 ofNullable 方法来预防 NullPointerException,如何解决
项目中常见NPE空指针异常
项目中常见NPE空指针异常
|
Java
如何优雅的避免Java中:NullPointerException(空指针异常)
如何优雅的避免Java中:NullPointerException(空指针异常)
117 0
|
前端开发
如何解决出现Unknown at rule @applyscss(unknownAtRules)警告?
如何解决出现Unknown at rule @applyscss(unknownAtRules)警告?
1187 0
|
SQL 前端开发 Java
开发小技巧系列 - 如何避免NullPointerException?(一)
NPE是JAVA界面的常见问题,如何来避免呢?
101 0
|
缓存 搜索推荐 Java
开发小技巧系列 - 如何避免NullPointerException?(二)
NPE问题处理之二,引入了optional来处理,还有空对象
89 0
|
Java 开发者
Java:Optional处理NullPointerException空指针异常的利器
Java:Optional处理NullPointerException空指针异常的利器
163 0
WARN FileInputDStream:87 - Error finding new filesjava.lang.NullPointerException报错为什么
WARN FileInputDStream:87 - Error finding new filesjava.lang.NullPointerException报错为什么
103 0