未报告的exceptionjava

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

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

你的fillData调用buffer.readLine() ,它被声明为抛出IOException – 但你既没有捕获fillData中的exception,也没有声明它可能被抛出。

最简单的解决方法是将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通常是一个坏主意; 只抛出特定的例外
  • read捕捉Exception是一个坏主意; 只抓住特定的例外
  • 在失败后继续read是一个坏主意 – 将为null,之后立即导致失败
  • 拥有一个名为fileName的类型为int的参数是非常奇怪的。 碰巧的是,你还没有使用它 – 有什么意义呢?

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