Java、Scanner扫描输入的问题

song90273 2010-07-11 06:29:05
<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)

----------------------------------------------------------------------------
----------------------------------------------------------------------------
问题: 输入回报率和投资年,当第一次输入不合法数据抛出异常并提示重新输入。此时连续抛出了两次异常,光标才停止。
然后到第三次再次输入错误数据时才只抛出一次异常。
不知道是为何?
----------------------------------------------------------------------------
----------------------------------------------------------------------------
...全文
237 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
song90273 2010-07-24
  • 打赏
  • 举报
回复
有事结帖晚了。我后来发现是返回数据前没有使用sc.nextLine()方法清空扫描器。
谢谢大家的回答
coooliang 2010-07-12
  • 打赏
  • 举报
回复
为什么要用抛出异常来处理?
  • 打赏
  • 举报
回复
代码不用代码标签括起来的帖子
  • 打赏
  • 举报
回复
用调试器看看是什么问题。
  • 打赏
  • 举报
回复
用调试器看看是什么问题。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