【问题标题】:Java compiler not checking IF ELSE condition beforehand (or at least I think that is what's happening...) [duplicate]Java编译器没有事先检查IF ELSE条件(或者至少我认为这是正在发生的事情......)[重复]
【发布时间】:2019-10-10 14:38:59
【问题描述】:

我有一个名为 File.java 的简单类文件,其中包含 3 个函数:createFilewriteContent 和必需的 main 作为驱动程序:

import java.io.*;

class CreateFile {

    public static boolean createFile(File file, String fileName) throws IOException {
        if (file.createNewFile()){
            System.out.println(fileName + ": File created successfully!");
            return false;
        } else {
            System.out.println(fileName + ": File already existing!");
            return true;
        }
    }

    public static void writeContent(String fileName, String fileContent, boolean append) throws IOException {
        if (append = false) {
            BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, false));
        } else {
            BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, true));
        }
        writer.write(fileContent);
        writer.close();
    }

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

        String fileName = "file.txt";
        File file = new File(fileName);
        boolean append = createFile(file, fileName);
        String fileContent = "Hello, this is a test";
        writeContent(fileName, fileContent, append);
    }
}

问题在于函数 writeContent,它在最后一行被调​​用。有一个基本的if条件,检查写入过程是否需要追加到文件中(我知道这不是必需的,但我还在测试,所以请多多包涵)。

我收到一条错误消息,提示编译器找不到符号 writer,这意味着 BufferedWriter writer 是在检查 if 之前 创建的健康)状况。这正是我不明白的:为什么不事先执行 if 条件?

如果我在 if 和 else 语句中包含写入命令,它会很好地工作,但这会导致代码冗余,这是我试图规避的:

    public static void writeContent(String fileName, String fileContent, boolean append) throws IOException {
        if (append = false) {
            BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, false));
            writer.write(fileContent);
            writer.close();
        } else {
            BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, true));
            writer.write(fileContent);
            writer.close();
        }
    }

我确信我只是对一些基本而简单的事情感到迟钝 - 你介意在这里给我一个提示吗?

【问题讨论】:

  • if (append = false) { 应该是 if (append == false) {(两个等号)。为了避免这个问题,只需写if(!append)
  • if (append = false) 是一个赋值,并且永远是正确的。你想改写if (!append)
  • 谢谢!通过,这似乎不是我的代码中唯一的缺陷,因为错误仍然存​​在......
  • 我建议您在 if 条件之外声明 BufferedWriter 并在其中为其分配一个值。
  • 很少有充分的理由明确比较 Java 中的 truefalse

标签: java if-statement


【解决方案1】:

改变这个:

if (append = false) {
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, false));
} else {
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, true));
}

改为:

BufferedWriter writer;
if (append == false) {
    writer = new BufferedWriter(new FileWriter(fileName, false));
} else {
    writer = new BufferedWriter(new FileWriter(fileName, true));
}

如果您在大括号 {} 内创建变量,则其范围仅限于它们。 所以,你应该在if之外创建writer,因为你以后会用到它。

【讨论】:

    【解决方案2】:

    您分配了append = false,而不是比较append == false。 更好的风格不是与truefalse 比较。

        if (!append) {
    

    或者干脆放弃 if 语句:

         BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, append));
    

    【讨论】:

    • 顺便说一句,第二部分确实解决了问题。但主要问题(编译错误)是writer 在以后使用时超出范围。公平地说,这是在链接的副本中回答的。
    猜你喜欢
    • 2017-12-02
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多