创建静态对象字段时会出现什么问题?

What problems occur when creating static object fields?

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();
    }
}

运行这段代码没有出现语法或语义错误。如果您为 invoicesale 输入正确的值,它可以正常运行。我面临的问题似乎是合乎逻辑的,我真的不明白为什么。过了第一个循环后,它一直要求我输入值,就好像它不再经过检查阶段一样,导致死循环。

我不认为布尔逻辑是错误的,因为它在提供正确的值时起作用,但我认为我应该在假设任何事情之前先在这里问一下。

我认为这与我将我的对象声明为静态字段有关。我想让 Purchase class 成为 CreatePurchase class 的一部分,方法是将其设为字段。 Java 不允许我在不创建 CreatePurchase class 的实例的情况下访问它,我认为这是递归的并且会导致堆栈溢出。使它们成为静态的工作,但我认为字段要么在第一次输入后停止接收值,要么布尔逻辑有问题。

此问题与问题 Java use of static fields 所基于的作业相同。

invoiceRange 不会在 while 内更新,因此它始终包含相同的值并且 while 永远不会结束。

问题是因为您的 invoiceRange 在 while 循环中没有重置为 true。

您需要在 while 循环内将其设置为 invoiceRange=true 或使用 break 关键字

中断循环

你应该在这里使用 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));
}

但是,在检查是否需要继续执行该操作(检查发票价值是否在可接受的范围内)之前,如果您想做某事(从用户那里读取发票价值),最好先做一段时间范围)。

最后一点:由于您在 main 方法中只使用了 itemdetails,因此最好在方法中声明和初始化它们。这使代码更具可读性,并帮助您跟踪变量发生更改的位置,从而更容易确定问题的原因。