这个问题在这里已有答案:
有没有办法做到这一点?
//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语句。
像这样的东西?
while(condition){
try{
} catch(Exception e) { // or your specific exception
}
}
一种方法是使用while循环并在正确设置名称后退出。
boolean success = false;
while (!success) {
try {
// do stuff
success = true;
} catch (IOException e) {
}
}
你可以使用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()
。
你需要一个递归
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);
}
只需将try..catch放入while循环中即可。
语言中没有“重新尝试”,就像其他人已经建议的那样:创建一个外部while循环并在“catch”块中设置一个触发重试的标志(并在成功尝试后清除标志)
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
- 永远不会抛出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
。还修了一些拼写错误。
可以使用外部库吗?
如果是这样,请查看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());