Java:Try / Catch语句:捕获异常时,重复try语句? [重复]

问题描述 投票:7回答:9

这个问题在这里已有答案:

有没有办法做到这一点?

//Example function taking in first and last name and returning the last name.
public void lastNameGenerator() throws Exception{
    try {
        String fullName = JOptionPane.showInputDialog("Enter your full name");
        String lastName = fullName.split("\\s+")[1];
    catch (IOException e) {
        System.out.println("Sorry, please enter your full name separated by a space.")
        //Repeat try statement. ie. Ask user for a new string?
    }
    System.out.println(lastName);

我想我可以使用扫描仪代替这一点,但我很好奇是否有办法在捕获异常后重复try语句。

java exception exception-handling try-catch
9个回答
7
投票

像这样的东西?

while(condition){

    try{

    } catch(Exception e) { // or your specific exception

    }

}

2
投票

一种方法是使用while循环并在正确设置名称后退出。

boolean success = false;
while (!success) {
    try {
        // do stuff
        success = true;
    } catch (IOException e) {

    }
}

1
投票

你可以使用https://github.com/bnsd55/RetryCatch

例:

RetryCatch retryCatchSyncRunnable = new RetryCatch();
        retryCatchSyncRunnable
                // For infinite retry times, just remove this row
                .retryCount(3)
                // For retrying on all exceptions, just remove this row
                .retryOn(ArithmeticException.class, IndexOutOfBoundsException.class)
                .onSuccess(() -> System.out.println("Success, There is no result because this is a runnable."))
                .onRetry((retryCount, e) -> System.out.println("Retry count: " + retryCount + ", Exception message: " + e.getMessage()))
                .onFailure(e -> System.out.println("Failure: Exception message: " + e.getMessage()))
                .run(new ExampleRunnable());

你可以通过自己的匿名函数代替new ExampleRunnable()


0
投票

你需要一个递归

public void lastNameGenerator(){
    try {
        String fullName = JOptionPane.showInputDialog("Enter your full name");
        String lastName = fullname.split("\\s+")[1];
    catch (IOException e) {
        System.out.println("Sorry, please enter your full name separated by a space.")
        lastNameGenerator();
    }
    System.out.println(lastName);
}

0
投票

只需将try..catch放入while循环中即可。


0
投票

语言中没有“重新尝试”,就像其他人已经建议的那样:创建一个外部while循环并在“catch”块中设置一个触发重试的标志(并在成功尝试后清除标志)


0
投票

showInputDialog()的签名是

public static java.lang.String showInputDialog(java.lang.Object message)
                                       throws java.awt.HeadlessException

而split()的是

public java.lang.String[] split(java.lang.String regex)

然后没有扔IOException。那你怎么抓住它?

无论如何可能解决你的问题

public void lastNameGenerator(){
    String fullName = null;
    while((fullName = JOptionPane.showInputDialog("Enter your full name")).split("\\s+").length<2)  {
    }
    String lastName =  fullName.split("\\s+")[1];
    System.out.println(lastName);
}

不需要尝试捕获。自己试了一下。它工作正常。


0
投票

这肯定是一个简化的代码片段,因为在这种情况下我只是简单地删除try/catch - 永远不会抛出IOException。你可以得到一个IndexOutOfBoundsException,但在你的例子中,它确实不应该被例外处理。

public void lastNameGenerator(){
    String[] nameParts;
    do {
        String fullName = JOptionPane.showInputDialog("Enter your full name");
        nameParts = fullName != null ? fullName.split("\\s+") : null;
    } while (nameParts!=null && nameParts.length<2);
    String lastName = nameParts[1];
    System.out.println(lastName);
}

编辑:JOptionPane.showInputDialog可能会返回之前未处理过的null。还修了一些拼写错误。


0
投票

可以使用外部库吗?

如果是这样,请查看Failsafe

首先,定义一个RetryPolicy,表示何时应该执行重试:

RetryPolicy retryPolicy = new RetryPolicy()
  .retryOn(IOException.class)
  .withMaxRetries(5)
  .withMaxDuration(pollDurationSec, TimeUnit.SECONDS);

然后,使用RetryPolicy执行Runnable或Callable并重试:

Failsafe.with(retryPolicy)
  .onRetry((r, f) -> fixScannerIssue())
  .run(() -> scannerStatement());
© www.soinside.com 2019 - 2024. All rights reserved.