2016-06-24 6 views
0

저는 Java에 비교적 익숙하지 않습니다.이 문제를 해결할 방법을 찾지 못했습니다. 내가 잡기/EX2 처리를 제거 할 때 불평하지 않습니다 반면Java 예외 처리 : 누락 된 반환 형식

이제
// Ex2 is a child of Ex1 
public T method(someType someArg) throws Ex1{ 
    try{ 
    someFunc() // Throws both Ex1 and Ex2 
    T ret = someOtherFunc() //Throws Ex1, cannot declare/initialize ret outside 
    return ret 
    } catch(Ex2){ 
    //do something 
    } catch(Ex1){ 
    //do something 
    } 

} 

자바는 반환 형식 누락에 대해 불평 :

여기 내 코드입니다.

+0

예외가 런타임에 일어나는 일입니다. 당신이 가진 것은 에러를 컴파일하는 것입니다. – Andreas

답변

2

귀하의 방법은 T을 반환해야하며, 마지막 진술로 return null;을 추가 할 수 있습니다. 당신은 단지 예외를 잡기 다음 방법은 올바르게 오류를 처리하고, 그들을 로그인/취급 후에는 예외를 던지는되지하지만 아무것도 반환하지 않는 경우 또는 가시성 (및 기본값) ret

public T method(someType someArg) throws Ex1{ 
    T ret = null; 
    try{ 
    someFunc(); // Throws both Ex1 and Ex2 
    ret = someOtherFunc(); 
    } catch(Ex2){ 
    //do something 
    } catch(Ex1){ 
    //do something 
    } 
    return ret; 
} 
+0

그러나 Ex2에 대한 catch 블록을 제거하고 Ex1 만 처리하면 코드가 컴파일됩니다. 나는이 행동을 이해하고 싶다. –

+0

@FayazAhmed 그런 다음이 catch 블록 내부의 코드를 숨기는 것이 좋습니다. 그러나 일반적으로 말해서 : 당신은 예외를 던짐으로써 return 문이나 return을 필요로합니다. 'catch Ex2'는 후자가 아니기 때문에'return'이 필요합니다. 'catch Ex1'은 예외를 다시 throw하거나 새로운 예외를 throw합니다. – Tom

1

같은 수정 (붐, 컴파일 오류).

예외를 직접 처리하려면 null (또는 다른 적절한 값이 유효하지 않음)을 반환하거나 catch 된 예외를 다시 throw해야합니다. 당신이 (EX1 이외의) 예외를 다시 발생하기 위하여려고하는 경우에

, 당신은 예를 들어, 메소드 서명

에 추가해야합니다 :

// Ex2 is a child of Ex1 
public T method(someType someArg) throws Ex1{ 
    try{ 
    someFunc() // Throws both Ex1 and Ex2 
    T ret = someOtherFunc() //Throws Ex1, cannot declare/initialize ret outside 
    return ret; 

    } catch(Ex2 ex2){   
    // either re-throw the exception (or return null instead) 
    throw ex2; 

    } catch(Ex1 ex1){   
    // or return a null value (you can re-throw the exception instead) 
    return null; 
    } 
    // you can also return null here if you want to catch/handle both exceptions separately but want to return null in either case 
    // return null; 
}