2011-09-19 15 views
2

해당 라인은 return pFile.exists() ? true : null;입니다. 컴파일 오류가 발생하지 않으므로 이에 대한 설명은 무엇입니까? 결국 NPE을 모금했습니다.설명이 필요 : 자바의 3 진 연산자

import java.io.File; 
public class Main { 
    public static void main(String... args) { 
    boolean accept = accept(new File("")); 
    System.out.println("accept = " + accept); 
    } 
    public static boolean accept(File pFile) { 
    System.out.println(pFile.exists()); // prints: false, so pFile is not null 
    return pFile.exists() ? true : null; //this line should throw compilation error 
    } 
} 

pFilenull 아니다; 보시다시피 File이 인스턴스화됩니다. 그러나 분명히 그 파일은 존재하지 않습니다. 질문은 pFile에 관한 것이 아닙니다. 나는 운영자가 null을 다루는 방법에 관심이있다.

+0

그냥'pFile.exists()'를 돌려 보내지 않는 이유는 무엇입니까? –

+0

accept (File pFile) 메소드의 본문을 다음과 같이 바꿉니다 :'return (pFile == null)? 거짓 : pFile.exists();'또는 삼항 연산자를 사용하는 대신'return (pFile! = null) && pFile.exists();'라고 말할 수 있습니다. – styfle

+0

내 편집을 참조하십시오. 예, 나는'return pFile.exists();을 쓸 수 있습니다. – Kowser

답변

7

사용자 코드는 동일하다. null이 언 박싱 된 경우 예외가 발생합니다. Java 언어 명세 section 15.25 가입일

는 :

그렇지 않으면 제 2 및 제 3 피연산자 타입 각각 S1과 S2로한다. T1을 복싱 변환을 S1에 적용한 결과 유형을 T2를 복싱 변환을 S2에 적용한 결과의 유형이라고 가정합니다. 조건식의 타입은 lub (T1, T2) (§15.12.2.7)에 캡쳐 변환 (§5.1.10)을 적용한 결과입니다.

나는 그것이 분명할만한 것은 아니지만 여기에 해당되는 경우라고 생각합니다.

+0

멋진 답을 얻었습니다. 그리고 이것은 제가 찾고 있던 것입니다. – Kowser

+0

@ 존, 솔직히 말해서, 나는 당신의 대답이 정확하지만 지나치게 강조하고 정확히 그 지점을 찾지 못합니다. 실제로, 문제가있는 것은 없다 - 어떤 표현식'pFile.exists()의 자동 - 언 박싱인가?)을 가진 삼항 연산자 스펙을 인용하셨습니까? true : null'. –

+0

@Piotr : 그러나 그 표현식의 타입은'Boolean'인데,이 타입은 unboxed입니다. 따라서 조건부 연산자의 실행이 실패한 것은 아닙니다. 실행 후 변환 단계 *입니다. 나는 그것이 중요한 측면이라고 생각한다. –

-1

실제로 빈 문자열file을 만드는 데 사용됩니다. 그 결과 접두어 (또는 디렉토리)가없고 빈 이름 순서가없는 빈 abstract pathname이됩니다. 따라서 창은 file을 만들 수 없습니다. 차례로 이것은이 NPE

+0

제발, 내 편집을 참조하십시오 – Kowser

2

당신은 boolean 반환으로 정의 된 함수의 Boolean null 반환 던지고있다 (기본 유형을, 작은 b주의). null 값은 자동으로 박스에서 제외되고 NPE를 나타냅니다. 다른 단어

public static boolean accept(File pFile) { 
    System.out.println(pFile.exists()); // prints: false, so pFile is not null 
    Boolean tmp = pFile.exists() ? true : null; 
    return (boolean) tmp; 
} 

이 조건 연산자의 유형이 경우 Boolean이며, 그 값은 boolean 돌아 박싱 되 :

+0

나는 당신의 방식으로 시도도 ... 똑같은. – Kowser

+0

그래서 표현식이'Boolean'을 입력하고 상자를 열고'null'을 언 박싱합니다 ...? 그냥 .. 멍청 아. –

+0

'pFile.exists()의 결과를 변환합니까? true : auto-unboxing을 사용하여'boolean '에 null ('null')을 지정합니다. 'null'의 자동 언 박싱은 NPE –

관련 문제