2014-09-09 19 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에서는 괜찮습니다.

if(nesteTall>minsteVerdi) 
    nestMinsteVerdi=nesteTall; 

그런 다음 if 문장의 조건에 액세스 : 조건에 해당하는 경우

double nestMinsteVerdi; 

는 그런 설정합니다. 그러나 위 조건이 거짓 인 경우 nestMinisteVerdi 값이 지정되지 않았습니다.

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

값을 할당하지 않은 코드를 실행하는 방법이 하나 이상 있으므로 컴파일러에서 불평합니다. 이것은 좋은 것입니다. 실수로 초기화되지 않은 변수는 자주 결함이 될 수 있습니다. Java 언어 사양에서

, Chapter 16: Definite Assignment :

명확한 할당 뒤에 아이디어는 지역 변수 또는 빈 마지막 필드에 할당이 접근 가능한 모든 실행 경로에서 발생해야한다는 것입니다.

+0

나는 당신이 말하는 것을 얻지 만 동시에 나는 그렇지 않습니다. 코드에서 변경해야 할 부분은 무엇입니까? 직접보고 싶지 않다면 –

+1

실행 중에 코드를 통해 어떤 경로를 취했는지에 관계없이'nestMinsteVerdi'가 값을 사용하기 전에 값을 주어야합니다. 한 가지 방법은 선언에'double nestMinsteVerdi = 0.0' (또는 어떤 값이든간에)의 기본값을 제공하는 것입니다. 또 다른 경우는 if (nesteTall> minsteVerdi)에 대한 'else'케이스입니다. –

+0

@Bendik 세 번째 방법은 'boolean' 플래그 변수를 사용하여 값을 찾았는지 여부를 추적하고 값을 찾지 못한 경우 끝에 출력하지 않는 것입니다 그것에 할당 할 수 있습니다. –

0

앤디 토마스의 대답은 정확합니다. 변수에 값을 지정하지 마십시오.

double nestMinsteVerdi; 

컴파일러는 유일한 할당이 생각할 실패 할 수있는 조건 내에 때문에 실행을 허용하지 않으며, 그것이 실패한다면, 변수는 값이 할당되지 않습니다. 코드는 값이없는 변수와 비교 될 수 없기 때문에 실행을 중단하므로 컴파일러에서이를 허용하지 않습니다.

관련 문제