Java 从catch块调用方法

Java 从catch块调用方法,java,exception,try-catch,Java,Exception,Try Catch,我只是想知道当我从catch块调用一个方法时会发生什么 ,它负责引发异常(引发异常)。 我努力寻找,但没有找到任何令人满意的答案 例如 public void A() { try{ //code which may throw exception } catch(Exception e) { A(); } } 你试过了吗?在那里调用方法与在任何地方调用方法相同。如果它返回一个值,抛出一个异常,停止JVM,或者别的什么,它将在那里像在任何地方一样工作。您所做的

我只是想知道当我从catch块调用一个方法时会发生什么 ,它负责引发异常(引发异常)。 我努力寻找,但没有找到任何令人满意的答案

例如

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

你试过了吗?在那里调用方法与在任何地方调用方法相同。如果它返回一个值,抛出一个异常,停止JVM,或者别的什么,它将在那里像在任何地方一样工作。您所做的是某种形式的,其中一个方法调用自身。当你这样做的时候,你必须要有某种类型的,否则它会一直调用自己,或者,因为你在Java中,直到你的堆栈空间用完,当你得到一个?在那里调用方法与在任何地方调用方法相同。如果它返回一个值,抛出一个异常,停止JVM,或者别的什么,它将在那里像在任何地方一样工作。您所做的是某种形式的方法调用自己。当你这样做的时候,你必须有某种类型的,否则它会一直调用自己,或者,因为你在Java中,直到你的堆栈空间用完,当你得到一个。这将导致一个无限循环。使用此代码:

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)
线程“main”java.lang.StackOverflower中出现异常 位于java.lang.Exception。(Exception.java:66) 位于java.lang.RuntimeException。(RuntimeException.java:62) 运行(sandbox.java:11) 运行(sandbox.java:13) 运行(sandbox.java:13) 运行(sandbox.java:13)
这将导致无限循环。使用此代码:

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)
线程“main”java.lang.StackOverflower中出现异常 位于java.lang.Exception。(Exception.java:66) 位于java.lang.RuntimeException。(RuntimeException.java:62) 运行(sandbox.java:11) 运行(sandbox.java:13) 运行(sandbox.java:13) 运行(sandbox.java:13)
它将重新尝试方法
A()

但是,在未发生异常之前,将继续重新尝试

除非此场景中的
异常是临时异常,否则这可能会导致无限循环


可能最好的方法是在某些条件/超时时发出
a()
调用。

它将重新尝试方法
a()

但是,在未发生异常之前,将继续重新尝试

除非此场景中的
异常是临时异常,否则这可能会导致无限循环


最好的方法可能是在某些条件/超时时发出
a()
调用。

为什么要在抛出异常的catch块中调用相同的方法

如果继续抛出异常,则可能导致无限循环,从而导致java堆空间错误

您应该调用一个处理该异常的方法,或者为该异常采取一些适当的步骤

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

public void myMethod(){

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

为什么要在抛出异常的catch块中调用相同的方法

如果继续抛出异常,则可能导致无限循环,从而导致java堆空间错误

您应该调用一个处理该异常的方法,或者为该异常采取一些适当的步骤

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

public void myMethod(){

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

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

当捕获/抛出异常时,如果希望该方法执行特定任务,则必须在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){}
    }
}

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

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){}
    }
}

真奇怪。。。在我提交答案的同时,我的答案似乎被否决了。这是怎么回事?欢迎来到StackOverflow:)真奇怪。。。在我提交答案的同时,我的答案似乎被否决了。这是怎么回事?欢迎使用StackOverflow:)如果它总是抛出异常,那么它将是一个无限循环;)。。您不想这样做您可以在引发异常之前调用方法,以便在引发异常之前执行您想执行的操作。没有什么特别的事情会发生。bos仅仅点125 ke de goldy…如果它总是抛出异常,那么它将是一个无限循环;)。。您不想这样做您可以在引发异常之前调用方法,以便在引发异常之前执行您想执行的操作。没有什么特别的事情会发生,只要125分就可以了。。。