webentwicklung-frage-antwort-db.com.de

Java: Try/Catch-Anweisungen: Wiederholen Sie try-Anweisungen, während die Ausnahme abgefangen wird?

Gibt es eine Möglichkeit, dies zu tun?

//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);

Ich glaube, ich kann stattdessen den Scanner verwenden, aber ich war nur neugierig, ob es eine Möglichkeit gibt, die try-Anweisung nach dem Auftreten einer Ausnahme zu wiederholen.

7
user2821275

Etwas wie das ?

while(condition){

    try{

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

    }

}
7
Suresh Atta

Eine Möglichkeit ist die Verwendung einer while-Schleife und das Beenden, wenn der Name richtig festgelegt wurde.

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

    }
}
2
M K

Sie können https://github.com/bnsd55/RetryCatch verwenden.

Beispiel:

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());

Anstelle von new ExampleRunnable() können Sie Ihre eigene anonyme Funktion übergeben.

1
bnsd55

Dies ist sicher ein vereinfachtes Codefragment, denn in diesem Fall würde ich einfach den try/catch ganz entfernen - IOException wird niemals ausgelöst. Sie könnten eine IndexOutOfBoundsException bekommen, aber in Ihrem Beispiel sollte es wirklich nicht mit Ausnahmen behandelt werden.

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);
}

BEARBEITEN: JOptionPane.showInputDialog gibt möglicherweise null zurück, das zuvor nicht behandelt wurde. Einige Tippfehler behoben.

0
Axel

Signatur von showInputDialog () ist

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

und das von split () ist 

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

Dann werfen Sie keine IOException. Wie fängst du es dann?

Auf jeden Fall wäre eine mögliche Lösung für Ihr Problem

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);
}

Kein Try-Catch nötig. habe es selbst probiert. Es funktioniert gut.

0
Aniket Thakur

Wäre es in Ordnung, externe lib zu verwenden?

Wenn ja, checke Failsafe .

Zunächst definieren Sie eine RetryPolicy, in der angegeben wird, wann Wiederholungen ausgeführt werden sollen:

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

Dann verwenden Sie Ihre RetryPolicy, um ein Runable oder Callable mit Wiederholungen auszuführen:

Failsafe.with(retryPolicy)
  .onRetry((r, f) -> fixScannerIssue())
  .run(() -> scannerStatement());
0
Stas

Sie brauchen eine Rekursion

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

Setzen Sie einfach try..catch in die Schleife.

0
Michał Tabor

Es gibt kein "Neuversuch" in der Sprache, wie bereits von anderen vorgeschlagen: Erstellen Sie eine äußere while-Schleife und setzen Sie im "catch" -Block ein Flag, das den Neuversuch auslöst (und ein Flag nach einem erfolgreichen Versuch löschen).

0
Andreas_D