一个出问题的JAVA程序 ( 积分: 100 )

  • 主题发起人 主题发起人 wyf2
  • 开始时间 开始时间
W

wyf2

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个连续网上购物,计算总价格的程序
运行时第一次计算可以正常执行,但是当我按Y键继续时,输入下一次所购买的物品的价格时就出现了一个异常抛出的提示,
我写的代码是:
import java.io.*;
public class W5
{
public static void main(String args[]) throws java.io.IOException
{
do
uble i=0,j=0,k=0;
int x;
char y=' ';
boolean h=true;
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
frist:
while(h)
{
System.out.print("请输入您所购买的商品的价格! ");
i=Double.parseDouble(br.readLine());
System.out.println("下面是送货的类型!");
System.out.println("(1) 特快(当天送到),费用:¥14.5");
System.out.println("(2) 快速(3天送到),费用:¥11.95");
System.out.println("(3) 标准(5天内送到),费用:¥5.95(如果您所购买的物品的价格想过75元则免费送货!)");
System.out.println("请从上面选择您想要的送货类型! ");
x=Integer.parseInt(br.readLine());
switch(x)
{
case 1:
j=14.5;
System.out.println("您选择的送货方式是特快,当天送到,费用:¥14.5");
break;
case 2:
j=11.95;
System.out.println("您选择的送货方式是快速,3天送到,费用:¥11.95");
break;
case 3:
if (i>=75)
{
j=0;
System.out.println("您选择的送货方式是标准,5天内送到,由于您所购买的物品总价格超过75元,所以我们将免费送货");
break;
}
else
{
j=5.95;

System.out.println("您选择的送货方式是标准,5天内送到,由于您所购买的物品总价格没有超过75元,所以需要送货的费用:¥5.95");

break;

}
}
System.out.println("您是否继续购物(Y/N)?");
y=(char)System.in.read();
if (y=='Y' || y=='y')
{
k=i+j+k;
i=0;
j=0;
continue frist;
}
else

{
h=false;

System.out.println("谢谢您的购买,您应支付的费用是:"+(i+j+k));
System.out.println("欢迎再次来到汪汪购物中心购物,祝您生活幸福愉快!");
}
}
}
}
 
我写了一个连续网上购物,计算总价格的程序
运行时第一次计算可以正常执行,但是当我按Y键继续时,输入下一次所购买的物品的价格时就出现了一个异常抛出的提示,
我写的代码是:
import java.io.*;
public class W5
{
public static void main(String args[]) throws java.io.IOException
{
do
uble i=0,j=0,k=0;
int x;
char y=' ';
boolean h=true;
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
frist:
while(h)
{
System.out.print("请输入您所购买的商品的价格! ");
i=Double.parseDouble(br.readLine());
System.out.println("下面是送货的类型!");
System.out.println("(1) 特快(当天送到),费用:¥14.5");
System.out.println("(2) 快速(3天送到),费用:¥11.95");
System.out.println("(3) 标准(5天内送到),费用:¥5.95(如果您所购买的物品的价格想过75元则免费送货!)");
System.out.println("请从上面选择您想要的送货类型! ");
x=Integer.parseInt(br.readLine());
switch(x)
{
case 1:
j=14.5;
System.out.println("您选择的送货方式是特快,当天送到,费用:¥14.5");
break;
case 2:
j=11.95;
System.out.println("您选择的送货方式是快速,3天送到,费用:¥11.95");
break;
case 3:
if (i>=75)
{
j=0;
System.out.println("您选择的送货方式是标准,5天内送到,由于您所购买的物品总价格超过75元,所以我们将免费送货");
break;
}
else
{
j=5.95;

System.out.println("您选择的送货方式是标准,5天内送到,由于您所购买的物品总价格没有超过75元,所以需要送货的费用:¥5.95");

break;

}
}
System.out.println("您是否继续购物(Y/N)?");
y=(char)System.in.read();
if (y=='Y' || y=='y')
{
k=i+j+k;
i=0;
j=0;
continue frist;
}
else

{
h=false;

System.out.println("谢谢您的购买,您应支付的费用是:"+(i+j+k));
System.out.println("欢迎再次来到汪汪购物中心购物,祝您生活幸福愉快!");
}
}
}
}
 
怎么没有人回答呀
 
运行的结果是这样的:
请输入您所购买的商品的价格! 79
下面是送货的类型!
(1) 特快(当天送到),费用:¥14.5
(2) 快速(3天送到),费用:¥11.95
(3) 标准(5天内送到),费用:¥5.95(如果您所购买的物品的价格想过75元则免费送货!)
请从上面选择您想要的送货类型!
2
您选择的送货方式是快速,3天送到,费用:¥11.95
您是否继续购物(Y/N)?
y
请输入您所购买的商品的价格! Exception in thread "main"
java.lang.NumberFormatExc
eption: empty String
at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:9
86)
at java.lang.Double.parseDouble(Double.java:201)
at W5.main(w5.java:15)
不过它在第二次要输入价格时就报错
 
