2014-01-22 2 views
1

컴파일러에서 데이터 필드 f이 초기화 될 것이므로 다음 코드는 컴파일되지 않습니다. 이걸 어떻게 고치 죠?루프 내에서 데이터 필드를 어떻게 초기화합니까?

import java.util.Scanner;

public class Foo 
{ 
    private final int f; 
    /*constructor*/ 
    public Foo() 
    { 
     Scanner sc = new Scanner(System.in); 
     for(int i = 0; i < 10; i++) 
       { 
        if(i == 5) 
         f = sc.nextInt();//error: variable f might be assigned in a loop 
       } 
    } 

    public Foo(int i) 
    { 
      j = i;//no problem 
    } 
} 

언어의 결함의 종류가 아니기 때문에 내 다른 생성자에서 나는 finalf 세트를 가질 수 있으며,이 루프에서하지 그냥 때문에 작동합니다. 나는 컴파일러 (벙어리 인)가 루프를보고 f이 재 할당 될 것이라고 생각하지만 프로그램의 논리는 한 번만 발생하는 것을 보장합니다. 이것은 Java가 프로그래머를 "보호"하는 방법의 예입니까?

궁극적으로 왜 f이 최종 Netbeans으로 선언되었는지 궁금해 할 때, 아마도 코드가 많이 다른 경우 일 것입니다.

+1

왜 최종 f를? 당신이 iterating하고 그것을 격일로 할당 할 때? – Hrishikesh

+0

"마지막"을 버리시겠습니까? – Fildor

+0

이유는 f가 최종이기 때문입니다. – Hrishikesh

답변

2
private final int f; 
     ↑ 

final 키워드를 제거하십시오. 컴파일러는 if 한 번만 만족하실 것 모르는 당신은 f 여러 번 변경하려고에 대한 오류가 발생합니다 :

마지막 필드 (F)가 이미 할당 된 수

+0

@ user2864740 고마워, 네 말이 맞아, 나는 그것을 제거했다. – Maroun

+0

오, 나는 그 대답을 조금 좋아했다. – user2864740

1

을 첫째, 최종 필드는 할당 된 값을 변경할 수없는 필드입니다. 각 루프 이동에서 해당 값을 변경하여 컴파일 할 수 없습니다. f 전에 마지막 단어를 제거하십시오.

public class Foo 
{ 
    private int f; 
    /*constructor*/ 
    public Foo() 
    { 
     Scanner sc = new Scanner(System.in); 
     for(int i = 0; i < 10; i++) 
       { 
        if(i == 5) 
         f = sc.nextInt(); 
       } 
    } 
} 
+0

이제 f는 최종적인 것이 아닙니다 : D 위 참조. – RMachnik

+0

미리 답변 해 주셔서 감사합니다. – RMachnik

0
private final int f; 

당신은 당신의 선언에 대한 최종 사용

f를 마지막 변수는 일단 을 초기화 할 수 있습니다이이 초기화를 통해 하나, 다른 값을 다시 할당 할 수 없습니다 또는 과제 문. u는 마지막으로 어떤 변수를 선언 할 때

here 최종

그래서 그냥

private int f; 
0

사용에 대한 자세한 내용을 읽고, 그 값의 값은 방법은 changed.By 어떤 필요가해서는 안 변수를 최종 변수로 선언 하시겠습니까?

1

너는하지 마.

저는 컴파일러 (바보가 됨)가 루프를보고 f가 재 할당 될 것이라고 생각하지만 프로그램의 논리는 한 번만 발생하는 것을 보장합니다. 이것은 Java가 프로그래머를 "보호"하는 방법의 예입니까? 이 프로그래머를 "보호"여부를

이 문제는, Java 언어합니다 (JLS 당) 어떻게 컴파일러가 제대로 언어 사양을 적용 정의하는 방법의 결과이다.

4.12.4. final Variables :

최종 변수는 할당 될 수

에 한번 .. 최종 변수는 (§16) 직전 명확히 지정되지 않는 한 지정된 경우는 컴파일 타임 오류 과제에.

자세히 이 제한 정적 분석의 경우에 대한 규칙을 설명 Chapter 16. Definite Assignment 참조.

0

여기 catch가 있습니다. 동일한 위치 또는 생성자 내에서 최종 인스턴스를 초기화 할 수 있지만 메서드 내부에서 초기화 할 수 없습니다 (METHOD).
그래서 생성자 내부에서 초기화 중입니다. 하지만 그것은 컴파일러가 식별하고 컴파일러 오류를 던지는 for 루프 내에서 최종 인스턴스 변수의 값을 여러 번 변경하는 것입니다.

컴파일러 인라인 최종 코드는 아래와 같습니다.

private final int f = 10 //even if you initialize it inside the constructor only one time. 

public class Foo { 
     private final int f; // byte code becomes 'private final int f = 10' for each instance 

     Foo() { 
      f = 10; 
     } 
    } 
관련 문제