Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.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 即使在命中return语句后仍继续循环_Java_Loops_Throwable - Fatal编程技术网

Java 即使在命中return语句后仍继续循环

Java 即使在命中return语句后仍继续循环,java,loops,throwable,Java,Loops,Throwable,我有下面的方法,我想继续检查嵌套异常是否与IndexOutOfBoundsException匹配,除非嵌套异常与前一个相同 它似乎做了正确的事情,在我的测试中,第一个例外 类型为NullPointerException,因此将转到下一个。下一个异常是预期的IndexOutOfBoundsException 当这种情况发生时,我希望返回true,我希望它能使我脱离循环。 它似乎正在发生,正如我所预料的那样,我在“返回真实”上着陆。但在那之后,循环继续 我错过了什么。即使返回真值,它又是如何继续进行

我有下面的方法,我想继续检查嵌套异常是否与IndexOutOfBoundsException匹配,除非嵌套异常与前一个相同

它似乎做了正确的事情,在我的测试中,第一个例外 类型为NullPointerException,因此将转到下一个。下一个异常是预期的IndexOutOfBoundsException

当这种情况发生时,我希望返回true,我希望它能使我脱离循环。 它似乎正在发生,正如我所预料的那样,我在“返回真实”上着陆。但在那之后,循环继续

我错过了什么。即使返回真值,它又是如何继续进行的

public boolean test(Throwable throwable) {

    do {
        if(throwable instanceof IndexOutOfBoundsException) {
            return true; // I do land here thus expecting to get out of loop and this method.
        }
        this.test(throwable.getCause());
    } while (throwable.getCause() != throwable);

    return false;
}
针对它的测试模拟嵌套异常

@Test
void testWithNestedException() {
    NullPointerException nullPointerException = new NullPointerException();
    IndexOutOfBoundsException indexOutOfBoundsException = new IndexOutOfBoundsException();
    Throwable nestedException = nullPointerException.initCause(indexOutOfBoundsException);
    assertTrue(someClass.test(nestedException));
}

您正在混合递归和循环。在这里,更新正在测试的异常的简单循环应该可以做到这一点:

公共布尔测试可丢弃{ 可丢弃t=可丢弃; 做{ 如果IndexOutOfBoundsException的可丢弃实例{ 返回true; } t=t.getCause; }而t.getCause!=t; 返回false; }
您正在混合递归和循环。在这里,更新正在测试的异常的简单循环应该可以做到这一点:

公共布尔测试可丢弃{ 可丢弃t=可丢弃; 做{ 如果IndexOutOfBoundsException的可丢弃实例{ 返回true; } t=t.getCause; }而t.getCause!=t; 返回false; }
您正在使用此调用创建递归,并且不使用此调用的返回代码

this.test(throwable.getCause());
我想你想做:

throwable = throwable.getCause();

您正在使用此调用创建递归,并且不使用此调用的返回代码

this.test(throwable.getCause());
我想你想做:

throwable = throwable.getCause();

正如@Mureinik所指出的,您混合了递归和迭代,但两者都不正确。正确的递归版本应为:

public boolean test(Throwable throwable) {
    if (throwable == null) {
        return false;
    } else if (throwable instanceof IndexOutOfBoundsException) {
        return true;
    } else {
        return test(throwable.getCause());
    }
} 
在我看来,递归版本比迭代版本更容易理解,但其他人可能不同意


对于递归版本,存在一个理论问题,即嵌套足够深的异常可能导致堆栈溢出。要在实践中实现这一点,需要一些精心设计的代码,即不切实际的代码,因此忽略这一点应该是安全的。

正如@Mureinik所指出的,您将递归和迭代混合在一起,并且两者都不正确。正确的递归版本应为:

public boolean test(Throwable throwable) {
    if (throwable == null) {
        return false;
    } else if (throwable instanceof IndexOutOfBoundsException) {
        return true;
    } else {
        return test(throwable.getCause());
    }
} 
在我看来,递归版本比迭代版本更容易理解,但其他人可能不同意


对于递归版本,存在一个理论问题,即嵌套足够深的异常可能导致堆栈溢出。要在实践中实现这一点,需要一些精心设计的代码,即不切实际的代码,因此忽略这一点应该是安全的。

也许您对“返回”的作用感到困惑?它只终止当前正在执行的函数实例。由于此代码是递归的,因此终止一个级别会向外返回到下一个级别。它不会神奇地终止整个递归调用堆栈。此外,我认为我从未遇到过因其自身原因而导致的一次性调用。而Trowable.getCause!=可丢弃的@用户13784117感谢您的解释,现在就明白了也许您对“返回”的作用感到困惑?它只终止当前正在执行的函数实例。由于此代码是递归的,因此终止一个级别会向外返回到下一个级别。它不会神奇地终止整个递归调用堆栈。此外,我认为我从未遇到过因其自身原因而导致的一次性调用。而Trowable.getCause!=可丢弃的@user13784117感谢您的解释,立即获取不仅此代码正确,而且现在可以清楚地看到它的作用:确定链中的任何异常是否超出索引范围。在我看来,清晰性和正确性同样重要。这段代码不仅正确,而且现在可以清楚地看到它的作用:确定链中的任何异常是否超出索引范围。清晰与正确同样重要,我想。t.getCause是什么时候你从来没有错过吗?它们相等意味着在异常链中有一个循环。另一方面,有一个空指针异常在链的末尾等待。@user13784117一个Throwable实际上不可能是它自己的原因,至少根据initCause和getCause方法不是最终的;t、 初始因果关系;虽然我不建议这样做,但会起作用。@user13784117文档说这会导致一个非法的ArgumentException。尽管如此,我还是认为有人可以重写这些方法,并将行为更改为不符合。t.getCause是什么时候你从来没有错过吗?它们相等意味着在异常链中有一个循环。另一方面,有一个空指针异常等待在链的末尾。@user13784117一个Throwable实际上不可能是它自己的原因,至少根据initCause和getCause方法是这样的
不是最终的。在我看来,t=新的可丢弃的;t、 初始因果关系;虽然我不建议这样做,但会起作用。@user13784117文档说这会导致一个非法的ArgumentException。不过,我想还是有人可以重写方法,将行为更改为不符合。这相当于@Mureinik的回答,尽管从风格上来说,我更喜欢他引入局部变量。是的,我比他快了10秒-这相当于@Mureinik的答案,虽然从风格上来说,我更喜欢他引入局部变量-