尝试用 do while 循环捕捉
try catch with a do while loop
使用我的代码,我试图告诉用户输入不要输入字符串,直到用户输入整数,但是 运行 程序是无限的。
public static void main(String[] args) {
int age = 1;
Utilisateur utilisateur = new Utilisateur();
Scanner u = new Scanner(System.in);
System.out.println("Enter your Name: ");
utilisateur.setNom(u.nextLine());
System.out.println("Enter your Surname: ");
utilisateur.setPrenom(u.nextLine());
System.out.println("Enter your Matricule: ");
utilisateur.setMatricule(u.nextLine());
System.out.println("Enter your Sexe: ");
utilisateur.setSexe(u.nextLine());
do {
try {
System.out.println("Enter your Age: ");
utilisateur.setAge(u.nextInt());
System.out.println(utilisateur.detail());
age = 2;
} catch (Exception e) {
System.out.println("Enter a valid age ");
}
}
while (age == 1);
}
}
您应该在 catch 块中添加 u.nextLine();
以跳过在扫描器中输入的无效值。
好的,让我们先稍微清理一下代码。整个“年龄”变量有点奇怪。它似乎包含有关您是否已阅读年龄的一些状态。但这是一种布尔值,不是吗?因此,让我们牢记这一点重做代码。我首先将 do-while 更改为简单的 while,但之后我们可以将其改回原来的状态。此外,如果您喜欢法语,将“u”重命名为“keyboard”或“clavier”可能是个好主意。
public static void main(String[] args) {
Utilisateur utilisateur = new Utilisateur();
Scanner clavier = new Scanner(System.in);
System.out.println("Enter your Name: ");
utilisateur.setNom(clavier.nextLine());
System.out.println("Enter your Surname: ");
utilisateur.setPrenom(clavier.nextLine());
System.out.println("Enter your Matricule: ");
utilisateur.setMatricule(clavier.nextLine());
System.out.println("Enter your Sexe: ");
utilisateur.setSexe(clavier.nextLine());
boolean hasEnteredAge = false;
while(!hasEnteredAge) {
System.out.println("Enter your Age: ");
String ageInput = clavier.nextLine().trim(); // remove leading and trailing whitespace. " 21 " becomes "21".
try {
int age = Integer.parseInt(ageInput);
utilisateur.setAge(age);
System.out.println(utilisateur);
hasEnteredAge = true;
} catch (Exception e) {
System.out.println("Enter a valid age.");
}
}
}
}
请注意,我将变量移到了循环的开头,这是我们需要了解这一事实以及我们如何将其初始化为 false 的地方。我们现在必须在之后将其设置为真。
但我认为这里还有更多工作要做。我们有一堆印刷品,然后是输入。当然,这可以通过一种方法来实现,使它看起来更好一点?但在我们这样做之前,我们应该再看看循环。我们可以通过多种方式进行循环。我们可以做到
do {
System.out.println("Enter your Age: ");
String ageInput = clavier.nextLine().trim(); // remove leading and trailing whitespace. " 21 " becomes "21".
try {
int age = Integer.parseInt(ageInput);
utilisateur.setAge(age);
System.out.println(utilisateur);
break; // this means that we should exit the loop
} catch (Exception e) {
System.out.println("Enter a valid age.");
}
}while(true); // So if we ever get here, we're not done.
在这里,我们依靠休息来摆脱循环。这行得通,但我个人不喜欢它。不过,这不是 错误的 事情,所以我就把它留在里面。你也可以像旧的 do-while 循环一样使用它:
boolean hasEnteredAge = false;
do {
System.out.println("Enter your Age: ");
String ageInput = clavier.nextLine().trim(); // remove leading and trailing whitespace. " 21 " becomes "21".
try {
int age = Integer.parseInt(ageInput);
utilisateur.setAge(age);
System.out.println(utilisateur);
hasEnteredAge = true;
} catch (Exception e) {
System.out.println("Enter a valid age.");
}
} while (!hasEnteredAge);
不过,无论您选择哪个,都可以。
现在让我来解决打印行的问题并阅读:
如果添加一个接受提示的方法“prompt”和 returns 一个字符串,您可以像这样非常方便地简化它:
public class EnterNameHere {
private static Scanner clavier = new Scanner(System.in);
public static String prompt(String prompt) {
System.out.println(prompt);
return clavier.nextLine().trim();
}
// ... The rest is as before.
}
现在,部分阅读变得非常简单:
public static void main(String[] args) {
Utilisateur utilisateur = new Utilisateur();
utilisateur.setNom(prompt("Enter your Name: "));
utilisateur.setPrenom(prompt("Enter your surname: "));
utilisateur.setMatricule(prompt("Enter your matricule: "));
utilisateur.setSexe(prompt("Enter your sex: "));
一个重要的问题出现了:如果我们要对字符串输入执行此操作,为什么不对整数 (int) 输入也执行此操作?
我提议:
public static int promptInt(String prompt) {
String value = prompt(prompt);
try {
return Integer.parseInt(value);
} catch(NumberFormatException ignored) {
System.out.println("Invalid number: '" + value + "'");
return promptInt(prompt); // We try again!
}
}
请注意,请注意,如果调用方法 promptInt 不起作用,我们将打印一条错误消息并重试。这只会在它全部崩溃之前工作几百次,但这应该足够了。 (如果您不希望这种情况发生,您当然可以采用之前的 while 循环方法。)这种方法或函数多次调用自身直到工作完成的技巧称为“递归”,它同样强大就像循环一样。刚接触编程的人可能会感到困惑,但我认为这个例子很简单。如果不是,您可以简单地替换上面提到的整个循环。当然,有一个方法叫prompt,还有一个叫promptInt。为了避免混淆,我们将 prompt-method 重命名为 promptString,整个程序就变成了:
public class YourNameHere {
private static final Scanner clavier = new Scanner(System.in);
public static String promptString(String prompt) {
System.out.print(prompt);
return clavier.nextLine().trim();
}
public static int promptInt(String prompt) {
String value = promptString(prompt);
try {
return Integer.parseInt(value);
} catch(NumberFormatException ignored) {
System.out.println("Invalid number: '" + value + "'");
return promptInt(prompt); // We try again!
}
}
public static void main(String[] args) {
Utilisateur utilisateur = new Utilisateur();
utilisateur.setNom(promptString("Enter your Name: "));
utilisateur.setPrenom(promptString("Enter your surname: "));
utilisateur.setMatricule(promptString("Enter your matricule: "));
utilisateur.setSexe(promptString("Enter your sex: "));
utilisateur.setAge(promptInt("Enter your age: "));
System.out.println("You have created an utilisateur: " + utilisateur);
}
}
当然还要加上 Utilisateur 的定义。
我认为这是一种更简单的方法,通过创建为您完成无聊工作的方法,您可以阅读 main 方法中的代码并立即了解发生了什么。如果需要了解如何操作,可以上去看看helping prompt-methods
使用我的代码,我试图告诉用户输入不要输入字符串,直到用户输入整数,但是 运行 程序是无限的。
public static void main(String[] args) {
int age = 1;
Utilisateur utilisateur = new Utilisateur();
Scanner u = new Scanner(System.in);
System.out.println("Enter your Name: ");
utilisateur.setNom(u.nextLine());
System.out.println("Enter your Surname: ");
utilisateur.setPrenom(u.nextLine());
System.out.println("Enter your Matricule: ");
utilisateur.setMatricule(u.nextLine());
System.out.println("Enter your Sexe: ");
utilisateur.setSexe(u.nextLine());
do {
try {
System.out.println("Enter your Age: ");
utilisateur.setAge(u.nextInt());
System.out.println(utilisateur.detail());
age = 2;
} catch (Exception e) {
System.out.println("Enter a valid age ");
}
}
while (age == 1);
}
}
您应该在 catch 块中添加 u.nextLine();
以跳过在扫描器中输入的无效值。
好的,让我们先稍微清理一下代码。整个“年龄”变量有点奇怪。它似乎包含有关您是否已阅读年龄的一些状态。但这是一种布尔值,不是吗?因此,让我们牢记这一点重做代码。我首先将 do-while 更改为简单的 while,但之后我们可以将其改回原来的状态。此外,如果您喜欢法语,将“u”重命名为“keyboard”或“clavier”可能是个好主意。
public static void main(String[] args) {
Utilisateur utilisateur = new Utilisateur();
Scanner clavier = new Scanner(System.in);
System.out.println("Enter your Name: ");
utilisateur.setNom(clavier.nextLine());
System.out.println("Enter your Surname: ");
utilisateur.setPrenom(clavier.nextLine());
System.out.println("Enter your Matricule: ");
utilisateur.setMatricule(clavier.nextLine());
System.out.println("Enter your Sexe: ");
utilisateur.setSexe(clavier.nextLine());
boolean hasEnteredAge = false;
while(!hasEnteredAge) {
System.out.println("Enter your Age: ");
String ageInput = clavier.nextLine().trim(); // remove leading and trailing whitespace. " 21 " becomes "21".
try {
int age = Integer.parseInt(ageInput);
utilisateur.setAge(age);
System.out.println(utilisateur);
hasEnteredAge = true;
} catch (Exception e) {
System.out.println("Enter a valid age.");
}
}
}
}
请注意,我将变量移到了循环的开头,这是我们需要了解这一事实以及我们如何将其初始化为 false 的地方。我们现在必须在之后将其设置为真。
但我认为这里还有更多工作要做。我们有一堆印刷品,然后是输入。当然,这可以通过一种方法来实现,使它看起来更好一点?但在我们这样做之前,我们应该再看看循环。我们可以通过多种方式进行循环。我们可以做到
do {
System.out.println("Enter your Age: ");
String ageInput = clavier.nextLine().trim(); // remove leading and trailing whitespace. " 21 " becomes "21".
try {
int age = Integer.parseInt(ageInput);
utilisateur.setAge(age);
System.out.println(utilisateur);
break; // this means that we should exit the loop
} catch (Exception e) {
System.out.println("Enter a valid age.");
}
}while(true); // So if we ever get here, we're not done.
在这里,我们依靠休息来摆脱循环。这行得通,但我个人不喜欢它。不过,这不是 错误的 事情,所以我就把它留在里面。你也可以像旧的 do-while 循环一样使用它:
boolean hasEnteredAge = false;
do {
System.out.println("Enter your Age: ");
String ageInput = clavier.nextLine().trim(); // remove leading and trailing whitespace. " 21 " becomes "21".
try {
int age = Integer.parseInt(ageInput);
utilisateur.setAge(age);
System.out.println(utilisateur);
hasEnteredAge = true;
} catch (Exception e) {
System.out.println("Enter a valid age.");
}
} while (!hasEnteredAge);
不过,无论您选择哪个,都可以。 现在让我来解决打印行的问题并阅读:
如果添加一个接受提示的方法“prompt”和 returns 一个字符串,您可以像这样非常方便地简化它:
public class EnterNameHere {
private static Scanner clavier = new Scanner(System.in);
public static String prompt(String prompt) {
System.out.println(prompt);
return clavier.nextLine().trim();
}
// ... The rest is as before.
}
现在,部分阅读变得非常简单:
public static void main(String[] args) {
Utilisateur utilisateur = new Utilisateur();
utilisateur.setNom(prompt("Enter your Name: "));
utilisateur.setPrenom(prompt("Enter your surname: "));
utilisateur.setMatricule(prompt("Enter your matricule: "));
utilisateur.setSexe(prompt("Enter your sex: "));
一个重要的问题出现了:如果我们要对字符串输入执行此操作,为什么不对整数 (int) 输入也执行此操作? 我提议:
public static int promptInt(String prompt) {
String value = prompt(prompt);
try {
return Integer.parseInt(value);
} catch(NumberFormatException ignored) {
System.out.println("Invalid number: '" + value + "'");
return promptInt(prompt); // We try again!
}
}
请注意,请注意,如果调用方法 promptInt 不起作用,我们将打印一条错误消息并重试。这只会在它全部崩溃之前工作几百次,但这应该足够了。 (如果您不希望这种情况发生,您当然可以采用之前的 while 循环方法。)这种方法或函数多次调用自身直到工作完成的技巧称为“递归”,它同样强大就像循环一样。刚接触编程的人可能会感到困惑,但我认为这个例子很简单。如果不是,您可以简单地替换上面提到的整个循环。当然,有一个方法叫prompt,还有一个叫promptInt。为了避免混淆,我们将 prompt-method 重命名为 promptString,整个程序就变成了:
public class YourNameHere {
private static final Scanner clavier = new Scanner(System.in);
public static String promptString(String prompt) {
System.out.print(prompt);
return clavier.nextLine().trim();
}
public static int promptInt(String prompt) {
String value = promptString(prompt);
try {
return Integer.parseInt(value);
} catch(NumberFormatException ignored) {
System.out.println("Invalid number: '" + value + "'");
return promptInt(prompt); // We try again!
}
}
public static void main(String[] args) {
Utilisateur utilisateur = new Utilisateur();
utilisateur.setNom(promptString("Enter your Name: "));
utilisateur.setPrenom(promptString("Enter your surname: "));
utilisateur.setMatricule(promptString("Enter your matricule: "));
utilisateur.setSexe(promptString("Enter your sex: "));
utilisateur.setAge(promptInt("Enter your age: "));
System.out.println("You have created an utilisateur: " + utilisateur);
}
}
当然还要加上 Utilisateur 的定义。 我认为这是一种更简单的方法,通过创建为您完成无聊工作的方法,您可以阅读 main 方法中的代码并立即了解发生了什么。如果需要了解如何操作,可以上去看看helping prompt-methods