变量似乎没有被初始化

时间:2014-09-09 22:04:19

标签: java variables initialization

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 个答案:

答案 0 :(得分: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

  

明确赋值背后的想法是,必须在访问的每个可能的执行路径上发生对局部变量或空白最终字段的赋值。

答案 1 :(得分:0)

安迪·托马斯的回答是正确的。您没有为变量赋值。

double nestMinsteVerdi;

编译器不允许您运行,因为唯一的赋值是在一个可能会失败的条件内,如果失败,则不会为变量赋值。由于代码无法与没有值的变量进行比较,这会破坏执行,因此编译器不会允许它。