2011-04-19 4 views
0

숙제는 각 파일에 대해 새 스레드를 시작하여 하나 이상의 파일 (파일 이름이 명령 줄에서 인수로 지정됨)의 단어를 계산하는 프로그램을 구현하도록 요청합니다.파일 읽기/쓰기 스레드를 사용하는 방법은 무엇입니까?

여기에 내 문제가 있습니다. Runnable 인터페이스의 run() 메서드가 throw하지 않기 때문에 run() 메서드가 IOException을 throw 할 수 없습니다. 필자는 Runnable을 구현하는 클래스의 생성자에 File 및 Scanner 생성자 호출을 넣음으로써 컴파일러의 경고를 알았습니다.하지만 컴파일이 잘되었지만 여전히 정결하지는 않은 것처럼 느껴집니다. 이견있는 사람?

import java.io.File; 
import java.util.Scanner; 
import java.io.FileNotFoundException; 
import java.io.IOException; 

public class WordCounter implements Runnable { 
    File inFile; 
    Scanner in; 
    int characters; 
    int words; 
    int lines; 
    int[] counted; 

    public WordCounter(String aFile) throws FileNotFoundException { 
     inFile = new File(aFile); 
     in = new Scanner(inFile); 
     counted = new int[3]; 
    } 

    public int[] getTotals() { 
     return counted; 
    } 

    public void run() { 
     characters = 0; 
     words = 0; 
     lines = 0; 
     while (in.hasNextLine()) { 

      String thisLine = in.nextLine(); 
      lines++; 
      Scanner line = new Scanner(thisLine); 
      while (line.hasNext()) { 
       String thisWord = line.next(); 
       words++; 
       characters++; // because each call to line.next() strips a whitespace character 
       Scanner word = new Scanner(thisWord); 
       word.useDelimiter(""); 
       while (word.hasNext()) { 
        char ch = word.next().charAt(0); 
        characters++; 
       } 
      } 
     } 
     counted[0] = characters; 
     counted[1] = words; 
     counted[2] = lines; 
    } 

} 

답변

0

나는 어림짐작은 가능하면 던져진 곳 가까이에서 예외를 처리하는 것이라고 생각한다. main()이나 runnables를 만드는 대신에 예외를 처리하지 못하게하는 이유는 무엇입니까?

변수 초기화가 일반적으로 생성자에서 가장 잘된다는 것에 동의하지만 runnables를 사용할 때 run() 메소드에서 생성이 이루어지면 더 나은 성능을 얻을 수 있습니다. 나는 구체적으로 실제로 처리하는 데 시간이 걸리는 변수에 대해 이야기하고있다. int [3]은 생성자 또는 메서드 실행 여부에 관계없이 초기화되지만 스캐너 및 파일은 초기화시 수행하는 작업에 따라 다를 수 있습니다 (예 : Scanner가 파일의 첫 번째 줄을 버퍼링합니까?).

+0

그 일에 대해 생각해 보았습니다. 그러나이 장의 장에서는 학생들이 수업에서 예외를 잡아 내지 않는 것이 좋습니다. 수업에서 예외를 처리하지 않아서 (또는 다른 프로그래머가 처리 할 수있는 것처럼) 효과적으로 처리 할 수 ​​없을 수도 있습니다. 클래스를 사용하는 기본 메소드에서 (그 말이 의미가 있었으면 좋겠다 ...) 나는 그 판단을 언제 내릴 것인지 아직 조금 확신하지 못한다고 생각한다. –

+0

하루가 끝나면 그것은 심판의 명령입니다. 이것은 모두 제 의견입니다. 실행 파일이 Scanner/File에 의해 던져진 예외를 처리 할 수 ​​없다면, 왜 당신의 실행 파일이 이러한 유형을 인스턴스화할까요? 왜 당신의 Runnable에 유효한 Scanner를 전달하지 않겠습니까? 이것은 main()에서 try/catch를 유지할 것이다. 예외로 끝내는 것은 중요합니다. 당신이 그것에서 회복 할 수 있다면, 그것을 던져라. 당신이 조용히 로그하고 실패한다면, 나는 Runnable 내에서 그것을 잡으라고 말합니다. – Brad

0

일반적으로 생성자의 멤버 변수를 초기화하는 것이 좋습니다. 당신이 옳은 일을하고 있다고 생각하고, 또한 characters, wordslines의 초기화를 생성자로 옮길 것입니다.

0

예외를 무시하고 스레드 내에서 파일 작업을 중단 할 수 있습니다. 예외를 말소하는 것이 좋은 생각인지 아닌지는 당신이하려는 일에 달려 있습니다.

try { 
    inFile = new File(aFile); 
} catch (FileNotFoundException e) { 
    System.out.println("file not found, aborting operation."); 
    return; 
} 

그러나 생성자에서 파일을 초기화 할 때 아무 문제가 없다고 생각합니다. 나중에까지 기다리지 않고 일찍 실패하고 싶다면 완벽하게 좋은 습관입니다. 문제가 확인이 끝난 예외 인 경우

-1

는 일반적인 관용구는 다음과 같은 RuntimeException을 뭔가로 변환하는 것입니다

try { 
... 
} catch (IOException e) { 
    throw new RuntimeException(e); 
} 

은 기본적으로 당신은 변환하고 다시 throw, 잡을 수있어. RuntimeException은 체크되지 않기 때문에 메소드 시그니처가이를 선언 할 필요가 없습니다.

+0

이것은 IMO의 나쁜 생각입니다. 이제 컴파일러가 경고하지 않는 검사되지 않은 예외가 생겼습니다. 이 일의 핵심은 무엇입니까? 예외는 여전히 던져 질 것이지만, 이제는 런타임까지 잡히지 않을 것입니다. – Brad

관련 문제