これを行う方法はありますか?
//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
}
}
1つの方法は、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()
の代わりに、独自の無名関数を渡すことができます。
外部ライブラリを使用しても大丈夫ですか?
もしそうなら、チェックアウト フェイルセーフ 。
最初に、再試行をいつ実行するかを表す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());
この場合、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
を返す可能性があります。また、いくつかのタイプミスを修正しました。
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);
}
トライキャッチの必要はありません。自分で試してみました。それはうまくいきます。
再帰が必要です
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」ブロックにフラグを設定します(試行が成功した後にフラグをクリアします)。