家庭作业要求我实现一个程序,通过为每个文件启动一个新线程来计算一个或多个文件中的单词(文件名在命令行中被指定为参数)。
这是我的问题:run()方法不能抛出IOException,因为Runnable接口中的run()方法不会抛出一个。通过将File和Scanner构造函数调用放在我的类的构造函数中来实现Runnable,我已经了解了编译器的警告,但即使它现在编译得很好,我仍然感到阴暗,就像我做的事情不是犹太人。有什么想法吗?
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 :(得分:0)
在构造函数中初始化成员变量通常是很好的做法。我认为你做的是正确的事情,而且,我还会将characters
,words
和lines
的初始化移动到构造函数中。
答案 1 :(得分:0)
您可以静默异常,并中止线程内的文件操作。是否默认异常取决于你想要做什么。
try {
inFile = new File(aFile);
} catch (FileNotFoundException e) {
System.out.println("file not found, aborting operation.");
return;
}
但是,我认为在构造函数中初始化文件没有任何问题;如果你想早点失败而不是等到以后,这是一个非常好的做法。
答案 2 :(得分:0)
我认为一般的经验法则是处理异常,尽可能接近抛出的位置。什么阻止你的runnable处理异常,而不是你的main()或创建runnables的什么?
我同意变量初始化通常最好在构造函数中完成,但是当使用runnables时,如果在run()方法中进行构造,则会获得更好的性能。我特别谈到实际需要一些时间来处理的变量; int [3]在构造函数或run方法中是否会产生影响,但是扫描程序和文件可能取决于它们在初始化时的作用(例如,Scanner是否缓冲了文件的第一行?)。
答案 3 :(得分:-1)
如果问题是检查过的异常,那么常见的习惯用法是将其转换为RuntimeException,如下所示:
try {
...
} catch (IOException e) {
throw new RuntimeException(e);
}
基本上你抓住,转换和重新抛出。取消选中RuntimeException,因此方法签名不需要声明它。