Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 流程控制,实现替换方法列表_Java_Iterator_Nullpointerexception - Fatal编程技术网

Java 流程控制,实现替换方法列表

Java 流程控制,实现替换方法列表,java,iterator,nullpointerexception,Java,Iterator,Nullpointerexception,直接来自[http://docs.oracle.com/javase/tutorial/collections/interfaces/list.html] public static <E> void replace(List<E> list, E val, E newVal) { for (ListIterator<E> it = list.listIterator(); it.hasNext(); ) if (val == null

直接来自[http://docs.oracle.com/javase/tutorial/collections/interfaces/list.html]

public static <E> void replace(List<E> list, E val, E newVal) {
    for (ListIterator<E> it = list.listIterator(); it.hasNext(); )
        if (val == null ? it.next() == null : val.equals(it.next()))
            it.set(newVal); }
与集合迭代无关,而是仅在parameters方法中指定val参数


提前感谢您对上述内容的澄清。

该测试封装了两个不同的规则,用于在列表中查找val:

如果val为null,那么list元素必须为null,才能调用匹配,列表可以包含null值 如果val不为null,则val必须等于using.equals列表元素,才能有匹配项 如果尝试在val为null时计算val.equalslist.next,则会出现NullPointerException

该方法可以这样编写:

public static <E> void replace(List<E> list, E val, E newVal) {
    if (val == null) {
        for (ListIterator<E> it = list.listIterator(); it.hasNext(); )
            if (it.next() == null)
                it.set(newVal);
    } else {
        for (ListIterator<E> it = list.listIterator(); it.hasNext(); )
            if (val.equals(it.next()))
                it.set(newVal);
    }
}

该测试封装了在列表中查找val的两个不同规则:

如果val为null,那么list元素必须为null,才能调用匹配,列表可以包含null值 如果val不为null,则val必须等于using.equals列表元素,才能有匹配项 如果尝试在val为null时计算val.equalslist.next,则会出现NullPointerException

该方法可以这样编写:

public static <E> void replace(List<E> list, E val, E newVal) {
    if (val == null) {
        for (ListIterator<E> it = list.listIterator(); it.hasNext(); )
            if (it.next() == null)
                it.set(newVal);
    } else {
        for (ListIterator<E> it = list.listIterator(); it.hasNext(); )
            if (val.equals(it.next()))
                it.set(newVal);
    }
}

你对这里发生的事情的理解是绝对正确的:他们所讨论的特殊情况与空值检查参数有关,而不是列表的迭代

事实上,您可以将if语句移到循环之外,以获得效率稍高但可读性较差的解决方案:

if (val != null) {
    for (ListIterator<E> it = list.listIterator(); it.hasNext(); )
        if (val.equals(it.next()))
            it.set(newVal);
} else {
    for (ListIterator<E> it = list.listIterator(); it.hasNext(); )
        if (it.next() == null)
            it.set(newVal);
}

你对这里发生的事情的理解是绝对正确的:他们所讨论的特殊情况与空值检查参数有关,而不是列表的迭代

事实上,您可以将if语句移到循环之外,以获得效率稍高但可读性较差的解决方案:

if (val != null) {
    for (ListIterator<E> it = list.listIterator(); it.hasNext(); )
        if (val.equals(it.next()))
            it.set(newVal);
} else {
    for (ListIterator<E> it = list.listIterator(); it.hasNext(); )
        if (it.next() == null)
            it.set(newVal);
}

我很惊讶列表参数也没有显式检查null…@mre这是一个很好的注释!不必对列表中的元素进行null检查的原因是,contract of Object的equals方法显式允许传递null参数。查看javadoc以了解其他要求。我很惊讶列表参数也没有显式检查null…@mre这是一个很好的注释!不必对列表中的元素进行null检查的原因是,对象的contract的equals方法显式地允许传递null参数。查看javadoc以了解其他需求。