Инициализация переменных, если еще, но не работает, как мне правильно их инициализировать? - PullRequest
1 голос
/ 31 января 2020

Всего новичков до Java! Мне нужно выяснить, почему «discount» и «discountnum» продолжают говорить, что их нужно инициализировать, когда я инициализирую в операторах if else. Я не хочу принимать пользовательский ввод для этих двух, как я делаю для других моих переменных. Как я могу это исправить, чтобы он просто публиковал числа?

import java.util.Scanner;
package com.company;

public class Coffee {

    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);
        String name = scan.nextLine();
        double prevpurchases = scan.nextDouble();
        double saleamount = scan.nextDouble();
        double discountnum;
        double totalamount;
        int discount;
        double amountsaved;

        System.out.println("Welcome to Starbucks.\n"+
                "Please enter your name: " + name);

        System.out.println("Please enter the current purchase amount: " + saleamount);

        System.out.println("Please enter the number of purchases in the last month: " + prevpurchases);

        if (saleamount < 5){
            discountnum = 0;
            amountsaved = 0.00;
        } else {
            if (prevpurchases == 0) {
                discountnum = 0.05;
                discount = 5;
            }
            else if (prevpurchases >= 1 && prevpurchases <= 5){
                discountnum = 0.10;
                discount = 10;
            }
            else if (prevpurchases >= 6 && prevpurchases <= 10){
                discountnum = 0.15;
                discount = 15;
            }
            else if (prevpurchases >= 11 && prevpurchases <= 15){
                discountnum = 0.20;
                discount = 20;
            }
            else if (prevpurchases >= 16 && prevpurchases <= 20){
                discountnum = 0.25;
                discount = 25;
            }
            else if (prevpurchases >= 21){
                discountnum = 0.30;
                discount = 30;
            }
        }

        System.out.println("***********************\n" +
                "Receipt for " + name);
        System.out.println("You get a " + discount + "% discount.");

        amountsaved = saleamount * discountnum;
        totalamount = saleamount - amountsaved;

        System.out.println("Total amount due: $ " + totalamount);
        System.out.println("You saved $ " + amountsaved);
        System.out.println("***********************\n");

    }
}

ПРИМЕР ВЫХОДА:

Добро пожаловать в Starbucks.

Пожалуйста, введите ваше имя: Брайан Б Брайан

Пожалуйста, введите текущую сумму покупки: $ 12,78

Пожалуйста, введите количество покупок за последний месяц: 14


Квитанция за Брайана Б. Брайана

Вы получаете скидку 20%.

Общая сумма: 10,22

Вы сэкономили 2,56


Ответы [ 3 ]

1 голос
/ 31 января 2020

У вас "может" быть дело, которое не пройдет ни в одном из ваших if-else-if. Попробуйте с этим кодом.

if (saleamount < 5){
        discountnum = 0;
        amountsaved = 0.00;
    } else {
        if (prevpurchases == 0) {
            discountnum = 0.05;
            discount = 5;
        }
        else if (prevpurchases >= 1 && prevpurchases <= 5){
            discountnum = 0.10;
            discount = 10;
        }
        else if (prevpurchases >= 6 && prevpurchases <= 10){
            discountnum = 0.15;
            discount = 15;
        }
        else if (prevpurchases >= 11 && prevpurchases <= 15){
            discountnum = 0.20;
            discount = 20;
        }
        else if (prevpurchases >= 16 && prevpurchases <= 20){
            discountnum = 0.25;
            discount = 25;
        }
        else if (prevpurchases >= 21){
            discountnum = 0.30;
            discount = 30;
        } else {
            //this is the missing/needed initialization
            //if neither one of the tests you have above, you need to somehow initialize the variable.
        }
    }
0 голосов
/ 31 января 2020

Рассматриваемая проблема действительно может быть решена с помощью предложений других народов. В дополнение к быстрому исправлению, я хотел бы дать некоторую интуицию о , почему вы получаете ошибки:

Компилятор, т.е. программа, которая (упрощенно) выходит из вашего Java code -> Java byte code (сокращенная версия написанного вами) -> Машинный код (0 и 1) должен обеспечивать соблюдение определенных правил. Поскольку Java - это объектно-ориентированный язык программирования высокого уровня, он скрывает от вас много деталей. Например, вам никогда не придется беспокоиться о , где в памяти что-то хранится, вы будете предупреждены, как только вы go выйдете за пределы массива, и после использования объекта вы никогда Нужно избавиться от него вручную (т.е. освободить занимаемое им пространство).

Звучит отлично, верно? Ну, проблема в том, что Java, выполняя это, должно проверять вещи, которыми должен управлять программист на других языках программирования (например, C). Хотя вы можете знать, что определенный путь через ваши операторы if никогда не будет принят, компилятор не может быть на 100% уверен в предоставленном вами коде. Давайте посмотрим на следующий пример:

    int lel;
    boolean test = true;
    if(test)
    {
        lel = 10;
    }

    System.out.println(lel);

Даже этот упрощенный c отрубленный код скинет компилятор. Основная проблема того, что я описал выше, на самом деле более техническая, а именно в том случае, когда переменные оцениваются не в время компиляции , а в время выполнения . В двух словах, компилятор рассматривает lel и test как черный ящик, содержащий значение типа. Какие значения они содержат, не имеет значения при компиляции.

Следовательно, компилятор не знает, что test действительно всегда верно. С другой стороны, если вы напишите:

    int lel;
    if(true)
    {
        lel = 10;
    }

, то компилятор, поскольку true - это не переменная, а значение, оценивает его при компиляции. Поэтому вы не получите ошибку. Последний пример - это использование ключевого слова final. final означает, что значение не будет изменено после его определения. Поскольку это в основном равносильно тому, что переменная является постоянной, компилятор фактически «смотрит» на значение переменной и не рассматривает его как черный ящик. То есть, если вы замените boolean test = true; на final boolean test = true;, компилятор будет обрабатывать test как значение. Следовательно, во время компиляции уже ясно, что оператор if всегда оценивается как true.

В любом из двух примеров (т. Е. if (true){...} и final boolean test = true;, компилятор наверняка поймет, что если утверждение вокруг lel = 10; бесполезно и переписать его так:

    int lel;
    lel = 10;
0 голосов
/ 31 января 2020

Инициализируйте их в объявлении переменной значением, например:

double discountnum = 0;
double totalamount = 0;
int discount = 0;
double amountsaved = 0;
...