2

我只想知道当我从 catch 块调用方法时会发生什么,该方法负责抛出异常(抛出异常)。我很努力地搜索了它,但没有找到任何令人满意的答案......

例如。

public void A()
{
 try{
     //code which may throw exception
    }
 catch(Exception e)
  {
   A();
  }
}
4

8 回答 8

4

你试过了吗?在那里调用该方法与在任何地方调用它是一样的。如果它返回一个值,抛出一个异常,停止 JVM,或者其他什么,它会像在任何地方一样在那里工作。您正在做的是某种形式的递归,其中方法调用自身。当你这样做时,你必须有某种终止条件,否则它将永远继续调用自己,或者,因为你在 Java 中,直到你用完堆栈空间,当你会得到一个StackOverflowError

于 2013-01-28T06:52:34.723 回答
2

为什么要在引发异常的 catch 块中调用相同的方法?

它不断抛出异常,然后可能导致无限循环导致java堆空间错误。

您应该调用一个方法来处理该异常或对异常采取一些适当的步骤。

A()现在对于您的问题,您可以在 catch 块内调用您的方法内可访问的任何方法。

public void myMethod(){

}
public void A()
{
 try{
     //code which may throw exception
 }
 catch(Exception e)
 {
   myMethod();
 }
}
于 2013-01-28T06:56:37.200 回答
1

是的,代码将陷入无限循环。它一次又一次地抛出异常。

于 2013-02-20T06:32:38.463 回答
1
//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;
    }
}
于 2018-05-18T00:29:26.300 回答
0

这将导致无限循环。使用此代码:

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)
于 2013-01-28T06:52:50.267 回答
0

它将重新尝试该方法A()

但是,直到没有发生异常,这将继续重试。

除非Exception在这种情况下是临时的,否则这可能会导致无限循环。

A()可能最好的方法是在某些条件/超时时发出呼叫。

于 2013-01-28T06:56:24.960 回答
0

如果您希望该方法在捕获/抛出异常时执行特定任务,则必须在 catch 块中调用方法。示例:您可能想要打印发生异常的原因;)

于 2013-01-28T07:03:51.357 回答
0

我有类似的要求并尝试了这个

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){}
    }
}
于 2017-02-11T07:00:42.963 回答