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.
Quelque chose comme ça ?
while(condition){
try{
} catch(Exception e) { // or your specific exception
}
}
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) {
}
}
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.
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.
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.
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());
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);
}
Il suffit de mettre try..catch à l'intérieur de la boucle.
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)