【问题标题】:Variable has not have been initialized in Java变量尚未在 Java 中初始化
【发布时间】:2022-01-04 10:32:30
【问题描述】:

以下代码编译失败,因为变量 'rt' 尚未初始化。

我希望代码在 switch 语句中初始化“rt”,或者在运行默认情况时不再使用“rt”。

这是我写的代码:

enum RequestType {leader, candidate};

private void processRequest(String input) {


        boolean inputOK = true;
        RequestType rt;

        String[] split = input.split(":");

        if (!input.contains(":")) {
             inputOK = false;
        }
        else {


            if (split.length != 3) {
                inputOK = false;
            }

            else {
                int port = Integer.parseInt(split[2]);

                if (!(port > 0 && port < 65537)) {
                    inputOK = false;

                }

                else {

                    switch (split[0]) {
                        case "Leader":
                            rt = RequestType.leader;
                            break;
                        case "Candidate":
                            rt = RequestType.candidate;
                            break;
                        default:
                            inputOK = false;
                    }

                }
            }
        }

        if (!inputOK) {
            return;
        }

        String address = split[1].concat(split[2]);

        if (rt == RequestType.leader) {

            keepingLeader(address);
        }

【问题讨论】:

  • 您不会在默认块或许多 ifs 中初始化 rt。编译器不看rt的读取相对于inputOK的值是否可达,它只看它是否完全可达。
  • 是的,但我将 false 分配给 requestOK,这将导致 rt 不再被使用。编辑:好的,这解释了它。我怎么能在这里处理这个,因为我真的没有一个默认值来分配给 rt
  • 局部变量没有默认值,所以你不能使用它们(例如在比较时)除非先显式初始化它们,即使使用null
  • 或者,不要使用单独的inputOK 变量,而是使用rt == null 来指示输入不正确。

标签: java initialization switch-statement return


【解决方案1】:

您不会在默认块或许多 if 中初始化 rt

编译器不看rt的读取是否相对于inputOK的值是可达的,它只是看它是否完全可达。

最简单的做法就是立即返回您当前拥有inputOK = false; 的位置。

或者,您可以在声明rt 时为其指定一个默认值,例如null。这样做的问题是它破坏了编译器现在正在做的检查——你实际上在所有情况下都分配了它,所以你不会意外使用默认值。

相反,您可以使用 rt 的无效性来代替单独的布尔值:

  • 在您当前分配inputOK = false 的地方,改为分配rt = null
  • 然后检查!inputOK 并返回如果为真,请改为检查rt == null

【讨论】:

  • 完美答案。我将使用rt == null 的检查,因为我想在返回之前添加一些要做的事情,然后我不必每次现在分配inputOK == false 时都编写代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 2015-07-04
相关资源
最近更新 更多