赞
踩
在Java中,null 作为一个特殊值被对象引用,用来表示该对象当前指向的是一块未知内存数据。然而NullPointerException
这个异常,则是程序在使用或访问一个对象的引用时,而该对象等于null则被抛出
(1)被调用方法的对象为null。
(2)访问或修改一个null对象的字段。
(3)求一个数组为null对象的长度。
(4)访问或修改一个数组为null对象中的某一个值。
(5)被抛出的值是null并且是一个Throwable的子类。
(6)当你用null对象进行synchronized代码块。
NullPointerException 是 RuntimeException 的子类,因此,Javac 编译器并不会强迫你使用 try-catch 代码块来捕获该异常
如前所述,null 是一种特殊的值。它在编码某些设计模式(如空对象模式和单例模式)时非常有用。
空对象模式提供了一个对象作为缺少给定类型对象的代理。
Singleton 模式确保只创建一个类的一个实例,并且旨在提供对象的全局访问点。
为了避免这种情况NullPointerExceptio
n,请确保在使用它们之前,所有对象都已正确初始化
注意,当你声明一个引用变量时,你真的创建了一个指向对象的指针,在向对象请求方法或字段之前,您必须验证指针是否为空。
另外,如果引发异常,请使用驻留在异常堆栈跟踪中的信息。执行的堆栈跟踪由JVM提供,以启用应用程序的调试。找到捕获异常的方法和行,然后确定哪个引用等于在特定行中为null。
1.字符串与文字的比较
应用程序执行代码中的一个非常常见的情况涉及字符串变量和文字之间的比较。文字可以是一个字符串或Enum的元素。不要从空对象调用方法,而应考虑从文字中调用它。
例如,观察以下情况:
String str = null;
if(str.equals(“Test”)){
/ *这里的代码将不会被触发,因为会抛出异常。* /
}
上面的代码片段会抛出一个NullPointerException。但是,如果我们从文字中调用方法,那么执行流程通常会继续:
String str = null;
if(“Test”.equals(str)){
/ *正确的用例。不会抛出异常。* /
}
IllegalArgumentException
并通知调用方法传递的参数有问题。public static int getLength(String s){
如果(s == null)
抛出新的IllegalArgumentException(“参数不能为空”);
return s.length();
}
优先使用String.valueOf()
方法代替toString()
当您的应用程序代码需要对象的字符串表示形式时,请避免使用该对象的toString
方法。如果你的对象的引用等于null
,NullPointerException
则会被抛出。
相反,考虑使用静态String.valueOf
方法,该方法不会抛出任何异常并打印"null",以防函数的参数等于null。
使用三元运算符
该 ternary 操作是非常有用的,可以帮助我们避免了NullPointerException
。
布尔表达式?value1:value2;
首先,评估布尔表达式。如果表达式为true,则返回value1,否则返回value2。我们可以使用ternary运算符来处理空指针,如下所示:
String message =(str == null)?"":str.substring(0,10);
如果str引用为空,则消息变量将为空。否则,如果str指向实际数据,则消息将检索它的前10个字符。
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;
}
}
使用 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());
}
contains()
,containsKey()
,containsValue()
方法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()); //不会抛出异常。
}
检查外部方法的返回值
在实践中使用外部库是很常见的。这些库包含返回引用的方法。确保返回的参考不是null。另外,请考虑阅读该方法的Javadoc,以便更好地理解其功能和返回值。
使用断言
断言在测试代码时非常有用,并且可以被使用,以避免执行代码片断,从而导致错误NullPointerException。Java断言是用assert关键字实现的,并抛出一个AssertionError
。
请注意,您必须显式启用JVM的断言标志,方法是使用–ea参数执行该标志。否则,断言将被完全忽略。
使用Java断言的示例示例如下:
public static int getLength(String s){
/ *确保String不为null。* /
assert(s!= null);
return s.length();
}
如果您执行上面的代码段并传递一个空参数 getLength,则会出现以下错误消息:
Exception in thread "main" java.lang.AssertionError
最后,您可以使用测试框架 Assert 提供的类 jUnit。
例如,下面的代码不会抛出NullPointerException:
TestStatic.java:
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();
}
}
注意,尽管SampleClass等于的实例null将会被正确执行。但是,对于静态方法或字段,最好以静态方式访问它们,比如SampleClass.printMessage()。
instanceof
instanceo
f即使对象的引用等于,也可以使用该运算符null。在instanceof
操作时,参考值等于为null,不抛出一个返回false NullPointerException。例如,考虑下面的代码片段:String str = null;
if(str instanceof String)
System.out.println("It's an instance of the String class!");
else
System.out.println("Not an instance of the String class!");
正如预期的那样,执行的结果是:
Not an instance of the String class!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。