2010-03-07 2 views
6

this page의 하단에있는 코드를 사용하려고합니다. 여기에 내가 그것을 위해 생성 된 클래스의 코드는 다음과 같습니다Java 시도해 IOException 문제를 잡으십시오

import java.io.LineNumberReader; 
import java.io.FileReader; 
import java.io.IOException; 

public class LineCounter { 
    public static int countLines(String filename) throws IOException { 
    LineNumberReader reader = new LineNumberReader(new FileReader(filename)); 
    int cnt = 0; 
    String lineRead = ""; 
    while ((lineRead = reader.readLine()) != null) {} 
    cnt = reader.getLineNumber(); 
    reader.close(); 
    return cnt; 
    } 
} 

내 목적은 텍스트 파일의 라인을 계산 정수로 그 번호를 저장 한 다음 내 주요 클래스에서 그 정수를 사용하는 것입니다. 필자는 주 수업 시간에 이것을 만들기위한 몇 가지 방법을 시도했지만 (새로운 프로그래머가 됨) 나는 뭔가를 놓치고있다. 여기에 내가 시도 제일 먼저 : 나는 오류가 이러한 시도와

String sFileName = "MyTextFile.txt"; 
private int lineCount = LineCounter.countLines(sFileName); 

"보고되지 않은 예외 때 java.io.IOException가, 잡은 또는 슬로우 선언해야합니다." 나는 왜 내가 "countLines"메소드에서 예외가 선언 된 것을 볼 수 있기 때문에 나는 이것을 얻고 있는지 이해할 수 없다. 나는 게시 된 코드의 마지막 비트 바로 아래에서 try catch 블록을 사용하려고 시도했지만, 그 중 하나는 작동하지 않았다 (나는 올바르게 생각했다고 생각하지 않는다). 다음은 시도 시도입니다.

String sFileName = "MyTextFile.txt"; 
private int lineCount;{ 
    try{ 
     LineCounter.countLines(sFileName); 
    } 
    catch(IOException ex){ 
     System.out.println (ex.toString()); 
     System.out.println("Could not find file " + sFileName); 
    } 
} 

제발 보여주세요! 도와 주셔서 미리 감사드립니다.

답변

3

초기화 블록은 단지 코드의 비트처럼; 그 앞에있는 모든 필드/메소드에 "첨부"되어 있지 않습니다. 필드에 값을 할당하려면 필드를 할당 문의 lh로 명시 적으로 사용해야합니다.

private int lineCount; { 
    try{ 
     lineCount = LineCounter.countLines(sFileName); 
     /*^^^^^^^*/ 
    } 
    catch(IOException ex){ 
     System.out.println (ex.toString()); 
     System.out.println("Could not find file " + sFileName); 
    } 
} 

은 또한 당신의 countLines 간단하게 할 수 있습니다

public static int countLines(String filename) throws IOException { 
    LineNumberReader reader = new LineNumberReader(new FileReader(filename)); 
    while (reader.readLine() != null) {} 
    reader.close(); 
    return reader.getLineNumber(); 
    } 

내 테스트를 기반으로, 그것은 같이 할 수 있습니다 getLineNumber()close() 보인다.

+1

대답은 기술적으로 정확합니다 (OP는 단순히 값을 참조에 할당하는 것을 잊어 버렸습니다).하지만 ** 정적 ** 이니셜 라이저 블록이 아닙니다. 그것은 단지 이니셜 라이저 블록입니다. – BalusC

+0

첫 번째 코드는 완벽하게 작동합니다! 나는 너무 가까웠다 :) 두 번째 코드는 작동하지만 NetBeans는 while 루프가 비어 있다고 알려준다. 이 프로그램은 여전히 ​​컴파일되고 실행되기 때문에 받아 들일 만합니다. – ubiquibacon

+0

콘텐츠를 단순히 무시하는 것입니다.실제로는 선의 양에만 관심이 있습니다. 또는 내부에서 증가하는'int count'와 함께'BufferedReader'를 사용할 수도 있습니다. – BalusC

1

countLines(String filename) 메서드는 IOException을 throw합니다.

회원 선언에 사용할 수 없습니다. main(String[] args) 방법으로 작업을 수행해야합니다.

귀하의 main(String[] args) 메소드는 countLines에 의해 IOException을 던져 처리하거나 선언해야합니다.

은 주요

public class MyClass { 
    private int lineCount; 
    public static void main(String[] args) throws IOException { 
    lineCount = LineCounter.countLines(sFileName); 
    } 
} 

에서 IOException이 던져이 시도하거나이 그것을 처리 및 검사되지 않은 IllegalArgumentException가 그것을 포장 :

public class MyClass { 
    private int lineCount; 
    private String sFileName = "myfile"; 
    public static void main(String[] args) throws IOException { 
    try { 
     lineCount = LineCounter.countLines(sFileName); 
    } catch (IOException e) { 
     throw new IllegalArgumentException("Unable to load " + sFileName, e); 
    } 
    } 
} 
+0

죄송합니다. 처음에는 질문을 잘못 읽으 셨습니다! – Brabster

+0

답장을 보내 주셔서 감사합니다. 모두 훌륭합니다! – ubiquibacon

1

IOException을받는 이유는 countLines 메소드의 IOException을 잡아 내지 못하기 때문입니다. 다음과 같이하면 좋을 것입니다 :

public static void main(String[] args) { 
    int lines = 0; 

    // TODO - Need to get the filename to populate sFileName. Could 
    // come from the command line arguments. 

    try { 
     lines = LineCounter.countLines(sFileName); 
    } 
    catch(IOException ex){ 
     System.out.println (ex.toString()); 
     System.out.println("Could not find file " + sFileName); 
    } 

    if(lines > 0) { 
    // Do rest of program. 
    } 
} 
+0

답장을 보내 주셔서 감사합니다! – ubiquibacon