Java:变量未初始化

Java:变量未初始化,java,Java,我收到一个“变量选择”可能没有在显示菜单(选择)中初始化。我不知道为什么。它没有在显示菜单模型中初始化,还是我缺少了什么?“选择=键盘。nextInt“不算作初始化吗?我有点困惑为什么我会犯这个错误。代码如下: import java.util.Scanner; import java.io.*; public class LanguageTranslatorIB { public static void main(String[] args) { // local varia

我收到一个“变量
选择”
可能没有在
显示菜单(选择)
中初始化。我不知道为什么。它没有在
显示菜单
模型中初始化,还是我缺少了什么?“
选择=键盘。nextInt
“不算作初始化吗?我有点困惑为什么我会犯这个错误。代码如下:

import java.util.Scanner;
import java.io.*;

public class LanguageTranslatorIB
{
    public static void main(String[] args)
    {
// local variable to hold the menu selection
int selection;

do
{

    // display the menu
    displayMenu(selection);

    // perform the selected operation
        switch (selection)
        {
        case 1:
        System.out.println("Good Morning.");

        case 2:
        System.out.println("Buongiorno.");

        case 3:
        System.out.println("Buenos dias.");

        case 4:
        System.out.println("Guten morgen.");

        case 5:
        System.out.println("GoodBye!");

        }
    }
        while (selection != 5);
    }





// the displayMenu module displays the menu and gets and validates
// the users selection.

    public static void displayMenu(int selection)
    {
        //keyboard scanner
        Scanner keyboard = new Scanner(System.in);

    // display the menu
    System.out.println(" select a language and i will say good morning");
    System.out.println("1. English.");
    System.out.println("2. Italian.");
    System.out.println("3. Spanish.");
    System.out.println("4. German.");
    System.out.println("5. End the Program.");
    System.out.println("Enter your selection");

    // users selection
    selection = keyboard.nextInt();

    while (selection < 1 || selection > 5)
    {
        System.out.println ("that is an invalid select.");
        System.out.println (" Enter 1, 2, 3, 4, or 5.");
        selection = keyboard.nextInt();
    }

    }
}
import java.util.Scanner;
导入java.io.*;
公共类语言TranslatorIB
{
公共静态void main(字符串[]args)
{
//用于保存菜单选择的局部变量
int选择;
做
{
//显示菜单
显示菜单(选择);
//执行所选操作
开关(选择)
{
案例1:
System.out.println(“早上好”);
案例2:
System.out.println(“Buongiorno”);
案例3:
System.out.println(“布宜诺斯艾利斯迪亚斯”);
案例4:
System.out.println(“Guten morgen”);
案例5:
System.out.println(“再见!”);
}
}
while(选择!=5);
}
//displayMenu模块显示菜单并获取和验证
//用户选择。
公共静态无效显示菜单(整数选择)
{
//键盘扫描器
扫描仪键盘=新扫描仪(System.in);
//显示菜单
System.out.println(“选择一种语言,我会说早上好”);
System.out.println(“1.English”);
System.out.println(“2.意大利语”);
System.out.println(“3.西班牙语”);
System.out.println(“4.德语”);
System.out.println(“5.结束程序”);
System.out.println(“输入您的选择”);
//用户选择
选择=键盘.nextInt();
while(选择<1 | |选择>5)
{
System.out.println(“这是一个无效的选择。”);
System.out.println(“输入1、2、3、4或5”);
选择=键盘.nextInt();
}
}
}

更改
显示菜单
不获取参数,而是返回所选整数。将其分配给所选内容:

selection = displayMenu();
而且

public static int displayMenu()
{
   int selection = 0;
   Scanner keyboard = new Scanner(System.in);
   // ....

   selection = keyboard.nextInt();

   while (selection < 1 || selection > 5)
   {
      //...
   }
   return selection;

}
publicstaticintdisplaymenu()
{
整数选择=0;
扫描仪键盘=新扫描仪(System.in);
// ....
选择=键盘.nextInt();
while(选择<1 | |选择>5)
{
//...
}
返回选择;
}

将变量
选择
传递到
显示菜单
时,原始变量不会改变。在该方法中更改的变量是一个副本。您在该方法中所做的任何操作都绝对不会影响原始的
选择

因此,
选择
没有按照编译器正确指出的那样初始化

您需要重新设计
显示菜单
,以返回将分配给
选择
的值。该方法不需要任何输入


另一方面,您可能希望在
case
语句中的每个
System.out.println
之后添加
break
。如果您不这样做,那么控件将转到下一种情况。

您的原语变量将作为副本而不是引用传递给方法。所以当你打电话的时候

显示菜单(选择)


此方法只处理方法内的副本,而不处理方法外的变量。

在Java中,局部/块变量需要在声明时显式初始化。未初始化的局部变量会导致此错误。如果您假设selection局部变量将被赋予int在Java中的默认值,那么您就错了。类级变量的情况不同,这些变量是在类中定义为属性的。这些变量由编译器自动指定其默认值


由于在以后的中使用之前没有为“selection”指定任何值,因此会出现此错误。

在主方法中,
selection
在任何点都不存储任何值。当您调用
displayMenu(selection)时,需要设置
displayMenu
以将整数返回到
选择

java将选择变量的值传递给displayMenu()方法。变量尚未初始化

然后尝试在displayMenu()方法内设置选择变量的值

但是,作为displayMenu()参数的选择变量是该方法的局部变量,即使设置了局部选择变量的值,主方法中的选择变量仍保持未初始化状态

要解决这个问题:创建一个实例变量

public class LanguageTranslatorIB
{
    int selection;
    public static void main(String[] args)
    {
        displayMenu();
        //Rest of the code follows;
    }
}


public static void displayMenu()
{
    //keyboard scanner
    Scanner keyboard = new Scanner(System.in);

    // display the menu
    System.out.println(" select a language and i will say good morning");
    System.out.println("1. English.");
    System.out.println("2. Italian.");
    System.out.println("3. Spanish.");
    System.out.println("4. German.");
    System.out.println("5. End the Program.");
    System.out.println("Enter your selection");

    // users selection
    selection = keyboard.nextInt();

    while (selection < 1 || selection > 5)
    {
        System.out.println ("that is an invalid select.");
        System.out.println (" Enter 1, 2, 3, 4, or 5.");
        selection = keyboard.nextInt();
    }

    }
}
公共类语言translatorIB
{
int选择;
公共静态void main(字符串[]args)
{
显示菜单();
//代码的其余部分如下;
}
}
公共静态无效显示菜单()
{
//键盘扫描器
扫描仪键盘=新扫描仪(System.in);
//显示菜单
System.out.println(“选择一种语言,我会说早上好”);
System.out.println(“1.English”);
System.out.println(“2.意大利语”);
System.out.println(“3.西班牙语”);
System.out.println(“4.德语”);
System.out.println(“5.结束程序”);
System.out.println(“输入您的选择”);
//用户选择
选择=键盘.nextInt();
while(选择<1 | |选择>5)
{
System.out.println(“这是一个无效的选择。”);
System.out.println(“输入1、2、3、4或5。”);
选择=键盘.nextInt();
}
}
}

您需要将其设置为一个值,如0。整数选择=0;将清除编译器错误。或者您可以稍后进行设置。更改
displayMenu
不获取参数,而是返回选定的int。将其分配给选择:
selection=displayMenu()在您要求之前,您如何显示/使用节(值/变量)?哦,天哪。因为
displayMenu()
是无效的,所以您不能