<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)----------------------------------------------------------------------------
----------------------------------------------------------------------------
问题: 输入回报率和投资年,当第一次输入不合法数据抛出异常并提示重新输入。此时连续抛出了两次异常,光标才停止。
然后到第三次再次输入错误数据时才只抛出一次异常。
不知道是为何?
----------------------------------------------------------------------------
----------------------------------------------------------------------------