小编典典

未报告的异常Java

java

我收到了一个未报告的异常;必须在下面的fill方法中被捕获或声明为抛出错误。从我读过的类似文章中,我假设错误是由read方法引发Exception引发的,但我无法修复。

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);
}

填充定义为:

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();
}

阅读 243

收藏
2020-11-30

共1个答案

小编典典

您的fillDatacall buffer.readLine(),它被声明为throw
IOException,但是您既没有捕获witin异常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+中,您可以使用Files.newBufferedReader默认为UTF-8的版本。

另外:

  • read声明抛出异常Exception通常是一个坏主意;只抛出特定的异常
  • 捕获Exceptionread是一个坏主意; 只捕获特定的异常
  • read失败后继续执行操作是个坏主意- in为空,此后立即导致失败
  • 有一个名为fileNametype 的参数是非常奇怪的int。碰巧的是,您无论如何都没有使用它-这有什么意义?

基本上, 所有 异常处理和资源管理都需要大量工作。

2020-11-30