检查 java 中的列表对象是否为空

Check whether list object is null in java

我正在使用 java 检查 List 对象是否 null。但是不知道是不是优化的方式

这是我的代码:

List<String> listSCBPLNewErrMsgs= new ArrayList<String>(Arrays.asList(SCBPL_NEW_ERRORMESSAGES.split("\$\@")));

上面一行本身抛出空指针异常

if(listSCBPLNewErrMsgs != null) <Right way?>

这将从配置中获取所有值。

现在,明天如果我更改配置条目,这应该不会抛出空指针异常

如果你想检查它是否为空,这是正确的方法(即使它永远不会为空),但是如果你只是想检查列表是否为空,那么你应该使用 isEmpty() 方法:

if(listSCBPLNewErrMsgs.isEmpty()) {/**/}

如果您的代码看起来您​​的 listSCBPLNewErrMsgs 对象不会为空。使用 listSCBPLNewErrMsgs.isEmpty();

测试它是否为空

您需要为 SCBPL_NEW_ERRORMESSAGES 添加空值检查。

if (SCBPL_NEW_ERRORMESSAGES != null && !SCBPL_NEW_ERRORMESSAGES.isEmpty()) {

在您的声明中,list 不能像您所做的那样为 null new ArrayList<String>。 所以不用担心空指针异常。


如果您想检查空列表。 那你可以试试isEmpty()方法。

if (SCBPL_NEW_ERRORMESSAGES != null && !SCBPL_NEW_ERRORMESSAGES.isEmpty()) {
    List<String> listSCBPLNewErrMsgs = new ArrayList<String>(Arrays.asList(SCBPL_NEW_ERRORMESSAGES.split("\$\@")));
    if (!listSCBPLNewErrMsgs.isEmpty()) {
        // Do something.
    }
}

如果 SCBPL_NEW_ERRORMESSAGES 为 null,则确实会抛出 NPE 异常,因为您将在 null 上使用 split 方法。

您可以先检查它是否不为空:

if (SCBPL_NEW_ERRORMESSAGES != null) {
      //Instantiate list
      //Optional isEmpty check
}

您将首先检查 SCBPL_NEW_ERRORMESSAGES 是否不为 null

然后您可以实例化您的列表并对新列表执行可选的isEmpty检查。

Java 中的 new 运算符 永远不会 return nullString#split.

也不行

但是,您可能想要检查的是列表是否为空:

if (listSCBPLNewErrMsgs.isEmpty()) {
    // do something
}

如果 SCBPL_NEW_ERRORMESSAGES 为空,代码仍然会失败。

假设 SCBPL_NEW_ERRORMESSAGES 有一些值或为空,拆分将 return 一个大小为 0 或更大的数组。将其从数组更改为列表将生成包含 0 个或更多元素的数组。

最后,复制构造函数将复制内容并将其分配给新列表。在所有场景下,除非SCBPL_NEW_ERRORMESSAGES上存在空指针,否则returned列表(listSCBPLNewErrMsgs)永远不会为空,最多为空,可以通过isEmpty() 方法调用。

根据您的评论,如果您在该行上得到一个 null 指针,那应该是因为 SCBPL_NEW_ERRORMESSAGES 为空。

试试这个:

List<String> listSCBPLNewErrMsgs = null;
if(SCBPL_NEW_ERRORMESSAGES != null) {
    listSCBPLNewErrMsgs= new ArrayList<String>(Arrays.asList(SCBPL_NEW_ERRORMESSAGES.split("\$\@")));
}
else {
    listSCBPLNewErrMsgs = new ArrayList<>();
}
if(SCBPL_NEW_ERRORMESSAGES != null)
  List<String> listSCBPLNewErrMsgs= new ArrayList<String>Arrays.asList(SCBPL_NEW_ERRORMESSAGES.split("\$\@")));

不需要大家说的listSCBPLNewErrMsgs != null

首先你必须检查 SCBPL_NEW_ERRORMESSAGES 是 null 还是空

if(!TextUtils.isEmpty(SCBPL_NEW_ERRORMESSAGES))

您必须同时检查列表是否为 null/empty。所以我更喜欢

if(listSCBPLNewErrMsgs != null && !listSCBPLNewErrMsgs.isEmpty()) {
}