2012-11-28 4 views
49

좋은 프로그래밍 방법이라고 생각하기 때문에 모든 변수 (로컬 변수 또는 인스턴스 변수)를 final 변수에 한 번만 쓰도록 작성했습니다.try/catch를 사용한 최종 변수 할당

는 그러나, 나는 변수 할당이 예외를 던질 수있을 때 당신이 최종 변수 말했다 할 수없는 것을 알 수 :

final int x; 
try { 
    x = Integer.parseInt("someinput"); 
} 
catch(NumberFormatException e) { 
    x = 42; // Compiler error: The final local variable x may already have been assigned 
} 

임시 변수에 의존하지 않고 할 수있는 방법이 있나요? (또는 최종 수정자를위한 적절한 위치가 아닙니까?)

+1

임시 변수없이이 작업을 수행 할 수 있을지 의심 스럽습니다. – NPE

+8

'final int x = makeX();'틀림없이. (try-catch in function) –

+2

JDK [여전히'tryParse']가 없다는 사실에 놀라움 (http://stackoverflow.com/questions/1486077/java-good-way-to-encapsulate-integer-parseint) . –

답변

44

임시 변수를 입력하면됩니다 (그러나).하지만 그렇게하고 싶지 않다고 말한 것입니다.

또 다른 방법은 함수에 코드의 두 가지를 이동하는 것입니다 :

이 실용적입니다 여부
final int x = getValue(); 

private int getValue() { 
    try { 
    return Integer.parseInt("someinput"); 
    } 
    catch(NumberFormatException e) { 
    return 42; 
    } 
} 

정확한 사용 사례에 따라 달라집니다.

모두 x이 적절하게 범위가 지정된 로컬 변수 인 경우 가장 실질적인 일반적인 접근 방법은 final이 아닌 것일 수 있습니다. 반면에, x는 멤버 변수 인 경우

, 내 조언을 초기화하는 동안 비 final 일시적를 사용하는 것입니다 :

public class C { 
    private final int x; 
    public C() { 
    int x_val; 
    try { 
     x_val = Integer.parseInt("someinput"); 
    } 
    catch(NumberFormatException e) { 
     x_val = 42; 
    } 
    this.x = x_val; 
    } 
} 
+0

로컬 범위의 경우 사용자 동의에 동의하지만이 값은 인스턴스 변수에서 가장 자주 발생합니다. – dtech

+0

나는 정적 변수 getValue()에 대한 정적 참조를 만들 수 없다는 오류를 반영 할 수 있다고 생각합니다. 그래서 정적 함수를 사용한다고 가정합니다. private static int getValue() .. @ NPE – gks

+0

If this.x는 Integer와 같은 객체 유형이므로 좀 더 (슬프게도) 필요합니다. 선언되지 않은 x_val을 그대로두면 컴파일러는 초기화되지 않았다고 불평 할 것입니다. catch 블록의 폴백 (fall-back)이 null 인 경우, 미리 초기화하여 null로 설정하고 명확하게하기 위해 캐치에 null을 중복 할당 (즉, 내 기본 설정)하거나 빈 캐치가 필요합니다. –

2

아니, 올바른 장소가 아니다을, 당신이있어 상상 이상 then try and catch 블록에서 1 Statement, 첫 번째 문장은 : x = 42입니다. 다른 문장 뒤에는 try 블록이 실패하고 catch 블록으로 이동합니다. 여기서 catch x = 30. 이제 x를 두 번 정의했습니다.

+9

컴파일러는 어떤 명령문이 어떤 예외를 throw하는지 알만큼 똑똑합니다. 그것은 모든 경우에 가능하지 않을 수도 있지만, 컴파일러가 어떤 경우에는 최종 코드가 작동하는지 알아낼 수있는 데드 코드 등을 알 수 있습니다. – Stefan

+0

@Stefan이 말한 것을 지원하기 위해 Clang은 Swift를 컴파일 할 때 이것을 알아낼 수 있습니다. –