有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java最终{if(inputStream!=null){inputStream.close();

我不知道如何理解这一点:

{
        if (inputStream **!= null**) {
            inputStream.close();

从这个例子来看:

public class CopyLines {
public static void main(String[] args) throws IOException {

    BufferedReader inputStream = null;
    PrintWriter outputStream = null;

    try {
        inputStream = new BufferedReader(new FileReader("xanadu.txt"));
        outputStream = new PrintWriter(new FileWriter("characteroutput.txt"));

        String l;
        while ((l = inputStream.readLine()) != null) {
            outputStream.println(l);
        }
    } finally {
        if (inputStream != null) {
            inputStream.close();
        }
        if (outputStream != null) {
            outputStream.close();
        }
    }
}}

当提供任何数据时,inputStream正在关闭


共 (4) 个答案

  1. # 1 楼答案

    如果您询问为什么此代码位于finally块中,那么

    这只是为了确保inputStreamoutputStream始终处于关闭状态,不管上面的代码是否遇到异常

    有什么不同

    任何例外情况下都会出现差异。如果发生任何异常,那么它将确保在将异常返回给调用此方法的方法之前关闭两个流,而不是简单地返回

    bacause java的finally块始终执行,除非:

    • System.exit被调用
    • 或JVM崩溃

    这是关闭finally块中的流、数据库或任何其他类似连接的常见做法。这可确保连接始终处于关闭状态。因为如果它们不在finally块中,并且系统不断遇到一些或另一些Excpetion,那么它最终将耗尽连接

  2. # 2 楼答案

    这意味着每当try块完成时(无论成功与否),它都会尝试关闭finally块中的流(inputStreamoutputStream),但由于try块在创建BufferedReaderPrintWriter实例时可能会失败,您需要首先检查它是否为null,否则您将获得NPE

    可以考虑使用^{}语句来避免必须检查^ {< CD7>},并明确调用^ {CD10>},这样它可以简化代码很多。p>

    try (BufferedReader inputStream = new BufferedReader(new FileReader("xanadu.txt"));
         PrintWriter outputStream = new PrintWriter(new FileWriter("characteroutput.txt")) {
        // your code here
    }
    
  3. # 3 楼答案

    这只是为了避免空指针异常。仅当对象不是null时才调用函数

    简单地说,close函数仅在对象不为null时调用,否则如果在具有null值的对象上调用close(),您将遇到null pointer exception

    有趣的是finally的用法,无论是否存在异常,都会调用它