未报告的异常java

时间:2014-12-11 11:47:00

标签: java exception

我得到一个未报告的例外;必须在下面的填充方法中捕获或声明抛出错误。从我读过的类似帖子中我假设错误起源,因为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();
}

1 个答案:

答案 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的参数非常奇怪。碰巧的是,你还没有使用它 - 它的重点是什么?

基本上所有的异常处理和资源管理都需要相当多的工作。