2016-10-26 4 views
-1
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.

+2

Ваше логическое условие '(! InvoceRange)' никогда не изменяется в цикле, поэтому оно бесконечно. –

+1

Ваш заголовок вопроса вводит в заблуждение - объекты не являются ни статическими, ни экземплярами - они просто * являются *. *** Переменные ***, с другой стороны, могут быть объявлены статическими или не объявленными статическими (так называемые * экземпляры * переменные), а на тот же объект могут ссылаться как статические, так и поле экземпляра. –

+1

Не так много смысла делать эти объекты в статических полях, если они доступны только из метода 'main'. – 4castle

ответ

0

Вы должны использовать делать-то время как цикл здесь:

int invoice; 
do { 
    invoice = details.nextInt(); 
} while (invoice < 1000 || invoice > 8000); 

Это будет повторно просить о фактурной стоимости от пользователя до тех пор, пока он не окажется в пределах допустимого диапазона. Ваш код не работает, потому что вы только установили значение invoiceRange после чтения в первом значении, заданном пользователем, поэтому, если это значение находится за пределами заданного диапазона, цикл будет работать бесконечно.

Это также может быть сделано с добавлением одной строки к вашему время цикла:

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, было бы лучше, если бы вы объявлять и инициализировать их в методе. Это делает код более читаемым и помогает отслеживать, где происходят изменения в переменных, что упрощает определение причины проблем.

+0

Спасибо за предложение. Я новичок в Java, поэтому я постоянно изучал уникальную систему типов Java, даже не пытаясь понять, поможет ли изменение логической логики. Означает ли это, что статическая ссылка прекрасна? Думая о том, как работает статическое ключевое слово, кажется маловероятным. – i0h3

+0

@ i0h3 Да, статическая ссылка в порядке, в том смысле, что она не будет препятствовать правильной работе вашей программы. Но, как я уже упоминал в своем ответе, было бы лучше не иметь статических полей классов и вместо этого просто объявлять их в методе 'main'. – mapeters

0

invoiceRange не обновляется внутри while, поэтому он всегда содержит одно и то же значение, а время не кончается.

0

проблема заключается в том, что ваш invoiceRange не возвращает значение true в цикле while.

вам нужно установить его в invoiceRange=true в то время как петли или разорвать петлю, используя break ключевое слово

+1

Нет, ему нужно переоценить логическое условие, чтобы проверить, допустим или нет новый вход. –

+0

@ a-sir Я не могу поверить, что я забыл что-то такое основное. , , – i0h3