2012-11-13 5 views
0

다음은 다른 누군가가 작성한 클래스입니다.NumberFormatException 캐치

내가 직면 한 문제는 parse methodnull as the rawString이 들어갈 때 NumberFormatException을 던지고 있다는 것입니다.

내가 생각한 것은 NumberFormatException과 set the value itself as null을 잡아야한다는 것입니다. 그래서 내가했던 방식이 옳은가?

public class ByteAttr { 

    @JExType(sequence = 1) 
    private Byte value; 

    public static ByteAttr parse(String rawString) { 
     ByteAttr attr = new ByteAttr(); 
     try { 
      attr.setValue(Byte.valueOf(rawString)); 
     } catch (NumberFormatException nfEx) { 
      attr.setValue(null); 
     } 
     return attr; 
    } 

    public Byte getValue() { 
     return this.value; 
    } 

    public void setValue(Byte value) { 
     this.value = value; 
    } 
} 
+0

IMO 값이 없음을 나타 내기 위해 0 또는 -1을 설정하는 것이 좋으며 나중에 프로그램/응용 프로그램에 'NullPointerException'이 없어야합니다. –

+3

@ LuiggiMendoza 나는 동의하지 않는다. null 값은 완벽하게 받아 들일 수 있으며 nullchecks는 나중에 프로그램에서 사용되어야합니다. '0'과'-1'은 모두 유효한 값이므로, 그것들이 부족하다는 것을 나타내는데 사용되어서는 안됩니다. – Vulcan

+0

@ Vulcan 디자인에 따라 다릅니다. 그것이 내가 IMO라고 말한 이유입니다 :). 당신은 유효한 포인트를 가질 수 있었지만, 실제 코드에 도달하기 전에 널 체크를 많이 발견했기 때문에 널 대신에 디폴트 값을 선호하고 nullchecks와 NPE를 많이 선호합니다. –

답변

6

정확한 접근 방법은 프로그램에서 수행하고자하는 작업에 따라 다릅니다.

  • 이 프로그램에서 나중에 null을 반환 ByteAttr.getValue()에 대한 의미가 있다면, 당신의 접근 방식이 작동 할 수있다.
  • 그러나 설명 할 수없는 인수 (null 포함)와 함께 parse을 호출하는 경우 이어야하는지 여부를 고려해야합니다. 대안은 NumberFormatException을 잡아 내고 프로그램에서 의미 론적 의미를 갖는 다른 예외를 throw하는 것입니다.
 
    public static ByteAttr parse(String rawString) throws BadAttributeException { 
     ByteAttr attr = new ByteAttr(); 
     try { 
      attr.setValue(Byte.valueOf(rawString)); 
     } catch (NumberFormatException nfEx) { 
      throw new BadAttributeException(nfEx); // wrap original exception 
     } 
     return attr; 
    } 
  • 또 다른 기술은 rawString이 판독 할 때 그 경우에 parse에 기본 값을 전달하는 것입니다 :
 
    public static ByteAttr parse(String rawString, Byte defaultValue) { 
     ByteAttr attr = new ByteAttr(); 
     try { 
      attr.setValue(Byte.valueOf(rawString)); 
     } catch (NumberFormatException nfEx) { 
      attr.setValue(default); 
     } 
     return attr; 
    } 
1

당신은 같은 조건으로 조기 종료를 추가 할 수 있습니다 : 당신도 null 값에 대한 해석 방법 시험의 확인 호출을하고있을 때 구문 분석을 호출 피할 수

if (rawString != null) { 
    return attr; // or other value you prefer 
} 

.

0

그것은 당신의 응용 프로그램에서 null 값의 허용 오차에 따라 달라집니다. 사용자가 parse() 메서드에 null 문자열을 전달하지 않을 것으로 예상되는 경우 방어적인 null 확인을 수행하고 예외를 throw해야합니다.

if (null == rawString) { 
    throw new CustomException("rawString cannot be null"); 
} 

같은 대신 자동으로 null로 바이트 속성의 값을 설정, 당신은 적절한 메시지와 함께 예외를 발생한다 NumberFormatException이의 catch 블록에 적용됩니다.

그러나 null이 완벽하게 수용 가능한 경우 방어적인 null 확인을 수행하고 Byte 속성을 null로 설정해야합니다. NumberFormatException은 반드시 IMHO로 표시하지 말아야합니다.

2

당신은 네 가지 작업을 수행해야합니다

  1. 당신이 방법을 사용 될에서 해석 할 수 문자열이 상황에서 무엇을 의미하는지 결정합니다. 그것은 프로그램의 내부 문제를 의미합니까? 파일이 손상 되었습니까? 사용자가 잘못 입력 했습니까? 틀린 것은 아니지만 문자열을 다르게 처리해야합니까?
  2. 계정을 고려하여 처리하는 가장 좋은 방법을 결정하십시오. 거의 언제나 외부 입력에 의해 오류가 발생하면 다시보고해야합니다. null 으로 바꾸는 것이 좋습니다.
  3. 당신이하기로 결정한 것을 문서화하십시오. 메소드가 특정의 의미를 가지는 null를 돌려 주려고하고있는 경우, 코멘트를 코멘트로서 기입 할 필요가 있습니다. Javadoc가 바람직합니다.
  4. 귀하의 결정을 이행하십시오.

나는 똑바로 뛰어 한 가능한 원인과 문제의 적절한보고를 통해 생각하지 않고, 4 단계로하는 것이, 아마도 부당 인상을 얻을.