2013-04-29 2 views
0

이미 기존 클래스를 확장하여 예외를 throw 할 수 있습니까? 예를 들어, 항목이 이미있는 경우 다음 코드에 대한 예외를 만들 수 있습니까?Java : 예외 작성

public Entry(String paramString1, String paramString2, String paramString3, String paramString4, String paramString5) 
    { 
    this.firstName = paramString1; 
    this.lastName = paramString2; 
    this.street = paramString3; 
    this.town = paramString4; 
    if (paramString5.matches("[A-Z]{2}[0-9]{1,2} [0-9]{1,2}[A-Z]{2}")) { 
     this.postCode = paramString5; 
    } else { 
     System.err.printf("Bad postcode: '%s'\n", new Object[] { paramString5 }); 
     this.postCode = "???"; 
    } 
    } 

주소록 클래스 :

public String add(Entry paramEntry) 
    { 
    if (paramEntry == null) 
     return "Error: null entry"; 
    if (this.data.contains(paramEntry)) { 
     return "Error: this entry already in the book"; 
    } 
    boolean bool = this.data.add(paramEntry); 
    if (bool) { 
     return " entry added"; 
    } 
    return "entry could not be added"; 
    } 

엔트리 클래스 (I 연장 그냥 표시하는 메시지가 아닌 오류 처리를 포함해야 할 필요가 왜 ... 따라서 클래스를 수정 드릴 수 없습니다)

내가 인터넷을 검색하여 발견 한 다음 쉽게 따라하는 웹 사이트 : http://www.tutorialspoint.com/java/java_exceptions.htm http://www.c-sharpcorner.com/UploadFile/433c33/defining-your-own-exception-class-in-javacustom-exception/

내가해야 할 일인가요? (초보자 용의 미안)

답변

2

첫 번째 질문에 '정말로 예외를 던지고 싶습니까?' 예외는 발생하지 않아야하는 이벤트 (예 : IOException)에만 사용해야합니다. 사용자 입력의 유효성을 검사하기 위해 Validator을 사용합니다.

+1

사실입니다. 예외는 예외적 인 조건만을위한 것입니다. 유효하지 않은 사용자 입력은 올바르게 검증해야합니다. – Kai

+0

그러나 상위 클래스는 변경할 수 없으므로 (따라서 메서드의 서명) 제약 조건이 있으므로 유효성 검사기에서 반환 값을 추가 할 필요가 없습니다 (확인되지 ​​않은 예외로 래핑하지 않음). – denis

+0

잘 던지는 예외도 변경을 초래합니다. 예 : '예외를 던집니다 .' 그것은 단지 두 가지 표준에 대한 추론 일뿐입니다. – Aquillo

0

후 확장 된 클래스와 오버라이드 (override)에 필요한 방법 할 수 있습니다 예외가 뭔가처럼 던져 질 경우 반환 값 또는 결정을 내려야하는 업데이트 필드를 확인 :

public String add(Entry paramEntry) //overridden 
    { 

    String val = super.add(paramEntry); //call actual method 

    if(val.equals("entry could not be added")) //check for exception condition 
     throw new OperationException(val);//runtime exception 

    return val; 
    } 

public class OperationException extends RuntimeException { 

    public OperationException() { 
     super(); 
    } 

    public OperationException(String message, Throwable cause) { 
     super(message, cause); 
    } 
    public OperationException(String message){ 
     super(message); 
    } 

    public OperationException(Throwable cause) { 
     super(cause); 
    } 
} 
1

가 아니, 당신은 클래스를 무시하고 추가 할 수 없습니다 (checked) 예외를 수퍼 클래스에없는 서명에 적용합니다. 따라서 AddressBook을 서브 클래스 화하고 add()을 오버라이드하여 새로운 검사 예외를 선언 할 수 없습니다. 귀하의 경우, 나는 심지어 add 메서드를 재정의 할 것을 제안하지 않을 것입니다. 근본적으로 IMHO가 잘못 되었기 때문입니다. add 메서드에서 문자열 (본질적으로 유효성 검사 오류)을 반환하는 것은 내가 권하고 싶은 것이 아닙니다. 이 경우 예외를 실제로 사용하려는 경우 메서드를 재정의하고 RuntimeException 인스턴스를 throw 할 수 있습니다. 하지만 실제로 돼지의 립스틱 일뿐입니다.

+0

당신이 옳았습니다. 내 대답에 문제를 지적 해 주셔서 고마워요. . 이미 삭제했습니다. :) 예, 재정의에 체크 된 예외를 도입 할 수는 없으며이를 잊어 버렸습니다. :) +1. – Jops

0

우선 확장 클래스는 예외를 throw하는 것과 관련이 없습니다. 알고 싶은 것은 당신이 예외를 던질 수 있는지 여부입니다. 수퍼 메소드가 예외를 throw하지 않는 경우 대답은 아니오입니다. how to override when exceptions are there

+0

일종의 사실. Error 또는 RuntimeException의 하위 클래스 인 검사되지 않은 예외를 항상 throw 할 수 있습니다. – emory

1

RuntimeException의 sume 하위 클래스를 사용해 볼 수 있습니다.

이 경우 상위 클래스의 메소드 서명은 동일하게 유지되지만 하위 클래스에서이 예외를 throw 할 수 있습니다. 예를 들어

, 예외 코드 :

public class MyException extends RuntimeException 
{ 
    public MyException(String message) 
    { 
     super(message); 
    } 
} 

그리고 엔트리 클래스 :

public Entry(String paramString1, String paramString2, String paramString3, String paramString4, String paramString5) 
{ 
    this.firstName = paramString1; 
    this.lastName = paramString2; 
    this.street = paramString3; 
    this.town = paramString4; 
    if (paramString5.matches("[A-Z]{2}[0-9]{1,2} [0-9]{1,2}[A-Z]{2}")) { 
     this.postCode = paramString5; 
    } else { 
     throw new MyException(String.format("Bad postcode: '%s'\n", new Object[] { paramString5 })); 
    } 
} 

당신은 어딘가에서 예외를 처리해야합니다 입력하거나 주소록도 이후

try 
{ 
    /* create entry etc. */ 
} 
catch(MyException e) 
{ 
    /* ... */ 
} 

샘플에서 실제로 Entry가 서브 클래스라고 가정하는 모든 것을 확장합니다.

주소록은 비슷한 방식으로 변경할 수 있습니다.

부모 클래스를 변경할 수없는 경우 일시적인 해결책이 될 수 있습니다. 부모 클래스를 변경할 수 있다면 확인 된 예외를 사용합니다.

0

클래스를 확장 할 때 Liskov 대체 원칙을 따라야합니다.

구체적으로 말하자면 사용자가 Parent 형식의 개체를 사용할 수있는 모든 상황에서 그는 Child 형식의 개체도 사용할 수 있어야합니다.

분명히 (체크 된) 예외를 추가하면이를 위반하는 것으로 나타납니다. 클라이언트 클래스가 Parent 클래스를 사용하고 있었다면 예외에 대한 throw 절이나 try/catch가 없었습니다. 따라서 Child 클래스와 교체해야한다면 코드가 무효화됩니다.

아니, 할 수 없습니다.

RuntimeException을 추가 할 수 있지만 여전히 좋은 생각이 아닙니다.

http://en.wikipedia.org/wiki/Liskov_substitution_principle