在Java中再次运行一段代码

在Java中再次运行一段代码,java,Java,我是一个Java初学者,遇到了一些麻烦。我有一个try-catch块,其中try部分尝试运行一段代码,如果try代码抛出任何类型的错误,catch部分则运行不同的代码。它看起来像: try { <code to try> } catch(Exception e) { <various variable reassignments> <run "try" code again> (what I don't know how to do)

我是一个Java初学者,遇到了一些麻烦。我有一个try-catch块,其中try部分尝试运行一段代码,如果try代码抛出任何类型的错误,catch部分则运行不同的代码。它看起来像:

try {
    <code to try>
} catch(Exception e) {
    <various variable reassignments>
    <run "try" code again>  (what I don't know how to do)
}
boolean run = true;
while(run)
{
    try
    {
        // do action
        run = false;
    }
    catch(Exception e)
    {
        // do whatever actions
        // when you want to break, set run = false
    }
}

我认为这涉及到某种循环,我对使用这种循环相当熟悉,但我不知道如何将其格式化以在这种情况下工作。

我认为您需要类似以下内容:

try {
    <code to try>
} catch(Exception e) {
    <various variable reassignments>
    <run "try" code again>  (what I don't know how to do)
}
boolean run = true;
while(run)
{
    try
    {
        // do action
        run = false;
    }
    catch(Exception e)
    {
        // do whatever actions
        // when you want to break, set run = false
    }
}

我想你想要的是:

try {
    <code to try>
} catch(Exception e) {
    <various variable reassignments>
    <run "try" code again>  (what I don't know how to do)
}
boolean run = true;
while(run)
{
    try
    {
        // do action
        run = false;
    }
    catch(Exception e)
    {
        // do whatever actions
        // when you want to break, set run = false
    }
}

您可以将整个try/catch块放入循环中,也可以从try-and-catch进行方法调用。请注意,如果使用循环,即使在更新变量值之后,如果每次抛出异常,也需要一些逻辑来防止无限循环

进行方法调用

使用循环


您可以将整个try/catch块放入循环中,也可以从try-and-catch进行方法调用。请注意,如果使用循环,即使在更新变量值之后,如果每次抛出异常,也需要一些逻辑来防止无限循环

进行方法调用

使用循环


如果成功,您可以中断循环,并在出现异常时保持循环:

while (true) {
    try {
         <code to try>
         break; // operations were successful, so leave the loop!
    } catch(Exception e) {
         <various variable reassignments>
         // do not break, i.e. run "try" code again
    }
}

如果成功,您可以中断循环,并在出现异常时保持循环:

while (true) {
    try {
         <code to try>
         break; // operations were successful, so leave the loop!
    } catch(Exception e) {
         <various variable reassignments>
         // do not break, i.e. run "try" code again
    }
}

您可以将整个try/catch封装到for/while循环中,该循环将在try成功运行时退出

while (true) {
    try {
         <code to try>
         //exit on success
           } catch(Exception e) {
                 <various variable reassignments>                 
                   }
 }

您可以将整个try/catch封装到for/while循环中,该循环将在try成功运行时退出

while (true) {
    try {
         <code to try>
         //exit on success
           } catch(Exception e) {
                 <various variable reassignments>                 
                   }
 }

这突出了一个小的架构问题

try/catch块中没有隐式循环:如果抛出异常,则尝试恢复

你能做的是,从最好的到最坏的:

将try代码放在一个方法中,该方法可以根据需要进行参数化,以便再次调用时其行为可以更改。然后在try和catch块中使用不同的参数调用该方法

请注意,在这种情况下,catch块中的调用可能会再次抛出相同的异常,您可能会认为该异常此时是不可恢复的

使用嵌套的try/catch块,可以在嵌套在catch块中的try块中改变try块的过程

这还可以,但可读性较差

但是,多个嵌套的try/catch块会严重降低可读性

将整个try/catch放在一个循环中,该循环的中断条件是在所有终止中定义的,否则您可能会永远循环并记录大量堆栈跟踪

这在理论上是可以接受的,但随着时间的推移,这通常是灾难的回报


这突出了一个小的架构问题

try/catch块中没有隐式循环:如果抛出异常,则尝试恢复

你能做的是,从最好的到最坏的:

将try代码放在一个方法中,该方法可以根据需要进行参数化,以便再次调用时其行为可以更改。然后在try和catch块中使用不同的参数调用该方法

请注意,在这种情况下,catch块中的调用可能会再次抛出相同的异常,您可能会认为该异常此时是不可恢复的

使用嵌套的try/catch块,可以在嵌套在catch块中的try块中改变try块的过程

这还可以,但可读性较差

但是,多个嵌套的try/catch块会严重降低可读性

将整个try/catch放在一个循环中,该循环的中断条件是在所有终止中定义的,否则您可能会永远循环并记录大量堆栈跟踪

这在理论上是可以接受的,但随着时间的推移,这通常是灾难的回报

您可以使用while循环对其进行包装,然后如果您没有获得success=true分配并获得catch部分,则进行编码,while循环将再次运行try-catch部分

例如:

boolean success = false;
while (!success) {
  try {
      <code to try>
      success = true;
      } catch(Exception e) {
        <various variable reassignments>
      }
}
您可以使用while循环对其进行包装,然后如果您没有获得success=true分配并获得catch部分,则进行编码,while循环将再次运行try-catch部分

例如:

boolean success = false;
while (!success) {
  try {
      <code to try>
      success = true;
      } catch(Exception e) {
        <various variable reassignments>
      }
}
重构到一个单独的方法中。叫它在里面,试着抓住。通过这种方式,您将获得类似于一次重试的效果。另一种选择是将整个try-catch放入while循环中,并使用一个变量控制重试次数,根据结果可以初始化不同的变量。

重构为一个单独的方法。叫它在里面,试着抓住。通过这种方式,您将获得类似于一次重试的效果。另一种方法是将整个try-catch放入while循环中,并使用一个变量控制要重试的次数,根据结果可以初始化不同的变量。

使用:

使用这种方法,故障保护会为您处理重试,并且在指定何时执行重试以及是否延迟时,为您提供了一定的灵活性 在重试之间。

使用:



通过这种方法,Failsafe可以为您处理重试,并且在指定何时执行重试以及是否在重试之间延迟方面,为您提供了一定的灵活性。

您可以将代码放在单独的方法中进行尝试,并在try块和catch块中调用它。查看while循环-将try-catch放在while循环中,并持续执行try-catch,直到它工作为止您需要反复尝试代码,直到没有异常为止?或者您对在catch块中运行一次代码感到满意吗?您可以将代码放在一个单独的方法中进行尝试,并在try块和catch块中调用它。查看while循环-将try-catch放在while循环中,并持续执行try-catch,直到它工作为止您需要反复尝试代码,直到没有异常为止?或者您对在catch块内运行一次代码感到满意吗?如果没有异常-无限循环?run的值可以在try块中更改,因此没有无限循环loop@sharonbn呜呜声。在try块中添加run=false。很好的捕捉。也可以使用whiletrue和break。@doublesharp我倾向于避免break,因为我经常使用的循环或开关的嵌套变得有问题。但是在这种情况下你当然是对的。如果没有异常-无限循环?run的值可以在try块中更改,因此没有无限循环loop@sharonbn呜呜声。在try块中添加run=false。很好的捕捉。也可以使用whiletrue和break。@doublesharp我倾向于避免break,因为我经常使用的循环或开关的嵌套变得有问题。但在这种情况下你当然是对的,而不是假的?你是认真的吗?对不起,睡眠不足,我很匆忙。最大的问题是如何在成功后退出,但这已经得到了其他答案,而这是错误的?你是认真的吗?抱歉睡眠不足,我很匆忙。最大的问题是如何在成功后退出,但这已经得到了其他方面的回答,但这导致在检测到一个错误后,我的捕获括号中的所有内容都会一遍又一遍地重复。对我来说,发布整个程序会更容易吗?这样你就可以看看问题出在哪里了?当然,这会有很大帮助!尽管我不相信它会一遍又一遍地运行,因为整个try块都被包装在这个循环中。因此,try中的部分将首先被重新执行,并且只有当且仅当再次发生相应的异常时才会出现catch块。而现实很少是个好主意。如果第一次和第二次出现故障,大多数情况下,这将是一个代价高昂的无限循环,什么也不做,最终一次又一次地用相同的错误淹没日志/控制台,在最坏的情况下,冻结您的计算机或免费使用cpu时间。异常是为了防止无意义的代码不执行您希望程序执行的操作,这或多或少是完全相反的,如果在第一个错误后错误更正不起作用,则在执行50次/infinte次后就不会起作用。当然,在此上下文中使用while true时,在某些情况下,异常处理代码肯定也应该包含break语句,即使只是作为备份。如果出现问题,您应该注意优雅地退出,而true本身并不擅长退出。它在一定范围内生成一定数量的随机数。试着在输入中输入一个非常大的数字或输入一个字母。这就是问题所在。很好,但这会导致catch括号中的所有内容在检测到一个错误后反复出现。对我来说,发布整个程序会更容易吗?这样你就可以看看问题出在哪里了?当然,这会有很大帮助!尽管我不相信它会一遍又一遍地运行,因为整个try块都被包装在这个循环中。因此,try中的部分将首先被重新执行,并且只有当且仅当再次发生相应的异常时才会出现catch块。而现实很少是个好主意。如果第一次和第二次出现故障,大多数情况下,这将是一个代价高昂的无限循环,什么也不做,最终一次又一次地用相同的错误淹没日志/控制台,在最坏的情况下,冻结您的计算机或免费使用cpu时间。异常是为了防止无意义的代码不执行您希望程序执行的操作,这或多或少是完全相反的,如果在第一个错误后错误更正不起作用,则在执行50次/infinte次后就不会起作用。当然,在此上下文中使用while true时,在某些情况下,异常处理代码肯定也应该包含break语句,即使只是作为备份。如果出现问题,您应该注意优雅地退出,而true本身并不擅长退出。它生成 在设定的范围内对一定数量的随机数进行排序。试着在输入中输入一个非常大的数字或输入一个字母。这就是问题所在。