2012-05-21 2 views
0

하나의 요소 만있는 목록을 예상하는 메서드에서 예외를 throw하고 예외를 throw하고 싶습니다. 리스트에 복수형이있는 경우. 이 경우에 던져 넣을 적절한 기존 Java 예외가 있는지 확인하려고합니다. 나는 here 목록을 보았지만 올바른 것으로 튀어 나온 것을 보지 못했습니다.하나의 값만 필요하지만 많은 요소가있을 때 throw하는 기본 제공 예외

이 경우 나는 메서드가 개체의 특성으로 해당 목록을 참조하고 있다고 예상하여 개체의 메서드를 호출하고 있습니다. 그래서 실제로 배열을 전달하지 않습니다. 인덱스도 인수로 전달하지 않습니다.

(설명을 위해 수정 됨)

답변

4

당신이 주어진 입력을 의미하는 것을 시도하고 있기 때문에이 같은 이유를 알리는 메시지와 함께 IllegalArgumentException를 사용한다 유효한 아니다.

throw new IllegalArgumentException("Input specified has more elements then expected"); 

그렇지 않으면 고유 한 조건을 정의하는 Exception을 가질 수 있습니다.

예외 상황의 요소 인 숫자 때문에 생각해 보았지만 주어진 시나리오에서 의미가있는 IndexOutOfBoundsException을 사용할 수도 있습니다.

throw new IndexOutOfBoundsException("Expected size is 1, submitted input has size " + list.size()); 

편집 : 메서드 호출의 일부가 아니지만이 경우 list.size() > 1에, 그 방법 호출되는 객체에 속하는 목록을 감안할 때 주석

당으로 객체가 올바른 상태와 함께 아니하는 것을 의미 적절한 오류 메시지가 포함 된 IllegalStateException 또는 IllegalStateException 사용자 지정 버전이 더 적절할 것입니다.

+0

흠 동안 nperformed있다, 나는 그것에 대해 생각했다, 그러나이 경우 내가 기대와 객체의 메소드를 호출하고하는 방법은의 속성으로 목록을 말했다 참조하고 있음 목적. 그래서 실제로 배열, 또는 인수로 인덱스를 전달하는, 그래서 아마도 IllegalArgumentException 계산서에 맞지 않았을 생각. 아마 내가 정의한 메서드를 호출하는 것은 인수 (또는 아마도 메서드의 서명을 다시 생각해 봐야 함)로 간주됩니다. –

+0

@ JoshDiehl : 사실, 당신의 질문은 당신이하고 싶은 것을 묘사하지 않습니다. 상황을 나타내는 소량의 코드를 포함하여 귀하의 질문을 수정하십시오. –

+0

@ JoshDiehl 나는 나의 대답을 편집했다 – mprabhat

3

자신이 예외를 만들 수 있습니다.

public MyException extends Exception { 
} 

if(list.size() > 1) { 
    throw new MyException("Expected only 1 element, found: " + list.size()); 
} 
0

당신은 같은 방법으로하는 오류를 던질 수있는이

public void someMethod(List<MyClass> myList) throws NullPointerException, IllegalArgumentException { 
    if (myList == null) 
     throw new NullPointerException("myList parameter can't be null"); 
    if (myList.size() > 1) { 
     throw new IllegalArgumentException("myList parameter must contain only 1 parameter"); 
    } 
    //your code here... 
} 

프로퍼티 그래서 그냥 새 메시지를 표시하도록 설정을 변경해야합니다 파일에 더, 오류 메시지를 설정하는 것이 좋습니다 것 코드를 수정하여 오류 메시지를 다시 작성해야합니다.

1

목록이 메서드를 호출하는 개체의 필드이면 잘못된 크기의 목록이있는 개체의 상태가 잘못되어 IllegalStateException이 적합하다고 말할 수 있습니다.

하지만 정말로이 목록을 스칼라 입력란 (List<Foo>Foo이 됨)으로 대체해야하므로이 상황이 발생할 수 없습니다.

0

내가 사용 사례를 이해 확실하지 않다, 그래서이 대답은 기본 떨어져있을 수 있습니다,하지만 난 if 또는 switch

  1. 를 사용하여 이상 AssertionError를이 방식의

    List <T> answers ; // expection a list of size one 
    assert 1 == list . size () : "The programmer expects that there will be one and only one answer" 
    /* 
    In development: assertions enabled, 
    If there are zero answers, the program will crash on the assertion. 
    If there are multiple answers, the program will crash on the assertion. 
    Only if there is exactly one answer will it proceed to the below line (and work correctly). 
    In production: assertions disbled, 
    If there are zero answers, the program will throw a RuntimeException on the below line. 
    If there are multiple answers, the program will proceed to the below line (and appear to work). 
    If there is only one answer, the program will proceed to the below line and wok correctly. 
    */ 
    T answer = answers . get (0) ; 
    

    장점을 제안 일부 코드 커버리지 도구는 브랜치의 단위 테스트를 작성하기를 원할 것입니다.

  2. 분기가 순환 복잡성을 증가시킵니다.
  3. 평가 만 개발
관련 문제