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 语句。

4

9 回答 9

9

像这样的东西?

while(condition){

    try{

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

    }

}
于 2013-09-26T05:24:37.810 回答
3

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

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

    }
}
于 2013-09-26T05:26:24.600 回答
1

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

于 2013-09-26T05:26:59.133 回答
1

使用外部库可以吗?

如果是这样,请查看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());
于 2018-03-29T11:54:56.480 回答
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()你可以传递你自己的匿名函数。

于 2018-09-08T13:38:22.737 回答
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);
}
于 2013-09-26T05:24:54.600 回答
0

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

于 2013-09-26T05:25:31.150 回答
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以前未处理的。还修正了一些错别字。

于 2013-09-26T05:34:32.320 回答
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);
}

不需要try-catch。我自己试过了。它工作正常。

于 2013-09-26T05:39:37.197 回答