如何避免 java 中的空指针异常
How to avoid null pointer exception in java
我很想知道避免 NullPointerException
s 的正确方法。
try
{
String name = null;
System.out.println("name=" + name.toString());
}
catch(Exception e)
{
System.out.println("Exception Occured" + e.getMessage());
}
这里我只是捕获并显示异常消息。我想知道处理这种情况或避免这种情况的正确方法。
您能否详细说明避免 NPE 的意思?它可以通过多种方式完成。在您的情况下,您不应该将 null
传递到您的字符串中。
其他 SO 用户教给我的一般规则是 总是 尽早捕获 NPE(以避免在整个应用程序中造成附带损害)。
对于参数验证,您很可能需要使用 Objects#requireNonNull。
你也可以根据场景声明一个简单的if语句,像这样- if (name != null)
您还必须意识到,在某些情况下可能需要 null
,因此处理此类 NPE 会有所不同。如果您实际上不打算对 Exception
执行某些操作,则不应捕获它,因为捕获异常然后简单地丢弃它可能有害。
下面讨论什么时候应该抛出异常 - When to throw an exception?
经过进一步调查,似乎 Java 1.8 还提供了一个新的 Optional
class ( java.util.Optional ),这似乎非常有用且更清晰。看看这个Oracle document。
除了捕获错误之外,如果您要处理可能为空的内容,您可能需要进行空检查。
你可以做些什么来减少必须进行空检查的机会,永远不要从你的方法中 return null
,除非确实有必要,例如:
public IList<String> getUserNames()
{
//No usernames found...
return new ArrayList<String>();
//As opposed to returning null
return null;
}
通过 return 空列表,对上述代码的调用将导致如下结果:for(String name : this.getUserNames()) {...}
。如果没有找到用户名,循环将不会执行。
如果另一方面,您 return 为 null,则需要执行以下操作:
List<String> userNames = this.getUsernames();
if(userNames != null)
for(String userName : userNames) {....}
我很想知道避免 NullPointerException
s 的正确方法。
try
{
String name = null;
System.out.println("name=" + name.toString());
}
catch(Exception e)
{
System.out.println("Exception Occured" + e.getMessage());
}
这里我只是捕获并显示异常消息。我想知道处理这种情况或避免这种情况的正确方法。
您能否详细说明避免 NPE 的意思?它可以通过多种方式完成。在您的情况下,您不应该将 null
传递到您的字符串中。
其他 SO 用户教给我的一般规则是 总是 尽早捕获 NPE(以避免在整个应用程序中造成附带损害)。
对于参数验证,您很可能需要使用 Objects#requireNonNull。
你也可以根据场景声明一个简单的if语句,像这样- if (name != null)
您还必须意识到,在某些情况下可能需要 null
,因此处理此类 NPE 会有所不同。如果您实际上不打算对 Exception
执行某些操作,则不应捕获它,因为捕获异常然后简单地丢弃它可能有害。
下面讨论什么时候应该抛出异常 - When to throw an exception?
经过进一步调查,似乎 Java 1.8 还提供了一个新的 Optional
class ( java.util.Optional ),这似乎非常有用且更清晰。看看这个Oracle document。
除了捕获错误之外,如果您要处理可能为空的内容,您可能需要进行空检查。
你可以做些什么来减少必须进行空检查的机会,永远不要从你的方法中 return null
,除非确实有必要,例如:
public IList<String> getUserNames()
{
//No usernames found...
return new ArrayList<String>();
//As opposed to returning null
return null;
}
通过 return 空列表,对上述代码的调用将导致如下结果:for(String name : this.getUserNames()) {...}
。如果没有找到用户名,循环将不会执行。
如果另一方面,您 return 为 null,则需要执行以下操作:
List<String> userNames = this.getUsernames();
if(userNames != null)
for(String userName : userNames) {....}