未报告的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处理和资源管理都需要相当多的工作。