Инициализация двойников в цикле с ошибкой «переменная, возможно, не была инициализирована»

#java #if-statement #variables #double

#java #if-оператор #переменные #double

Вопрос:

Предполагается, что эта программа получает вес некоторой почты от пользователя и вычисляет, сколько это стоит. После 100g стоимость увеличивается на 2,5 доллара / 50g. Однако, когда я пытаюсь запустить программу, она говорит: «переменная стоимость, возможно, не была инициализирована». Это потому, что я инициализирую ее в операторе if или что-то в этом роде? Я знаю, что у некоторых людей были ошибки, потому что они объявляли переменную в статусе if, но я объявил свою переменную вне оператора if. Что я делаю не так.

 import java.util.Scanner;
class Main {
  public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        double mailWeight;
        double cost;

    System.out.println("How much does your mail weigh (g)");
        mailWeight = in.nextDouble();

        in.close();

        if (mailWeight > 0 amp;amp; mailWeight <= 30) {
            cost = 4;
        }else if (mailWeight > 30 amp;amp; mailWeight <= 50) {
            cost = 5.50;
        }else if (mailWeight > 50) {
            double x = mailWeight - 100;
            if (x >= 50) {
                double y = x/50;
                Math.ceil(y);
                double z = y * 2.5;
                cost = z   7;
            }
        }
        System.out.println(cost);
  }
}
 

Ответ №1:

Помимо variable not initialized проблемы, есть еще несколько мест для улучшения:

  1. удалите избыточные проверки
  2. исправлен расчет стоимости избыточного веса
  3. Scanner на основе System.in не нужно закрывать
 Scanner in = new Scanner(System.in);
System.out.println("How much does your mail weigh (g)");

double mailWeight = in.nextDouble();
double cost;

if (mailWeight <= 0) {
    cost = 0;
} else if (mailWeight <= 30) {
    cost = 4;
} else if (mailWeight <= 50) {
    cost = 5.50;
} else {
    cost = 7;

    if (mailWeight > 100) {
        double y = Math.ceil((mailWeight - 100) / 50.0);
        cost  = 2.5 * y;
    }
}
System.out.println(cost);
 

Ответ №2:

Он не инициализируется, если выполняется последнее значение else if и x < 50 или когда ни один из операторов if не приводит к true для mailWeight . Вы могли бы предварительно инициализировать стоимость. (двойная стоимость = 0) Или вы могли бы добавить все недостающие блоки else. Вам необходимо инициализировать свою переменную во всех возможных случаях, прежде чем читать ее.

Вероятно, это сработало бы:

 public static void main(String[] args) {
    Scanner in = new Scanner(System.in);

    double mailWeight;
    double cost;

    System.out.println("How much does your mail weigh (g)");
    mailWeight = in.nextDouble();

    in.close();

    if (mailWeight > 0 amp;amp; mailWeight <= 30) {
        cost = 4;
    } else if (mailWeight > 30 amp;amp; mailWeight <= 50) {
        cost = 5.50;
    } else if (mailWeight > 50) {
        double x = mailWeight - 100;
        if (x >= 50) {
            double y = x/50;
            Math.ceil(y);
            double z = y * 2.5;
            cost = z   7;
        } else {
            cost = 0; // Or whatever you want to set it to in this case
        }
    } else {
        cost = 0; // Or whatever you want to set it to in this case
    }
    System.out.println(cost);
}
 

Или предварительная инициализация стоимости:

 public static void main(String[] args) {
    Scanner in = new Scanner(System.in);

    double mailWeight;
    double cost = 0; // Or whatever you want it to be if none of the cases match

    System.out.println("How much does your mail weigh (g)");
    mailWeight = in.nextDouble();

    in.close();

    if (mailWeight > 0 amp;amp; mailWeight <= 30) {
        cost = 4;
    } else if (mailWeight > 30 amp;amp; mailWeight <= 50) {
        cost = 5.50;
    } else if (mailWeight > 50) {
        double x = mailWeight - 100;
        if (x >= 50) {
            double y = x/50;
            Math.ceil(y);
            double z = y * 2.5;
            cost = z   7;
        }
    }
    System.out.println(cost);
}
 

Ответ №3:

Как говорится в ошибке, вы не инициализировали эти две переменные «Вес почты» и «стоимость»

Поскольку они являются локальными переменными (внутри метода), вам необходимо инициализировать их, прежде чем обращаться к ним. Вы инициализируете, присваивая начальное значение:

 double mailWeight=0;
double cost=0;