Java、Scanner扫描输入的问题
<1>FutureValue3 .java
----------------------------------------------------------------------------
public class FutureValue3 {
String name; // 用户名
int years; // 投资年限
double monthlyInvest, // 月投资额
yearlyRate, // 年回报率
futureValue = 0; // 投资回报额初始值
public String getName() { // getXxx() 和 setXxx()方法
return name;
}
public void setName(String name) {
this.name = name;
}
public int getYears() {
return years;
}
public void setYears(int years) {
this.years = years;
}
public double getMonthlyInvest() {
return monthlyInvest;
}
public void setMonthlyInvest(double monthlyInvest) {
this.monthlyInvest = monthlyInvest;
}
public double getYearlyRate() {
return yearlyRate;
}
public void setYearlyRate(double yearlyRate) {
this.yearlyRate = yearlyRate;
}
public double getFutureValue() {
return futureValue;
}
// 计算投资回报额
public void futureValueCompute() {
double monthlyReturnRate = yearlyRate / 12 / 100;
int months = years * 12;
int i = 1;
while (i <= months) {
futureValue = (futureValue + monthlyInvest)
* (1 + monthlyReturnRate);
i++;
}
}
}
----------------------------------------------------------------------------
<2>Validator3.java
----------------------------------------------------------------------------
import java.util.Scanner;
public class Validator3 {
/*
* 验证double数据输入
*/
public static double validateDouble(Scanner sc, String prompt) {
boolean isValid = false;
double data = 0.0;
while (!isValid) {
System.out.print(prompt);
try {
if (!sc.hasNextDouble()) // 如果扫描器中不是合法数据
throw new NumberFormatException(); // 抛出一个异常
else
data = sc.nextDouble(); // 验证是否是双精度
if (inRang(data)) // 验证是否在正确范围
isValid = true;
else
throw new Exception();
isValid = true;
} catch (NumberFormatException e) {
System.out.println("\n输入数据错误!请输入正确值...");
sc.nextLine();
} catch (Exception e) {
System.out.println("\n输入数据错误!请输入整数...");
sc.nextLine();
}
}// while循环结束
return data;
} // validateDouble方法结束
/*
* 验证是否是正数
*/
private static boolean inRang(double num) {
if (num >= 0.0)
return true;
else
return false;
}
/*
* 验证int数据输入
*/
public static int validateInt(Scanner sc, String prompt, int min, int max) {
boolean isValid = false;
int data = 0;
while (!isValid) {
System.out.print(prompt);
try {
if (!sc.hasNextInt()) // 如果扫描器中不是合法数据
throw new NumberFormatException(); // 抛出一个异常
else {
data = sc.nextInt();
if (data < min) // 超出最小范围
throw new Exception(); // 抛出异常
else if (data > max) // 超出最大范围
throw new Exception(); // 超出抛出异常
isValid = true;
}
} // try结束
catch (NumberFormatException e) {
System.out.println("\n输入数据错误!请输入整数值...");
sc.nextLine(); //清除扫描器
} // catch结束
catch (Exception e) {
System.out.println("\n输入数据超出范围错误!请输入正确值...");
sc.nextLine(); //清除扫描器
}
}// while循环结束
return data;
}
}
----------------------------------------------------------------------------
<3>驱动类:FutureValue3App.java
----------------------------------------------------------------------------
import java.util.Scanner;
public class FutureValue3App {
public static void main(String[] args) {
double monthlyInvestment, // 月投资额
yearlyReturnRate; // 年回报率
int investYears; // 投资年数
final int minYear = 1, maxYears = 150;
Scanner sc = new Scanner(System.in);
FutureValue3 futureValue = new FutureValue3(); // 创建对象
String choice = "y";
while (choice.equalsIgnoreCase("y")) {
System.out.print("请输入用户名:");
String name = sc.next();
futureValue.setName(name); // 建立用户名
sc.nextLine();
monthlyInvestment = Validator3.validateDouble(sc, "请输入月投资额:");
futureValue.setMonthlyInvest(monthlyInvestment); // 建立月投资额
yearlyReturnRate = Validator3.validateDouble(sc, "请输入年回报率:");
futureValue.setYearlyRate(yearlyReturnRate); // 建立年回报率
investYears = Validator3.validateInt(sc, "请输入投资年:", minYear,
maxYears);
futureValue.setYears(investYears); // 建立投资年
futureValue.futureValueCompute();
System.out.println("您的投资回报为:" + futureValue.getFutureValue());
System.out.println("继续?(y/n)");
choice = sc.next(); // 是否继续?
sc.nextLine();
} // while循环结束,清除扫描器
System.out.println("欢迎使用计算投资回报程序,再见!");
} // main()方法结束
} // 驱动类FutureValue3App结束
----------------------------------------------------------------------------
执行结果:
请输入用户名:LazyCat
请输入月投资额:mm
输入数据错误!请输入正确值...
请输入月投资额:3800
请输入年回报率:mm
输入数据错误!请输入正确值...
请输入年回报率:
输入数据错误!请输入正确值...
请输入年回报率:mm
输入数据错误!请输入正确值...
请输入年回报率:0.33
请输入投资年:mm
输入数据错误!请输入整数值...
请输入投资年:
输入数据错误!请输入整数值...
请输入投资年:mm
输入数据错误!请输入整数值...
请输入投资年:20
您的投资回报为:942894.4768824519
继续?(y/n)
----------------------------------------------------------------------------
----------------------------------------------------------------------------
问题: 输入回报率和投资年,当第一次输入不合法数据抛出异常并提示重新输入。此时连续抛出了两次异常,光标才停止。
然后到第三次再次输入错误数据时才只抛出一次异常。
不知道是为何?
----------------------------------------------------------------------------
----------------------------------------------------------------------------