我只想知道当我从 catch 块调用方法时会发生什么,该方法负责抛出异常(抛出异常)。我很努力地搜索了它,但没有找到任何令人满意的答案......
例如。
public void A()
{
try{
//code which may throw exception
}
catch(Exception e)
{
A();
}
}
你试过了吗?在那里调用该方法与在任何地方调用它是一样的。如果它返回一个值,抛出一个异常,停止 JVM,或者其他什么,它会像在任何地方一样在那里工作。您正在做的是某种形式的递归,其中方法调用自身。当你这样做时,你必须有某种终止条件,否则它将永远继续调用自己,或者,因为你在 Java 中,直到你用完堆栈空间,当你会得到一个StackOverflowError。
为什么要在引发异常的 catch 块中调用相同的方法?
它不断抛出异常,然后可能导致无限循环导致java堆空间错误。
您应该调用一个方法来处理该异常或对异常采取一些适当的步骤。
A()
现在对于您的问题,您可以在 catch 块内调用您的方法内可访问的任何方法。
public void myMethod(){
}
public void A()
{
try{
//code which may throw exception
}
catch(Exception e)
{
myMethod();
}
}
是的,代码将陷入无限循环。它一次又一次地抛出异常。
//Just add like while condition in your method
int count = 0;
int max-attempt = 5;
while(true) {
try {
// Some Code
// break out of loop, or return, on success
} catch (Exception e) {
// handle exception
if (++count >= max-attempt) throw e;
}
}
这将导致无限循环。使用此代码:
package com.sandbox;
public class Sandbox {
public static void main(String[] args) {
new Sandbox().run();
}
private void run() {
try {
throw new RuntimeException("A");
} catch (Exception e) {
run();
}
}
}
这是抛出的异常:
Exception in thread "main" java.lang.StackOverflowError
at java.lang.Exception.<init>(Exception.java:66)
at java.lang.RuntimeException.<init>(RuntimeException.java:62)
at com.sandbox.Sandbox.run(Sandbox.java:11)
at com.sandbox.Sandbox.run(Sandbox.java:13)
at com.sandbox.Sandbox.run(Sandbox.java:13)
at com.sandbox.Sandbox.run(Sandbox.java:13)
它将重新尝试该方法A()
但是,直到没有发生异常,这将继续重试。
除非Exception
在这种情况下是临时的,否则这可能会导致无限循环。
A()
可能最好的方法是在某些条件/超时时发出呼叫。
如果您希望该方法在捕获/抛出异常时执行特定任务,则必须在 catch 块中调用方法。示例:您可能想要打印发生异常的原因;)
我有类似的要求并尝试了这个
public void A(Boolean callingFromCatch)
{
if(!callingFromCatch){
try{
//code which may throw exception
}
catch(Exception e)
{
A(true);
}
}else{
try{
reloadPage();
//try again
}
catch(Exception e){}
}
}