web-dev-qa-db-ja.com

Java:Try / Catchステートメント:例外がキャッチされている間、tryステートメントを繰り返しますか?

これを行う方法はありますか?

//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ステートメントを繰り返す方法があるかどうかだけが気になりました。

7
user2821275

このようなもの ?

while(condition){

    try{

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

    }

}
7
Suresh Atta

1つの方法は、whileループを使用して、名前が正しく設定されたら終了することです。

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

    }
}
2
M K

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()の代わりに、独自の無名関数を渡すことができます。

1
bnsd55

外部ライブラリを使用しても大丈夫ですか?

もしそうなら、チェックアウト フェイルセーフ

最初に、再試行をいつ実行するかを表す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());
1
Johnny

この場合、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
Axel

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
Aniket Thakur

再帰が必要です

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
Mohayemin

Try..catchをwhileループの中に入れるだけです。

0
Michał Tabor

他の人がすでに提案しているように、言語には「再試行」はありません。外側のwhileループを作成し、再試行をトリガーする「catch」ブロックにフラグを設定します(試行が成功した後にフラグをクリアします)。

0
Andreas_D