每日一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类
Apache
的Commons Lang
是一个为java.langAPI
提供帮助工具的库,比如字符串操作方法。提供字符串操作的示例类是StringUtils.java
,它null
静静地处理输入字符串。
你可以使用StringUtils.isNotEmpty
,StringUtils.IsEmpty
和StringUtils.equals
方法,以避免NullPointerException
。例如:
if(StringUtils.isNotEmpty(str)){
System.out.println(str.toString());
}
5.使用contains(),containsKey(),containsValue()方法
如果您的应用程序代码使用集合,例如Maps考虑使用包含containsKey
和containsValue
方法。例如,在地图中验证其存在之后,检索特定键的值:
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