Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我会得到一个“;“潜在资源泄漏”;使用包装编写器对象发出警告?_Java_Eclipse_Resources_Warnings - Fatal编程技术网

Java 为什么我会得到一个“;“潜在资源泄漏”;使用包装编写器对象发出警告?

Java 为什么我会得到一个“;“潜在资源泄漏”;使用包装编写器对象发出警告?,java,eclipse,resources,warnings,Java,Eclipse,Resources,Warnings,下面是一个简化的示例,它将导致Eclipses Java系统发出警告表达式new BufferedWriter(…)的潜在资源泄漏:''可能无法关闭: 这是假阳性吗?我对作家这件事的理解是,任何作家都会关闭其潜在的作家。在我的例子中,writer将封装新的缓冲写入程序(这反过来又封装了一个文件写入程序),因此关闭writer不应该泄漏与缓冲写入程序或其底层写入程序相关的任何资源 我在这里遗漏了什么?根据更新的问题编辑了答案: 这是一个虚假的警告-基于三元运算符的使用。如果操作的右侧未触发,则不会

下面是一个简化的示例,它将导致Eclipses Java系统发出警告
表达式
new BufferedWriter(…)
的潜在资源泄漏:''可能无法关闭

这是假阳性吗?我对作家这件事的理解是,任何作家都会关闭其潜在的作家。在我的例子中,
writer
将封装新的缓冲写入程序(这反过来又封装了一个文件写入程序),因此关闭
writer
不应该泄漏与缓冲写入程序或其底层写入程序相关的任何资源

我在这里遗漏了什么?

根据更新的问题编辑了答案:

这是一个虚假的警告-基于三元运算符的使用。如果操作的右侧未触发,则不会创建
BufferedWriter
,并且不会发生资源泄漏。因此,警告所描述的情况实际上是不可能的。但是,如果您想“处理”它,只需将writer的创建移动到try块中即可

boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
    writer = useStdout ? new OutputStreamWriter(System.out)
            : new BufferedWriter(new FileWriter(new File(
                    askUserForFilename())));
    writer.write("Hello World!");
} finally {
    if (writer != null)
        writer.close();
}
boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
    writer = useStdout ? new OutputStreamWriter(System.out)
            : new BufferedWriter(new FileWriter(new File(
                    askUserForFilename())));
    writer.write("Hello World!");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (writer != null)
            writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
boolean useStdout = askUserWhetherToUseStdout();
try (Writer writer = useStdout ? new OutputStreamWriter(System.out)
        : new BufferedWriter(new FileWriter(new File(
                askUserForFilename())))) {
    writer.write("Hello World!");
} catch (IOException e) {
    e.printStackTrace();
}
根据更新的问题编辑答案:

这是一个虚假的警告-基于三元运算符的使用。如果操作的右侧未触发,则不会创建
BufferedWriter
,并且不会发生资源泄漏。因此,警告所描述的情况实际上是不可能的。但是,如果您想“处理”它,只需将writer的创建移动到try块中即可

boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
    writer = useStdout ? new OutputStreamWriter(System.out)
            : new BufferedWriter(new FileWriter(new File(
                    askUserForFilename())));
    writer.write("Hello World!");
} finally {
    if (writer != null)
        writer.close();
}
boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
    writer = useStdout ? new OutputStreamWriter(System.out)
            : new BufferedWriter(new FileWriter(new File(
                    askUserForFilename())));
    writer.write("Hello World!");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (writer != null)
            writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
boolean useStdout = askUserWhetherToUseStdout();
try (Writer writer = useStdout ? new OutputStreamWriter(System.out)
        : new BufferedWriter(new FileWriter(new File(
                askUserForFilename())))) {
    writer.write("Hello World!");
} catch (IOException e) {
    e.printStackTrace();
}
如果
writer.write(“你好,世界!”)
引发异常,
writer.close()
从未被调用

尝试将其包装到Try-catch块中(可能使用自动关闭功能,请参阅)。

如果
writer.write(“Hello World!”)
引发异常,
writer.close()
从未被调用


尝试将其包装到一个Try-catch块中(可能使用自动关闭功能,请参见)。

是否可以检查此代码是否向您发出警告?若并没有,那个么您可能在创建writer时并没有处理IOException,这也应该在try块中完成

boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
    writer = useStdout ? new OutputStreamWriter(System.out)
            : new BufferedWriter(new FileWriter(new File(
                    askUserForFilename())));
    writer.write("Hello World!");
} finally {
    if (writer != null)
        writer.close();
}
boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
    writer = useStdout ? new OutputStreamWriter(System.out)
            : new BufferedWriter(new FileWriter(new File(
                    askUserForFilename())));
    writer.write("Hello World!");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (writer != null)
            writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
boolean useStdout = askUserWhetherToUseStdout();
try (Writer writer = useStdout ? new OutputStreamWriter(System.out)
        : new BufferedWriter(new FileWriter(new File(
                askUserForFilename())))) {
    writer.write("Hello World!");
} catch (IOException e) {
    e.printStackTrace();
}
您还可以使用try with resources,它将在try块之后自动关闭资源流

boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
    writer = useStdout ? new OutputStreamWriter(System.out)
            : new BufferedWriter(new FileWriter(new File(
                    askUserForFilename())));
    writer.write("Hello World!");
} finally {
    if (writer != null)
        writer.close();
}
boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
    writer = useStdout ? new OutputStreamWriter(System.out)
            : new BufferedWriter(new FileWriter(new File(
                    askUserForFilename())));
    writer.write("Hello World!");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (writer != null)
            writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
boolean useStdout = askUserWhetherToUseStdout();
try (Writer writer = useStdout ? new OutputStreamWriter(System.out)
        : new BufferedWriter(new FileWriter(new File(
                askUserForFilename())))) {
    writer.write("Hello World!");
} catch (IOException e) {
    e.printStackTrace();
}

你能检查一下这个代码是否给了你警告吗?若并没有,那个么您可能在创建writer时并没有处理IOException,这也应该在try块中完成

boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
    writer = useStdout ? new OutputStreamWriter(System.out)
            : new BufferedWriter(new FileWriter(new File(
                    askUserForFilename())));
    writer.write("Hello World!");
} finally {
    if (writer != null)
        writer.close();
}
boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
    writer = useStdout ? new OutputStreamWriter(System.out)
            : new BufferedWriter(new FileWriter(new File(
                    askUserForFilename())));
    writer.write("Hello World!");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (writer != null)
            writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
boolean useStdout = askUserWhetherToUseStdout();
try (Writer writer = useStdout ? new OutputStreamWriter(System.out)
        : new BufferedWriter(new FileWriter(new File(
                askUserForFilename())))) {
    writer.write("Hello World!");
} catch (IOException e) {
    e.printStackTrace();
}
您还可以使用try with resources,它将在try块之后自动关闭资源流

boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
    writer = useStdout ? new OutputStreamWriter(System.out)
            : new BufferedWriter(new FileWriter(new File(
                    askUserForFilename())));
    writer.write("Hello World!");
} finally {
    if (writer != null)
        writer.close();
}
boolean useStdout = askUserWhetherToUseStdout();
Writer writer = null;
try {
    writer = useStdout ? new OutputStreamWriter(System.out)
            : new BufferedWriter(new FileWriter(new File(
                    askUserForFilename())));
    writer.write("Hello World!");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (writer != null)
            writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
boolean useStdout = askUserWhetherToUseStdout();
try (Writer writer = useStdout ? new OutputStreamWriter(System.out)
        : new BufferedWriter(new FileWriter(new File(
                askUserForFilename())))) {
    writer.write("Hello World!");
} catch (IOException e) {
    e.printStackTrace();
}

谢谢,但实际上,我忘了在我的示例中添加
try
catch
,因为它们在原始代码中。该警告与IOException无关。我仍然得到警告,你看..如果你的代码运行的线程在执行finally块之前被终止,finally块可能永远不会被执行,而你的应用程序仍在继续运行。不知道try with resource是否涵盖了这种情况,但似乎很有可能。谢谢,但实际上,我忘了在我的示例中添加
try
catch
,因为它们在原始代码中。该警告与IOException无关。我仍然得到警告,你看..如果你的代码运行的线程在执行finally块之前被终止,finally块可能永远不会被执行,而你的应用程序仍在继续运行。不知道try with resource是否涵盖了这种情况,但似乎很有可能。谢谢,但实际上,我忘了在我的示例中添加
try
catch
,因为它们在原始代码中。该警告与IOException无关。我仍然收到了警告,你看..谢谢你,但实际上,我忘记在我的示例中添加
try
catch
,因为它们在原始代码中。该警告与IOException无关。我还是得到了警告,你看。。