import java.util.Scanner;
public class CreatePurchase {
public static Purchase item;
public static Scanner details;
public static void main(String[] args) {
details = new Scanner(System.in);
item = new Purchase ();
int invoice = details.nextInt();
boolean invoiceRange = ((invoice >= 1000) && (invoice <= 8000));
while (!invoiceRange)
{
invoice = details.nextInt();
}
item.setInvoice(invoice);
double sale = details.nextDouble();
if (sale >= 0)
{
item.setSale(sale);
}
item.display();
}
}
运行此代码时不会出现语法或语义错误。如果您为invoice
和sale
输入正确的值,则会运行时没有任何问题。我面临的问题似乎是合乎逻辑的,我不明白为什么。在通过第一个循环周期后,它继续请求我输入值,好像它不再经历检查阶段一样,这会导致无限循环。
我不认为布尔逻辑是错误的,因为它在提供正确的值时起作用,但我想在做任何事之前我应该问这里。
我认为这与我将对象声明为静态字段有关。我希望Purchase
类成为CreatePurchase
类的一部分,使其成为一个字段。 Java不允许我在不创建CreatePurchase
类的实例的情况下访问它,我认为这是递归的并且会导致堆栈溢出。使它们静态工作,但我认为字段要么在第一次输入后停止接收值,要么布尔逻辑只是错误。
此问题来自问题Java use of static fields基于的相同作业。
答案 0 :(得分:0)
invoiceRange不会在while内更新,所以它总是包含相同的值而while永远不会结束。
答案 1 :(得分:0)
问题是因为您的invoiceRange在while循环中没有重置为true。
你需要在循环中将其设置为invoiceRange=true
或使用break
关键字打破循环
答案 2 :(得分:0)
你应该在这里使用do-while循环:
int invoice;
do {
invoice = details.nextInt();
} while (invoice < 1000 || invoice > 8000);
这将反复询问用户的发票金额,直到它在可接受的范围内。您的代码不起作用,因为您在读取用户给出的第一个值后才设置invoiceRange
的值,因此如果该值超出给定范围,则循环将无限运行。
这也可以通过在while循环中添加一行来完成:
int invoice = details.nextInt();
boolean invoiceRange = ((invoice >= 1000) && (invoice <= 8000));
while (!invoiceRange)
{
invoice = details.nextInt();
// Need this line to update the value of invoiceRange every
// time a new invoice value is read in
invoiceRange = ((invoice >= 1000) && (invoice <= 8000));
}
但是,在检查是否需要继续执行该操作(检查发票金额是否在可接受的范围内)之前,您希望执行某些操作(从用户读取发票金额)的情况下更适合使用。
最后一点说明:由于您只在item
方法中使用details
和main
,因此如果您在方法中声明并初始化它们会更好。这使代码更具可读性,并帮助您跟踪变量发生的变化,从而更容易识别问题的原因。