怎么还是没人回答
 
i=Double.parseDouble(br.readLine());
这个有问题,你没有捕捉异常,因为有可能出现的是不能转换成double的值。
 
我跟踪了一下:
你在y=(char)System.in.read();这里用 String sss=br.readLine();来替换
用if (sss.equals("Y") ||sss.equals("y"))来判断就好了.
 
楼上说的对,你用y=(char)System.in.read();捕捉到输入'y'后,程序转到 i=Double.parseDouble(br.readLine());后会直接从缓冲区读readLine(),不会让你再次输入。
System.out.println("您是否继续购物(Y/N)?");
//y=(char)System.in.read();

//System.out.println(y);
y=br.readLine();
if (y.toLowerCase().equals("y"))
{。。
这样改就好了
 
我改了一下,个人意见
import java.io.*;
public class W5 {
private BufferedReader in = null;
private PrintStream out = null;
public W5() {
in = new BufferedReader(new InputStreamReader(System.in));
out = System.out;
}
public String dataValid(String outMessage, String regular)
throws IOException {
String value = null;
while (true) {
out.print(outMessage);
value = in.readLine();
if (value.matches(regular))
break;
}
return value;
}
public void println(String Message) {
out.println(Message);
}
public static void main(String args[]) throws IOException {
W5 w5 = new W5();
double i = 0, j = 0, k = 0;
while (true) {
i =do
uble.parseDouble(w5.dataValid("请输入您所购买的商品的价格! ",
"^[0-9]{1,}.{0,1}[0-9]{0,}$"));
String type = "下面是送货的类型!/n"
+ "
(1) 特快(当天送到),费用:¥14.5/n"
+ " (2) 快速(3天送到),费用:¥11.95/n"
+ " (3) 标准(5天内送到),费用:¥5.95(如果您所购买的物品的价格想过75元则免费送货!)/n"
+ "请从上面选择您想要的送货类型!/n";
switch (Integer.parseInt(w5.dataValid(type, "^[1,2,3]$"))) {
case 1:
j = 14.5;
w5.println("您选择的送货方式是特快,当天送到,费用:¥14.5");
break;
case 2:
j = 11.95;
w5.println("您选择的送货方式是快速,3天送到,费用:¥11.95");
break;
case 3:
j = (i >= 75) ? 0 : 5.95;
String message = "您选择的送货方式是标准,5天内送到,由于您所购买的物品总价格"
+ ((i >= 75) ? "超过75元,所以我们将免费送货"
: ("没有超过75元,所以需要送货的费用:"
+ j));
w5.println(message);
break;
}
k = i + j + k;
i = 0;
j = 0;
if (!w5.dataValid("您是否继续购物(Y/N)?", "^[y,n,Y,N]{1}$").toLowerCase()
.equals("y")) {
w5.println("谢谢您的购买,您应支付的费用是:"
+ k);
w5.out.println("欢迎再次来到汪汪购物中心购物,祝您生活幸福愉快!");
break;
}
}
}
}
 
y=(char)System.in.read();
改为
y=(char)br.readLine();
 
比较同意yangxiao_jiang
很多人说 改成 y=(char)br.readLine();
这肯定不行, readLine()返回String,String怎么能强制类型转换成char
我给你好好讲讲错误的原因吧:
错误提示的意思是:数据格式化异常。而且根据异常抛出的位置,可以断定,错误肯定出在i=Double.parseDouble(br.readLine());
因为你的 y=(char)System.in.read();这句话每次只读取一个byte,所以,如果你输入了y+回车,那么'y'被接收到变量y中,而回车仍然在输入流中。然后程序转到 i=Double.parseDouble(br.readLine());这里不会提示再输入,而是直接从输入流中把回车取出来,而回车符号用Double.parseDouble()处理会发生错误。因此程序到这个地方抛出异常。。
你程序中三处数据类型转换,但是都没有使用try{}catch(){}异常处理,这样的话,就算程序没有这个错误,也不健壮,比如如果用户选择商品时不是输入数字而是输入字母或者其他,程序也会发生异常。
以上都是错误原因。至于解决办法,上面几位朋友的方法基本可行,可以试一下。
个人推荐:
1、把三处类型转换都加上异常处理,如果输入的格式非法则提示重新输入。
2、把 y=(char)System.in.read()改成 String y=br.readLine().trim();
3、字符串比较相等用.equals()而不要用==。也就是yangxiao_jiang说的把
if(y=='y' || y=='Y') 改成 if(y.equals("y") || y.equals("Y"))就行了。
在String类型中,==表示比较两个字符串对象的值和内存地址同时相等,equals表示值相等。
 
后退
顶部