在元素为Null的元素上使用get方法的2D数组是否有一种优雅的解决方案?

时间:2018-08-01 03:47:33

标签: java arrays arraylist multidimensional-array nullpointerexception

如何检查2D ArrayList中的元素是否为空,而没有空指针异常? 为了清楚起见,我将定义以下内容:

List<String> innerList = new ArrayList()<>;
List<List<String> outerList = new ArrayList()<>;

我想在外部列表上使用.get()拉内部列表。 问题是,一旦在null元素上使用.get()方法,它就会给出null指针异常。 我的目标是检查externalList中的元素是否为null(如果有),然后执行某些操作。如果不为null,请执行其他操作。我无法检查元素是否为null,因为我必须使用.get(),因为它是2D,这是我当前的问题。 示例代码:

List<List<String>> outerList = new ArrayList()<>;


    if(outerList.get(indexOfANullElement).isEmpty()){
        //do something...
    }

在对null元素使用.get()方法后,它将自动为我提供一个null指针。我不能包装它,因为我必须先用.get()引用辅助列表,该列表会自动返回null。

6 个答案:

答案 0 :(得分:1)

怎么了

List<String> innerList = outerList.get(index);
if (innerList == null)

含义:在检索到的列表上调用方法之前,可以轻松地检查它是否为null。

有关更多具体建议,我们将需要查看您的更多代码。

答案 1 :(得分:1)

由于primaryList.get(indexOfSecondayList) size 0 ,因此您从primaryList中得到了错误。因此,避免此错误的正确方法是

List<List<String>> outerList = new ArrayList()<>;

if (outerList.size() > 0) {
   List<String> innerList = outerList.get(index);
}

答案 2 :(得分:0)

对您的代码进行较小的修改,就像一个超级魅力

if(primaryList.get(indexOfSecondaryList) != null 
   && primaryList.get(indexOfSecondaryList).isEmpty()){
    //do something
}

答案 3 :(得分:0)

for循环不是必需的,但可以确保仅访问externalList的成员(如果存在)。

for (int i = 0; i < outerList.size(); i++) {
    List innerList = outerList.get(i);
    if (innerList != null)
        // rest of code    
}

答案 4 :(得分:0)

根据您的评论,我认为您将IndexOutOfBoundsExceptionNullPointerException混淆了。

List<String> samples = new ArrayList<>();
try {
    System.out.println(samples.get(0)); // throw IndexOutOfBoundsException 
} catch (IndexOutOfBoundsException e){
    e.printStackTrace();
}
Thread.sleep(200); // just wait for the err to print to the console first before the out
samples.add(null);
System.out.println(samples.get(0)); // works fine

因此,请考虑一下您的代码中,您可能想首先使用size检查列表的index

答案 5 :(得分:0)

从Java 8开始,有另一种处理null的方法:Optional。我们可以使用Optional.filter来检查不同的条件:

int index = 0;
Optional<List<String>> outerListElementAtIndex = Optional.of(outerList).filter(l -> l.size() > index).map(l -> l.get(index));

基本上,它会检查有关列表长度的索引是否有效。有了这样的Optinal,您可以通过相同的方式继续访问内部列表的元素:

int innerElementIndex = 0;
Optional<String> optionalString = outerListElementAtIndex.filter(l -> l.size() > index).map(l -> l.get(innerElementIndex));

我们可以将代码包装到一个辅助方法中:

public static <T> Optional<T> getOptionalElementAtIndexes(List<List<T>> list, int outerIndex, int innerIndex) {
    return Optional.of(list)
            .filter(l -> l.size() > outerIndex).map(l -> l.get(outerIndex))
            .filter(l -> l.size() > innerIndex).map(l -> l.get(innerIndex));
}

然后我们得到一行Optinal<String>

Optional<String> optionalString = getOptionalElementAtIndexes(outerList, outerIndex, innertIndex);

这样,只有当列表不是List且具有足够的元素时,我们才能确保获取任何null的元素。如您所问:这是“ 紧急解决方案”吗?