2013-12-10 5 views
0

속성 파일을 읽어야합니다. 이 목적으로 BufferedReader와 FileReader를 사용하고 있습니다. try 섹션 전에 null로 BufferedReader를 초기화하고 try 섹션에서 초기화 중입니다. 마지막으로, 나는 독자를 닫고있다. 이 시점에서 제목에 언급 된 오류가 발생합니다.Findbugs 오류 - 버그 : br 예외 경로에서 참조 해제 될 보장 null

가 어떻게이 오류를 제거 할 수 있습니다 -

전체 코드는

public void getPageTitleProperties() throws IOException 
    { 

     BufferedReader br = null; 
     String lhs, rhs; 
     try 
     { 
      br = new BufferedReader(new FileReader("res" + File.separator + "pagetitle.properties")); 
      String line; 
      while ((line = br.readLine()) != null) 
      { 
       String [] keyvalue = line.split("="); 
       lhs = keyvalue[0]; 
       rhs = keyvalue[1]; 
       expectedTitles.put(lhs, rhs); 
      } 
     } 
     catch (RuntimeException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch (IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
     finally 
     { 
      br.close(); 
     } 

     System.out.println("Expected URLs and Titles"); 
     for (String url : expectedTitles.keySet()) 
     { 
      System.out.println(url + ":" + expectedTitles.get(url)); 
     } 

    } 

버그 세부 사항은 아래에? 내가 null이 아닌, try 블록 (변수가 finally 블록에서 해결할 수 없으므로 작동하지 않는)에서 초기화하는 BR을 초기화 해 보았습니다. :)). 비슷한 게시물에서 사람들은 가능한 한 위음성이라고 언급했습니다. 나는 또한 - http://findbugs.sourceforge.net/bugDescriptions.html#NP_GUARANTEED_DEREF을 참조했지만 버그를 제거하는 방법을 알 수 없었다.

답변

8

이 오류를 제거하려면 어떻게해야합니까?

문제는 BufferedReader 또는 FileReader 생성자가 예외를 throw하는 경우, br가 null이됩니다하지만 여전히 무조건 br.close()를 호출하고 있다는 점이다. try-를 사용

BufferedReader br = new BufferedReader(...); 
try { 
    ... 
} catch (...) { 
    ... 
} finally { 
    br.close(); // br will definitely not be null 
} 

또는 더 나은 자바 7 : 또는

finally { 
    if (br != null) { 
     br.close(); 
    } 
} 

, 전에에게 try 블록을 를 할당 : 당신이 마지막으로 블록을 닫기 전에 br가 null인지 확인 with-resources 성명 :

try (BufferedReader br = new BufferedReader(...)) { 
    ... 
} catch (...) { 
    ... 
} 

현재 catch 블록은 오류를 덤핑하지만 아무 일도 일어나지 않는 것처럼 계속합니다. 반면에 은 예외를 호출자에게 전파해야합니다.. 파일을 읽을 수없는 경우 (으)로 보내시겠습니까? (내가 제안한 두 번째와 세 번째 변경 사항을 적용하면 실제 읽기에 대한 예외는 삼키고 파일을 열지는 못하게됩니다.)

+0

Jon Skeet이 답변을 게시하면 아무도 새로운 답변을 게시 할 수 없습니다. – Baby

+0

죄송합니다. . 그러나 제안 된 접근법 중 어느 것도 버그를 빠져 나가고 있으며 여전히 같은 오류를 내고 있습니다. JDK 7.0을 가지고 있다면 차이가 있습니까? – Sumod

+0

@Sumod : 모든 답변이 * 정말 * 문제를 해결해야합니다. 마지막 접근 방법 (리소스 사용 시도)이 가장 깨끗하기 때문에 여기에 집중하는 것이 좋습니다. 코드를 표시하는 새로운 섹션과 정확한 오류 (정확한 코드를 표시하고 표시하지 않은 비트가 포함 된 다른 코드는 아닙니다)를 사용하여 질문을 편집하십시오. –