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

时间:2016-10-26 21:54:14

标签: java object instance instance-variables

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类成为CreatePurchase类的一部分,使其成为一个字段。 Java不允许我在不创建CreatePurchase类的实例的情况下访问它,我认为这是递归的并且会导致堆栈溢出。使它们静态工作,但我认为字段要么在第一次输入后停止接收值,要么布尔逻辑只是错误。

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

3 个答案:

答案 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方法中使用detailsmain,因此如果您在方法中声明并初始化它们会更好。这使代码更具可读性,并帮助您跟踪变量发生的变化,从而更容易识别问题的原因。