web-dev-qa-db-fra.com

Java: Instructions Try/Catch: Alors qu'une exception est interceptée, répétez les instructions try?

Y a-t-il un moyen de faire ça?

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

Je pense que je peux utiliser scanner pour cela à la place, mais j'étais simplement curieux de savoir s'il y avait un moyen de répéter l'instruction try après avoir capturé une exception.

7
user2821275

Quelque chose comme ça ?

while(condition){

    try{

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

    }

}
7
Suresh Atta

Une solution consiste à utiliser une boucle while et à quitter lorsque le nom a été défini correctement.

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

    }
}
2
M K

Vous pouvez utiliser https://github.com/bnsd55/RetryCatch

Exemple:

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

Au lieu de new ExampleRunnable(), vous pouvez transmettre votre propre fonction anonyme.

1
bnsd55

Ceci est bien sûr un fragment de code simplifié car dans ce cas, je supprimerais simplement le try/catch au total - IOException n'est jamais levée. Vous pourriez obtenir une IndexOutOfBoundsException, mais dans votre exemple, elle ne devrait vraiment pas être traitée avec des exceptions.

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

EDIT: JOptionPane.showInputDialog peut renvoyer null qui n’était pas gérée auparavant. Également corrigé quelques fautes de frappe.

0
Axel

La signature de showInputDialog () est

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

et celui de split () est 

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

Aucun de alors jeter IOException. Alors comment l'attrapes-tu?

Quoi qu’il en soit, une solution possible à votre problème serait

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

Pas besoin d'essayer-attraper. essayé moi-même. Ça fonctionne bien.

0
Aniket Thakur

Serait-il possible d'utiliser une bibliothèque externe?

Si c'est le cas, consultez Failsafe .

Tout d’abord, vous définissez une stratégie RetryPolicy qui indique le moment où les tentatives doivent être effectuées:

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

Ensuite, vous utilisez votre RetryPolicy pour exécuter un Runnable ou Callable avec de nouvelles tentatives:

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

Vous avez besoin d'une récursion

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

Il suffit de mettre try..catch à l'intérieur de la boucle.

0
Michał Tabor

Il n'y a pas de "réessayer" dans la langue, comme d'autres l'ont déjà suggéré: créez une boucle while externe et définissez un indicateur dans le bloc "catch" qui déclenche la nouvelle tentative (et efface l'indicateur après un essai réussi)

0
Andreas_D