Сохранение значений через оператор if - PullRequest
0 голосов
/ 28 января 2012

Я пытаюсь добавить несколько значений, которые я получаю из нескольких операторов if. Поэтому я опробовал это только с помощью операторов if и получаю сообщение об ошибке, что значения totaltopFinal и totaltopFinal1 не были инициализированы в строке кода 'totalCompletion = totaltopFinal + totaltopFinal1', хотя на самом деле они имеют значения, основанные на пользовательском вводе через если заявления.

Вот раздел кода:

    while(t !=0){
        if(t == 30){
            //Loop for parameters of array
            System.out.println("What is the number of students taking the exam?");
            BufferedReader st = new BufferedReader(new InputStreamReader(System.in));
            String d = null;
            try {
                d =st.readLine();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            int s = Integer.parseInt(d);


            totalTop = thirtyMin[0] * s;
            totalTop1 = totalTop * constPercent[0];
            totalTop2 = thirtyMin[1] * s;
            totalTop3 = totalTop2 * constPercent[1];
            totalTop4 = thirtyMin[2] * s;
            totalTop5 = totalTop4 * constPercent[2];
            totalTop6 = thirtyMin[3] * s;
            totalTop7 = totalTop6 * constPercent[3];
            totalStudents = s + totalStudents;
            totaltopFinal = totalTop1 + totalTop3 + totalTop5 + totalTop7;

            averageTotal = totaltopFinal/totalStudents;
            x = Math.log(averageTotal);
            almostTotal = -21.6 * x;
            completeTotal = almostTotal + 156.8;

            System.out.println("The average of students who can take an exam in a hour is:" + completeTotal);
}
        if(t == 45){
            //Loop for parameters of array
            System.out.println("What is the number of students taking the exam?");
            BufferedReader st = new BufferedReader(new InputStreamReader(System.in));
            String d = null;
            try {
                d =st.readLine();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            int s = Integer.parseInt(d);


            totalTop = thirtyMin[0] * s;
            totalTop1 = totalTop * constPercent[0];
            totalTop2 = thirtyMin[1] * s;
            totalTop3 = totalTop2 * constPercent[1];
            totalTop4 = thirtyMin[2] * s;
            totalTop5 = totalTop4 * constPercent[2];
            totalTop6 = thirtyMin[3] * s;
            totalTop7 = totalTop6 * constPercent[3];
            totalStudents = s + totalStudents;
            totaltopFinal1 = totalTop1 + totalTop3 + totalTop5 + totalTop7;
}
        overallCompletion = totaltopFinal + totaltopFinal1;
}

Ответы [ 3 ]

0 голосов
/ 28 января 2012

Прежде всего, я бы лично переформулировал эти блоки if в блок «switch», что делает его немного более читабельным.

При этом причина того, что вы получаете исключение, точно так же, как упоминала Зия Вэй: «у компилятора нет способа узнать, будут ли у вашей переменной t такие значения, что условия (t==30)и (t==45) будет удерживаться во время выполнения вашей программы. В этом случае нет никакой гарантии, что строка overallCompletion = totaltopFinal + totaltopFinal1; может быть вычислена, поскольку переменные totaltopFinal и totaltopFinal1 не имеют существующих значений.

Попробуйтечто-то вроде этого:

double myVariable;
while(t!=0){
  switch(t){
    case(30): 
      // do stuff
      myVariable = X;
      break;
    case(45): 
      // do other stuff
      myVariable = Y;
      break;
    default: 
      // do fallback stuff (if necessary)
      myVariable = Z;
  }
  // do whatever you'd like to do with myVariable
}

В качестве альтернативы это может дать начальное значение перед циклом, как упоминалось в предыдущем ответе Зияо Вэя. В качестве последнего комментария вы можете прочитать о переменной области/ видимость, чтобы прояснить некоторые вещи.

0 голосов
/ 28 января 2012

Java справедливо жалуется, что totaltopFinal и totaltopFinal1, возможно, не были инициализированы в тот момент, когда вы пытаетесь использовать их для вычисления overallCompletion.Возможным решением может быть инициализация их начальным значением (например, 0) перед циклом while.

У вашего кода также есть другая проблема.Предположим, что в начале цикла t имеет ненулевое значение, отличное от 30 и 45: ваш цикл никогда не закончится!

Я предлагаю вам внимательно просмотреть то, что вы пытаетесьдостичь с этим куском кода.

0 голосов
/ 28 января 2012

Вы можете либо инициализировать его в else, либо инициализировать, заявив:

double totaltopFinal = 0;
double totaltopFinal1 = 0;

Если вы этого не сделаете, нет гарантии, что t будет 30 или 45, поэтому totaltopFinal и totaltopFinal1 может не инициализироваться, как сообщается компилятором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...