如何使用java文件I / O正确捕获异常

时间:2018-02-04 15:52:53

标签: java

我正在尝试熟悉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
  1. 我在哪里“已经抓住了”FileNotFoundException
  2. 由于第二个错误,我是否需要在try子句中添加另一个catchfinally语句来捕获IOException?这看起来很乱,而且过于复杂。我做错了什么吗?为什么java不让我做我想要的而不强迫我捕捉异常?
  3. 编辑:

    如果我这样做:

    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
    

5 个答案:

答案 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){

    }
}

并查看tryResourceClose

答案 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将自动关闭它。