Переменная, казалось, не инициализирована
import java.util.Scanner;
public class finnTall {
public static void main(String[]args){
int antallTall;
int antallLest;
double nesteTall;
double minsteVerdi;
double nestMinsteVerdi;
Scanner tast = new Scanner(System.in);
System.out.println("Hvor mange tall?");
antallTall = tast.nextInt();
tast.nextLine();
antallLest= 1;
System.out.println("Skriv første tall: ");
minsteVerdi = tast.nextDouble();
tast.nextLine();
for(antallLest=1;antallTall>antallLest;antallLest++){
System.out.printf("Skriv %d. tall: ",antallLest+1);
nesteTall = tast.nextDouble();
tast.nextLine();
if(nesteTall>minsteVerdi)
nestMinsteVerdi=nesteTall;
if(nesteTall<minsteVerdi)
nesteTall = minsteVerdi;
if(nesteTall>minsteVerdi && nesteTall<nestMinsteVerdi)
nestMinsteVerdi = nesteTall;
}
System.out.printf("Minste verdien av tallene du har oppgitt er: %f\n",minsteVerdi);
System.out.printf("Nest minste verdi av tallene du har oppgitt er: %f\n",nestMinsteVerdi);
tast.close();
}
}
Это программа, которая должна рассчитывать наименьшее и второе наименьшее число, которое предоставляет пользователь.
Почему-то написано, что локальная переменная nestMinsteVerdi
не инициализирован, и я не могу понять, почему или где ошибка. Я боролся с этим в течение хороших 2 часов.
Заранее спасибо.
2 ответа
В Java локальная переменная должна иметь определенно назначенное значение, прежде чем ее значение будет доступно.
Вы объявляете свою локальную переменную без присвоения ей значения. Это нормально в Java, потому что компилятор гарантирует, что вы передадите ему значение перед его использованием.
double nestMinsteVerdi;
Затем установите его, если условие истинно:
if(nesteTall>minsteVerdi)
nestMinsteVerdi=nesteTall;
Затем получить доступ к нему в условном if
заявление. Но если вышеприведенные условия были ложными, значение nestMinisteVerdi
еще не будет назначен.
if(nesteTall>minsteVerdi && nesteTall<nestMinsteVerdi)
nestMinsteVerdi = nesteTall;
Поскольку существует хотя бы один способ выполнения кода, при котором значение не присваивается, компилятор жалуется. Это хорошая вещь. Случайно неинициализированные переменные могут быть частым источником дефектов.
Из Спецификации языка Java, Глава 16: Определенное Назначение:
Идея определенного присваивания заключается в том, что присваивание локальной переменной или пустому конечному полю должно происходить на каждом возможном пути выполнения к доступу.
Энди Томас ответ правильный. Вы не присваиваете значение переменной.
double nestMinsteVerdi;
Компилятор не разрешит вам запускаться, потому что единственное присваивание находится в условном выражении, которое может потерпеть неудачу, и в случае сбоя переменной не будет присвоено значение. Поскольку код нельзя сравнивать с переменной без значения, это нарушит выполнение, поэтому компилятор не допустит этого.