在java中处理异常后执行剩余代码?
我可能很傻。但是我接受了采访,有人问我一个问题,关于在得到异常后如何运行剩余的代码 我给出了一些方法:在java中处理异常后执行剩余代码?,java,exception-handling,Java,Exception Handling,我可能很傻。但是我接受了采访,有人问我一个问题,关于在得到异常后如何运行剩余的代码 我给出了一些方法: 我们终于可以把代码写进去了 我们可以在catch块中编写代码。(他们不想处理这两种方法。) 我们可以使用throw关键字。但是我试过了,它不起作用 我也试着用这句话来解释他们 我引用了这么多帖子。但我的疑虑仍未消除 例如, public static void main(String[] args) { a(); // getting exception here...
public static void main(String[] args)
{
a(); // getting exception here...
b(); // This method should executed after handling exception
}
如果你能就此提出任何建议,这将是非常有帮助的。所以我可以理解。您需要在where或FINAL子句中执行方法
try {
a(); // getting exception here...
} catch(Exception e) {
b(); // This method should executed after handling exception
}
您需要在where或finally子句中执行方法
try {
a(); // getting exception here...
} catch(Exception e) {
b(); // This method should executed after handling exception
}
如果要执行b();只有在抛出异常时,才应该在catch(){}块上调用它。如果您想执行它,您可以将它放在finally{}或后面(请参见编辑)
- 如果b();是对异常的报复,或者您想使用try{}块内初始化的变量,您应该在finally{}上写它,如下所示:
try{ a(); } catch (Exception e){ e.printStackTrace(); //what to do if exception was thrown } finnaly { b(); } //you can also call b(); here instead of inside finnaly
- 如果b();用于处理异常,然后:
try{ a(); } catch (Exception e){ e.printStackTrace(); b(); }
try{
a();
} catch (Exception e){
e.printStackTrace(); //optional
}
b();
如果要执行b();只有在抛出异常时,才应该在catch(){}块上调用它。如果您想执行它,您可以将它放在finally{}或后面(请参见编辑)
- 如果b();是对异常的报复,或者您想使用try{}块内初始化的变量,您应该在finally{}上写它,如下所示:
try{ a(); } catch (Exception e){ e.printStackTrace(); //what to do if exception was thrown } finnaly { b(); } //you can also call b(); here instead of inside finnaly
- 如果b();用于处理异常,然后:
try{ a(); } catch (Exception e){ e.printStackTrace(); b(); }
try{
a();
} catch (Exception e){
e.printStackTrace(); //optional
}
b();
对我来说,在没有
try catch finally
的情况下,唯一简洁的方法可能是使用competable future
功能,并将每个功能的执行作为单独的任务分派。
像这样:
@Test
public void tryCatchFinallyWithCompletableFuture() throws Exception
{
CompletableFuture
.runAsync(
() -> a()
)
.exceptionally(
(e) -> { System.out.print(e.getMessage()); return null; }
)
.thenRun(
() -> b()
)
.get();
}
static void a() {
throw new IllegalStateException("a()");
}
static void b() {
System.out.println("...but we continue after a()");
}
不过,我会认真考虑在任何地方使用这种方法,但在一个游乐场项目。此外,您必须记住
a()
和b()
是在多线程上下文中执行的,如果存在共享状态,可能需要对共享状态进行同步。对我来说,在不使用try catch finally
的情况下,唯一简洁的方法可能是使用CompetableFuture
功能,并将每个功能的执行作为单独的任务分派。
像这样:
@Test
public void tryCatchFinallyWithCompletableFuture() throws Exception
{
CompletableFuture
.runAsync(
() -> a()
)
.exceptionally(
(e) -> { System.out.print(e.getMessage()); return null; }
)
.thenRun(
() -> b()
)
.get();
}
static void a() {
throw new IllegalStateException("a()");
}
static void b() {
System.out.println("...but we continue after a()");
}
不过,我会认真考虑在任何地方使用这种方法,但在一个游乐场项目。此外,您必须记住,
a()
和b()
是在多线程上下文中执行的,如果存在共享状态,则可能需要对其进行同步。如果您发现并处理了异常,您可以在try catch块之后运行b()
方法:
try {
a();
} catch(Exception e) {
handleMyError(e);
}
b();
通过这种方式执行
a()
方法,如果抛出异常,它将被抛出并隐藏在方法handleMyError(异常e)
中,然后执行继续到b()
,无论是否抛出异常。如果抛出异常并处理它,您可以运行b()
尝试捕捉块后的方法:
try {
a();
} catch(Exception e) {
handleMyError(e);
}
b();
通过这种方式执行
a()
方法,如果抛出异常,则在方法handleMyError(异常e)
中对其进行检查和隐藏,然后继续执行到b()
不管异常是否被抛出。@Stultuske OP说面试官不希望在try-catch或最终可能的副本中处理它,欢迎您在catch块结束后编写代码。您只需在try-catch
块后执行b()
方法即可。但这取决于需求。如果在catch
中也可以获得异常,并且无论如何都应该执行b()
,那么最后
块是唯一的选项。另外,在面试中,询问特殊要求通常是非常有用的,因为对于一个非特定的问题,你永远不会有一个完全合适的解决方案/答案。我试图解释以上两种方法,我们可以在catch块中编写方法调用,也可以在finally中编写方法调用。但是他们告诉他们不想要它。@Stultuske OP说面试官不希望它在try-catch或最终可能的副本中处理。欢迎您在catch块结束后编写代码。您可以在try-catch块之后执行b()
方法。但这取决于需求。如果在catch
中也可以获得异常,并且无论如何都应该执行b()
,那么最后
块是唯一的选项。另外,在面试中,询问特殊要求通常是非常有用的,因为对于一个非特定的问题,你永远不会有一个完全合适的解决方案/答案。我试图解释以上两种方法,我们可以在catch块中编写方法调用,也可以在finally中编写方法调用。但是他们告诉他们不想要它。不,他没有,因为他不允许使用try-catch不,他没有,因为他不允许使用try-catch不允许try-catch-allowed显然,使这个答案正确的单词是第二句末尾的“或在一切之后”。遗憾的是没有匹配的代码片段@