Java只在try和catch块中没有抛出异常时才运行代码?

j8ag8udp  于 2023-05-21  发布在  Java
关注(0)|答案(7)|浏览(240)

如何使代码只在没有抛出异常的情况下运行?
使用finally,无论是否有异常,代码都会运行。

try {
   //do something
} catch (Exception e) {}
//do something only if nothing was thrown
ecfsfe2w

ecfsfe2w1#

这里有两种方法:

try {
    somethingThatMayThrowAnException();
    somethingElseAfterwards();
} catch (...) {
    ...
}

或者,如果你想让第二个代码块在try块之外:

boolean success = false;
try {
    somethingThatMayThrowAnException();
    success = true;
} catch (...) {
    ...
}
if (success) {
    somethingElseAfterwards();
}

您也可以将if语句放在finally块中,但是您的问题中没有足够的信息来判断这是否更可取。

gzjq41n4

gzjq41n42#

try {
    doSomething();
    doSomething2();
} catch (Exception e) {
    doSomething3();
}

在这个例子中,doSomething2()只有在doSomething()没有抛出异常时才会被执行。
如果doSomething()抛出异常,则doSomething2();将被跳过,执行将跳转到doSomething3();
还要注意,如果doSomething2();抛出异常,则将执行doSomething3()
如果没有抛出异常,则不会执行doSomething3();

l3zydbqr

l3zydbqr3#

把代码放在try块中。如果抛出异常,它将跳到catch块。如果没有抛出异常,代码将直接运行。

try {
    someMethodThatMayThrowException();
    codeThatShouldBeRunIfNoExceptionThrown();
} catch (Exception e) {...}
exdqitrt

exdqitrt4#

对建议的

try {
    somethingThatMayThrowAnException();
    somethingElseAfterwards();
} catch (...) {
    ...
}

从公认的答案。你应该做的是:

void foo() {
  try {
    doStuff();
  } catch (...) {
    handleException();
  }
}

对于那些没有接触过“干净代码思维”的人来说,上面的内容似乎有些矫枉过正。
但重点是你不想在一个方法中混合不同的抽象。换句话说:你没有一个try块,在同一个方法中,后面有更多的代码。
您要确保每个方法都包含一个直接的路径-您要避免任何使您的阅读流程复杂化的内容。一旦你习惯了编写和阅读这种类型的代码,你就会发现理解代码所花费的时间大大减少。

ljsrvy3e

ljsrvy3e5#

流控制的异常是一种不好的做法。如果你坚持的话,使用一个boolean变量。

boolean thrown = false;

try {
   //do something
} catch (Exception e) {
   thrown = true;
}

//do something only if nothing was thrown

if (!thrown) { 
    // do stuff
}
0wi1tuuw

0wi1tuuw6#

当我遇到这个问题时,我正试图解决这个问题,这里的答案帮助我思考并意识到,至少在我的特殊情况下,这是我应该问的错误问题。
我想创建这个方法,因为我已经在main()中做了,为了可移植性,我想在其他地方做。所以我复制了一个包含try/catch块的代码块。然而,事实证明,我根本不想复制catch块,因为如果Connection的创建失败,我只想完全失败。
现在看起来很明显,但我从来没有想在第一时间实际捕获异常。代码之所以存在是因为我复制并粘贴了它。因此,如果你发现自己问这个问题是因为你在一个try块中,你可能不会生成一个值,那么考虑一下,如果你只是想完全失败,不返回任何东西,那么这个额外的代码是不必要的。

doinxwow

doinxwow7#

在我看来,最干净的方法来解决这个问题,如果你不需要任何额外的功能,如果一个异常被引发,是返回。

try  {
    doSomthing();
}
catch (Exception e) {
    handleException();
    return;
}

onlyIfSuccess();

相关问题