2013-03-30 3 views
3

나는 텍스트 파일에서 고정 길이로 구분 된 단어를 읽고 사전에 단어의 존재 여부를 조회하기 위해 TreeSet을 만듭니다.이 경우 예외를 올바르게 처리하려면 어떻게해야합니까?

그래서 분명히 어떻게 든 IOException을 처리해야합니다. 내 문제는 Dictionary 클래스에 오류 처리 책임이 있는지 아니면 Dictionary 객체를 만드는 코드에 해당해야합니까? 여기

내가 가진 무엇 :

public class Dictionary 
{ 
    private final TreeSet<String> stringSet = new TreeSet<>(); 

    // constructor 
    public Dictionary(String fileName) throws IOException 
    { 
     try (final Reader reader = new InputStreamReader(new FileInputStream(fileName))) 
     { 
      // load dictionary into stringSet 
      final char[] buffer = new char[4]; 
      int numRead = -1; 
      while ((numRead = reader.read(buffer)) > 0) 
       stringSet.add(new String(buffer, 0, numRead).toUpperCase()); 
     } 
     catch (IOException e) 
     { 
      throw e; 
     } 
    } 

    public boolean contains(String word) 
    { 
     return stringSet.contains(word); 
    } 
} 

그리고 사전 객체 생성 코드 :

public class MainClass 
{ 
    public static void main(String args[]) 
    { 
     String fileName = "C:/Users/Brandon/Desktop/Android Development/Practice Apps/SwapWords_Prototype/src/data/dictionary.txt"; 
     try 
     { 
      Dictionary dict = new Dictionary(fileName); 
     } 
     catch (IOException e) 
     { 
      System.out.println("Could not load dictionary <" + fileName + ">"); 
      e.printStackTrace(); 
     } 

     // TODO handle dict 
    } 
} 

캐치를 사전과 IOException가 처리하거나이 호출 코드에 던져 하는가를? 내 말은, 둘 중 하나가 작동하지만 더 논리적이라고?

+2

당신이 한 일은 괜찮은 것 같습니다 (가능한 한 늦게 예외를 잡으십시오). 예외적으로'catch (IOException e) {throw e; }'... – assylias

+1

나는 사전 파일을 ('new Dictionary() .load (File)'과 같은 것으로 사용되는) 별도의 메소드로 로딩하는 논리를 옮길 것이다. 그런 다음 생성자에서 throw를 제거합니다. 참고로이 질문은 [CodeReview StackExchange] (http://codereview.stackexchange.com/)에 더 적합합니다. – Perception

+0

@Perception :이 아이디어에 대해 너무 고마워. 실제로 문제를 해결하기 위해 엉덩이 - 뒤로 코드를 써야한다는 문제가있었습니다. 훨씬 조직화되어 있으며, 무엇이 완료되고 있는지 훨씬 더 분명합니다. 또한 CodeReview 링크 덕분에, 나는 그것조차도 존재하지 않았다. –

답변

2

내가 지금 설정 한 방식대로 설정하는 것이 좋습니다. DictionaryIOException이 발생하면 복구 할 수있는 좋은 방법이 없으므로 발신자에게이 오류가 발생했음을 알리려고합니다. 반면에 Dictionary이 (다른 파일이나 다른 것을로드하여) 정상적으로 오류를 처리 할 수 ​​있다면 코드를 생성자에 넣어 호출자에게 숨길 수 있습니다.

발신자가 발신자가 예외로 인해 내부적으로 유효하지 않지만 발신자에게 완전히 괜찮은 것으로 보이도록하려는 것은 바람직하지 않습니다.

+0

나는 이것을 묻는 것에 대해 어리 석다고 느낀다. 그러나 나는 지금 가지고있는 코드로,'MainClass'의 catch-try 블록 이후에'dict'에 대한 어떤 참조도 해결할 수 없다. 나는 혼란스러워. –

+0

예. 'dict'는'try' 블록 안에서 선언되기 때문에, 그 코드 블록에 국한됩니다. 외부에서 사용할 수있게하려면 외부에서 선언해야합니다 (내부에서 간단히 초기화해야합니다). 양자 택일로, 우리가'catch' 블록을 쳤을 때'dict'가 어쨌든 유효하지 않으므로'dict'를 try 블록 안에 넣어야하는 코드를 모두 넣으십시오. 아마도 그것을 사용하고 싶지 않을 것입니다. –

+0

죄송합니다. 지금까지 귀하의 의견을 보지 못했습니다. 귀하의 질문에 실제로 답변 한 편집에 대한 알림을받지 못했습니다. –

관련 문제