Java 尝试用do-while循环捕捉
使用我的代码,我试图告诉用户在输入一个整数之前不要输入字符串,但在运行程序时它是无限的Java 尝试用do-while循环捕捉,java,try-catch,java.util.scanner,do-while,Java,Try Catch,Java.util.scanner,Do While,使用我的代码,我试图告诉用户在输入一个整数之前不要输入字符串,但在运行程序时它是无限的 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: "); utilisat
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);
}
}
您应该添加
u.nextLine()代码>在catch块中,以跳过在扫描仪中输入的无效值。好的,让我们先清理一下代码。整个“年龄”变量有点奇怪。它似乎包含了一些关于你是否读过《时代》的信息。但这是一种布尔运算,不是吗?因此,让我们重新编写代码时牢记这一点。我会先把do-while改为简单的while,但我们可以在以后再改回来。此外,如果你更喜欢法语,最好将“u”改名为“键盘”,或“键盘”
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”,则可以非常方便地简化它,如下所示:
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方法重命名为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);
}
}
当然,还有利用率的定义。
我认为这是一种简单得多的方法,通过创建为您完成枯燥工作的方法,您可以阅读主方法中的代码,并立即了解发生了什么。如果您需要了解如何操作,可以查看帮助提示方法。我已经删除了JavaScript标记,因为这是Java。我删除了连接到usilisateur
类的任何内容,并且可以在没有任何问题和无限循环的情况下运行代码。因此,我强烈怀疑您在try
块中调用usilizateur
的方法之一引发异常并导致问题。尝试在catch块中打印stacktrace,并查看usilisateur.setAge
或usilisateur.detail()
是否导致引发异常(例如NullPointerException)