我得到一个未报告的例外;必须在下面的填充方法中捕获或声明抛出错误。从我读过的类似帖子中我假设错误起源,因为read方法抛出异常,但我无法修复它。
public void read(int fileName) throws Exception
{
FileInputStream in = null;
try
{
Scanner in = new Scanner("dataset.txt");
File inFile = new File(in.nextLine());
in = new FileInputStream(inFile);
}
catch ( Exception e)
{
System.out.println(e);
}
BufferedReader buf = new BufferedReader(new InputStreamReader(in) );
String input;
input = buf.readLine();
fill(input,buf);
}
其中fill定义为:
public void fill(String in,BufferedReader buf)
{
StringTokenizer token = new StringTokenizer(input);
no = token.countTokens();
constraints = new Vector[noOfAttributes];
for (int i=0; i < no; i++)
{
c[i] = new Vector();
names = new String[noOfAttributes];
}
for (int i=0; i < no; i++)
{
names[i] = token.nextToken();
}
while((in = buf.readLine()) != null) //<----error given here
{
token = new StringTokenizer(input);
Train example = new Train(no);
}
buffer.close();
}
答案 0 :(得分:4)
您的fillData
调用buffer.readLine()
,声明抛出IOException
- 但您既没有捕获fillData
中的异常,也没有声明它可能会被抛出。
最简单的解决方法是将fillData
的签名更改为:
public void fillData(String input, BufferedReader buffer) throws IOException
我还强烈建议不在fillData
内关闭阅读器。通常,获取资源的相同代码应该负责关闭它。这里使用try-with-resources语句是最合适的,所以在read
:
try (BufferedReader buffer = new BufferedReader(new InputStreamReader(in))) {
String input = buffer.readLine();
fillData(input,buffer);
}
然而,即使这并不理想,因为您之前会打开输入流。我也建议始终将编码传递给InputStreamReader
构造函数,否则它将使用平台默认编码。在Java 7+中,您可以使用默认为UTF-8的Files.newBufferedReader
。
此外:
read
声明抛出Exception
通常是一个坏主意;只抛出特定的例外Exception
中抓取read
是一个坏主意;只捕获特定的例外read
是一个坏主意 - in
将为空,导致之后立即失败fileName
类型int
的参数非常奇怪。碰巧的是,你还没有使用它 - 它的重点是什么?基本上所有的异常处理和资源管理都需要相当多的工作。