【问题标题】:Java name generator variable is already defined in method main(String[])Java 名称生成器变量已在方法 main(String[]) 中定义
【发布时间】:2022-06-22 18:31:52
【问题描述】:

我是新手,我的代码有问题。我想知道如何在 if 语句之后打印变量。当我没有将变量放在 if 语句之前时,它表示它没有被初始化。这是代码:

import java.util.Scanner;

公共类 NameGenerator { public static void main(String[] args) {

Scanner getInput = new Scanner(System.in);

System.out.println("What's the first letter of your first name? ");
String name = getInput.nextLine();

String xmas2;

if (name.equalsIgnoreCase ("a"))  {
    String xmas2 = "Christmas";
    
} else if (name.equalsIgnoreCase ("b")) {
    String xmas2 = "Merry";
    
} else if (name.equalsIgnoreCase ("c")) {
    String xmas2 = "Santa";
    
} else if(name.equalsIgnoreCase ("d")) {
    String xmas2 = "Chocolate";
    
} else if(name.equalsIgnoreCase ("e")) {
    String xmas2 = "Tinsel";
    
} else if(name.equalsIgnoreCase ("f")) {
    String xmas2 = "Yule";
}

System.out.println("Hey " + xmas2);

}

}

【问题讨论】:

  • String xmas2 = "Christmas"; 应该是 xmas2 = "Christmas";。您不想再次重新声明 String xmas2 变量,只是为已经存在的变量赋值。

标签: java


【解决方案1】:

首先,你只分配变量 1 次 " String xmas2 = null;"

import java.util.Scanner;

public class Practice {
    public static void main(String[] args) {

        Scanner getInput = new Scanner(System.in);

        System.out.println("What's the first letter of your first name? ");
        String name = getInput.nextLine();

        String xmas2 = null;

        if (name.equalsIgnoreCase("a")) {
            xmas2 = "Christmas";

        } else if (name.equalsIgnoreCase("b")) {
            xmas2 = "Merry";

        } else if (name.equalsIgnoreCase("c")) {
            xmas2 = "Santa";

        } else if (name.equalsIgnoreCase("d")) {
            xmas2 = "Chocolate";

        } else if (name.equalsIgnoreCase("e")) {
            xmas2 = "Tinsel";

        } else if (name.equalsIgnoreCase("f")) {
            xmas2 = "Yule";
        }

        System.out.println("Hey " + xmas2);

    }
}

输出

What's the first letter of your first name? 
a

Hey Christmas

【讨论】:

    【解决方案2】:

    请注意,编译器会自动为您初始化类成员,但不会自动初始化局部变量。编译器发出警告以强调如果您在取消引用之前未填充局部变量,您可能会遇到奇怪的行为。最初将 null 分配给它,警告就会消失。

    String xmas2 = null;
    

    您还可以将此处的逻辑移动到一个单独的方法中,该方法返回一个您分配的值以初始化变量。在下文中,我将 if-else 块换成一个开关,如果提供的字母未被开关处理,则抛出异常。将事物移入方法有助于定义工作单元。

    public class Practice {
      public static void main(String[] args) {
        ...
        String xmas2 = interpretName(name);
        ...
      }
    
      private String interpretName(String name) {
        String lower = name.toLowerCase();
        switch (lower) {
          case "a": return "Christmas";
          case "b": return "Merry";
          case "c": return "Santa";
          case "d": return "Chocolate";
          case "e": return "Tinsel";
          case "f": return "Yule";
          default: throw new IllegalArgumentException("Unhandled name: "+name);
        }
      }
    }
    
    
      
    

    【讨论】:

      【解决方案3】:

      为了编译您的代码 sn-p,您需要在声明后使用赋值运算符 = 初始化变量 xmas2,并使用以下选项之一,然后再将该变量用于之后的任何语句或计算那个。

      1. 空:String xmas2 = null;
      2. 空字符串:String xmas2 = "";
      3. 或任何字符串值:String xmas2 = "Any string";

      你可能会问,为什么即使赋值String xmas2 = null; 也能满足编译器的投诉Variable 'xmas2' might not have been initializedString xmas2; 声明是否已经通过自动将其分配给默认值 null 来执行相同的操作?

      那么答案是。 Java 编译器不会自动分配它 - 你的局部变量

      在 Java 中,未分配的类成员变量会自动初始化为默认值,如果是String,则应将其分配给null。因此,如果您有一个未分配的类成员,由于默认值,它将能够成功编译。

      但是未赋值的局部变量(你的xmas2变量)在你手动赋值之前不会赋值给任何值(包括null),因此编译器会给你一个编译错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-18
        • 2021-11-29
        • 1970-01-01
        • 1970-01-01
        • 2018-05-21
        • 2018-12-08
        • 2012-10-24
        • 2010-11-14
        相关资源
        最近更新 更多