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.
Etwas wie das ?
while(condition){
try{
} catch(Exception e) { // or your specific exception
}
}
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) {
}
}
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.
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.
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.
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());
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);
}
Setzen Sie einfach try..catch in die Schleife.
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).