我正在尝试熟悉Java中的文件I / O.我从编译时遇到很多错误开始,例如error: unreported exception IOException; must be caught or declared to be thrown
。所以我对代码做了一些更改,结果是:
public static void main(String[] args){
FileInputStream in = null;
FileOutputStream out = null;
String content = "hello";
byte[] contentBytes = content.getBytes();
try{
out = new FileOutputStream("output.txt");
out.write(contentBytes);
}catch(IOException e){
}catch(FileNotFoundException e){
}
finally{
if (out != null)
out.close();
}
}
仍然,我收到此错误:
FileIO.java:16: error: exception FileNotFoundException has already been caught
}catch(FileNotFoundException e){
^
FileIO.java:21: error: unreported exception IOException; must be caught or declared to be thrown
out.close();
^
2 errors
FileNotFoundException
?try
子句中添加另一个catch
和finally
语句来捕获IOException
?这看起来很乱,而且过于复杂。我做错了什么吗?为什么java不让我做我想要的而不强迫我捕捉异常?编辑:
如果我这样做:
public static void main(String[] args){
FileOutputStream out = null;
String content = "hello";
byte[] contentBytes = content.getBytes();
try{
out = new FileOutputStream("output.txt");
out.write(contentBytes);
}catch(FileNotFoundException e){
}catch(IOException e){
}
finally{
if (out != null)
out.close();
}
}
我明白了:
FileIO.java:20: error: unreported exception IOException; must be caught or declared to be thrown
out.close();
^
1 error
答案 0 :(得分:1)
我在哪里“已经捕获”FileNotFoundException?
FileNotFoundException扩展IOException
,这意味着IOException可以捕获FileNotFoundException
异常。所以,FileNotFoundException
之后没有任何意义。
只需撤消订单即可解决此问题。
}catch(FileNotFoundException e){
}catch(IOException e){
}
此外,不要将catch块留空,使用它们显示相应的消息,否则你将没有任何线索,如果你有任何例外。
第二个错误,我是否需要在finally子句中添加另一个try和catch语句来捕获IOException?
是。但是,我建议使用try-with-resource它将在最后关闭资源。
如上所述,您应该使用try-with-resource代替
try (FileOutputStream out = new FileOutputStream("people.bin");)
{
out.write(contentBytes);
}
catch(FileNotFoundException e)
{
}catch(IOException e){
}
答案 1 :(得分:1)
我不确定编译器如何为您提供代码。你可以试试下面的代码吗?我跑的时候没有任何错误。
对第一个问题的回答是:
删除FileNotFoundException行或将其置于IOexception之上。
回答第二个问题是:
如果你认为这很麻烦,你可以通过使用抛出来抛出异常,即抛出main(String [] args)旁边的IOException。
Java(编译器)推动你捕获或声明你的异常(使用throws)因为,java中的Exceptions的主要目的是在运行代码时没有遇到错误。当finally块中发生异常时,会导致错误,并最终在运行时影响您的应用程序。当你在Finally块中关闭东西时必须非常小心。如果您认为代码看起来很乱,那么您可以使用抛出关键字来解决您的问题。
public static void main(String[] args){
FileInputStream in = null;
FileOutputStream out = null;
String content = "hello";
byte[] contentBytes = content.getBytes();
try{
out = new FileOutputStream("output.txt");
out.write(contentBytes);
}catch(IOException e){
}
finally{
if (out != null){
try{
out.close();
}catch(IOException e){
}
}
}
}
答案 2 :(得分:0)
由于FileNotFoundException
扩展了IOException
,所以只需抓住IOException
即可抓住IOException
的所有子类型。
And regarding your second question, since `.close()` method also throws `IOException`, you can put all the IO code in a method, and have that method to throw `IOException`, then the caller can deal with the any exceptions.
for example:
private static void writeToFile() throws IOException{
FileInputStream in = null;
FileOutputStream out = null;
String content = "hello";
byte[] contentBytes = content.getBytes();
try{
out = new FileOutputStream("output.txt");
out.write(contentBytes);
}finally{
if (out != null)
out.close();
}
}
然后你的主要看起来像这样。
public static void main(String[] args){
FileInputStream in = null;
FileOutputStream out = null;
String content = "hello";
byte[] contentBytes = content.getBytes();
try{
writeToFile();
}catch(IOException e){
}
}
答案 3 :(得分:0)
$result = mysqli_query($conn,"SELECT emp_nr, SUM(az)
FROM az_konto
WHERE date BETWEEN '2018-01-01 00:00:00' AND '2018-01-31 23:59:59'
GROUP BY emp_nr ASC");
echo "<table border='1'>
<tr>
<th>Mitarbeiter NR</th>
<th>Stunden im Monat</th>
</tr>";
while($row = mysqli_fetch_array($result))
{
$emp_nr=$row['emp_nr'];
$az=$row['SUM(az)'];
echo "<tr>";
echo "<td>" . $emp_nr . "</td>";
echo "<td>" . $az . "</td>";
echo "</tr>";
}
echo "</table>";
$conn->close();
?>
}
答案 4 :(得分:0)
String outputPath = "output.txt";
String content = "hello";
byte[] contentBytes = content.getBytes();
try (FileOutputStream out = new FileOutputStream(outputPath)) {
out.write(contentBytes);
} catch (FileNotFoundException e) {
System.err.println("Failed to find the file to write to: " + outputPath);
} catch (IOException e) {
System.err.println("Failed to write to file: " + outputPath);
}
正如QuakeCore提到FileNotFoundEception扩展了IOException,这就是你应该首先捕获FileNotFoundEception的原因。
打印至少一些消息是一个好习惯,因此当控制台/日志中没有输出且没有异常时,您不会感到惊讶。
FileOutputStream实现了AutoClosable接口。这就是为什么最好使用try with resources。在这种情况下,JVM将自动关闭它。