创建静态对象字段时会出现什么问题?
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();
}
}
运行这段代码没有出现语法或语义错误。如果您为 invoice
和 sale
输入正确的值,它可以正常运行。我面临的问题似乎是合乎逻辑的,我真的不明白为什么。过了第一个循环后,它一直要求我输入值,就好像它不再经过检查阶段一样,导致死循环。
我不认为布尔逻辑是错误的,因为它在提供正确的值时起作用,但我认为我应该在假设任何事情之前先在这里问一下。
我认为这与我将我的对象声明为静态字段有关。我想让 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
方法中只使用了 item
和 details
,因此最好在方法中声明和初始化它们。这使代码更具可读性,并帮助您跟踪变量发生更改的位置,从而更容易确定问题的原因。
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
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
方法中只使用了 item
和 details
,因此最好在方法中声明和初始化它们。这使代码更具可读性,并帮助您跟踪变量发生更改的位置,从而更容易确定问题的原因。