在这段程序中的Bug:
就是当我在控制台测试的时候我进行到第一个提示“继续购买t/n”这里的t是继续购买的意思,n是不再购买的意思,输入n程序结束,输入t则返回第一个方法继续输入购买数量,单价,付款金额
若输入n则程序退出且提示“谢谢惠顾欢迎下次再来”
我输入了y然后依次输入了购买数量及单价,付款金额后控制台提示“继续购买t/n”我输入了n
可是控制台本应该退出程序的却又输出了提示信息“继续购买t/n”于是我用排除法的思路排除到了B方法的循环这里是多余或者说不必要的于是我就将while的死循环去除了,但是随后又遇到了第二个BUG:就是当我第二次购物结束后我输入n他却跳到了results方法的支付完成内行代码,然后我重新整理了一下整个程序的逻辑后发现是这里的if分支语句缺少else的问题
if(result>payment){
System.out.println("请不要乱输入 价格不够请重新输入");
results();
}
payment -= result;
System.out.println("支付完成");
System.out.println("卡内还剩"+payment);
B();
BUG程序的代码
package game;
//商品打折 超过1500打5折
import java.util.Scanner;
class Test_Discount {
Scanner scan = new Scanner(System.in);
double money;//购买数量
double number;//单价
double result;//总价
double payment;//
public static void main(String[]args){
//new 一个对象
Test_Discount A = new Test_Discount();
//A对象内 赋值head方法
A.head();
System.out.println("谢谢惠顾欢迎下次再来");
}
//设置 需要的变量方法
public void head(){
System.out.println("请输入购买数量");
double money = scan.nextDouble();
System.out.println("当前购买数量为:"+money);
System.out.println("请输入购买价格");
double number = scan.nextDouble();
result = money*number;
System.out.println("您的总价为:"+result);
process();
}
//进行判断
public void process(){
if (result>=5000){
System.out.println("目前有打折优惠满5000--5折优惠");
result *= 0.5;
}
System.out.println("您当前的价格为:"+result);
results();
}
//判断的结果
public void results(){
System.out.println("请付款");
payment = scan.nextDouble();
if(result>payment){
System.out.println("请不要乱输入 价格不够请重新输入");
results();
}
payment -= result;
System.out.println("支付完成");
System.out.println("卡内还剩"+payment);
B();
}
//是否继续 否则返回主方法
public void B(){
while (true) {
System.out.println("继续购买y/n");
String a = scan.next().toLowerCase();
if ("y".equals(a)) {
head();
} else if ("n".equals(a)) {
return;
} else {
System.out.println("瞎输什么");
}
}
}
}
//return 结束该方法
//break 结束当前循环
//continue 跳出本次循环
修复后的整个程序的代码:
package game;
//商品打折 超过1500打5折
import java.util.Scanner;
class Test_Discount {
Scanner scan = new Scanner(System.in);
double money;//购买数量
double number;//单价
double result;//总价
double payment;//
public static void main(String[]args){
//new 一个对象
Test_Discount A = new Test_Discount();
//A对象内 赋值head方法
A.head();
System.out.println("谢谢惠顾欢迎下次再来");
}
//设置 需要的变量方法
public void head(){
System.out.println("请输入购买数量");
double money = scan.nextDouble();
System.out.println("当前购买数量为:"+money);
System.out.println("请输入购买价格");
double number = scan.nextDouble();
result = money*number;
System.out.println("您的总价为:"+result);
process();
}
//进行判断
public void process(){
if (result>=5000){
System.out.println("目前有打折优惠满5000--5折优惠");
result *= 0.5;
}
System.out.println("您当前的价格为:"+result);
results();
}
//判断的结果
public void results(){
System.out.println("请付款");
payment = scan.nextDouble();
if(result>payment){
System.out.println("请不要乱输入 价格不够请重新输入");
results();
}else {
payment -= result;
System.out.println("支付完成");
System.out.println("卡内还剩" + payment);
B();
}
}
//是否继续 否则返回主方法
public void B(){
System.out.println("继续购买y/n");
String a = scan.next().toLowerCase();
if ("y".equals(a)) {
head();
} else if ("n".equals(a)) {
return;
} else {
System.out.println("瞎输什么");
B();
}
}
}
//return 结束该方法
//break 结束当前循环
//continue 跳出本次循环
总结:
当遇到需要if分支判断的时候最好是加上else避免不必要的且难以解释的小BUG,其次就是能使用调用方法来完成的循环尽量别使用while或do——while循环,容易出现类似我这种情况的BUG