2014-09-09 4 views
0
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 часов.

Заранее спасибо.

ответ

3

В Java локальная переменная должна иметь определенно присвоенное значение до того, как ее значение будет доступно.

Вы объявляете свою локальную переменную без присвоения ей значения. Это нормально в Java, потому что компилятор гарантирует, что вы дадите ему значение перед его использованием.

double nestMinsteVerdi; 

Затем установите его, если условие истинно:

if(nesteTall>minsteVerdi) 
    nestMinsteVerdi=nesteTall; 

Тогда доступ к нему в условном из if заявления. Но если вышеприведенное условие было false, значение nestMinisteVerdi еще не назначено.

if(nesteTall>minsteVerdi && nesteTall<nestMinsteVerdi) 
    nestMinsteVerdi = nesteTall; 

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

Из спецификации языка Java, Chapter 16: Definite Assignment:

Идея определенного присваивания является то, что присвоение локальной переменной или пустой конечного поля должно происходить на каждом возможном пути выполнения к доступу.

+0

Я получаю то, что вы говорите, но в то же время я этого не делаю. Что в коде нуждается в изменении? im не видеть прямой –

+1

Вам нужно убедиться, что перед тем, как вы попытаетесь использовать его, 'nestMinsteVerdi' получает значение независимо от того, какой путь через код выполняется во время выполнения. Один из способов сделать это - предоставить значение по умолчанию в своем объявлении - «double nestMinsteVerdi = 0.0» (или любое другое значение). Другим может быть случай 'else' для' if (nesteTall> minsteVerdi) '. –

+0

@Bendik Третий способ - следить за тем, нашли ли вы значение для него и задали его, скажем, с помощью переменной флага 'boolean', а не распечатывать ее в конце, если вы никогда не нашли значения назначить ему. –

0

Ответ Энди Тома правильный. Вы не присваиваете значение переменной.

double nestMinsteVerdi; 

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

Смежные вопросы