【问题标题】:Getting "Variable data not initialized" error even though it's initialized即使已初始化,也会出现“变量数据未初始化”错误
【发布时间】:2015-03-18 18:51:53
【问题描述】:

我有一段时间没有接触 Java,所以我对一些细节有点生疏。

我正在尝试从一个充满数字的文件中读取它们自己的行。文件中的第一个数字告诉我文件中有多少其他数字,以便我可以适当地调整数组的大小。我试图将这些数字放入一个整数数组中,但在我的返回语句中不断收到“错误:变量数据可能尚未初始化”。我知道这一定很简单,但我一辈子都无法找出我做错了什么简单的事情。

public static int[] numbers(String filename)
{
    int[] data;

    try
    {
        FileReader input = new FileReader(filename);
        BufferedReader buffer = new BufferedReader(input);

        int arraySize = Integer.parseInt(buffer.readLine());
        data = new int[arraySize];

        for (int x = 0; x < arraySize; x++)
        {
            data[x] = Integer.parseInt(buffer.readLine());
        }

        buffer.close();
    }

    catch(Exception e)
    {
        System.out.println("Error reading: "+e.getMessage());
    }

    return data;
}

【问题讨论】:

  • 名为data的数组未初始化。使用int[] data = new int[x] 对其进行初始化,其中 x 是它的大小。
  • 其实你只需要int[] data = null;(在最上面)。问题是你在 try 子句中初始化它的部分可能永远不会发生。
  • 具体来说,如果try 的第一行失败,它永远不会被设置。您也可以在 catch 块中初始化它(默认为 null 或 new int[0])
  • 感谢您的快速回复!无论如何,rgettman 和 Kritner 的建议都适用于编译。我会玩两个,看看我更喜欢哪一个。对于这么简单的问题,我深表歉意。我有另一个与我发布的几乎相同的旧程序,它就像一个魅力,所以我非常困惑。不过现在已经处理好了!谢谢!

标签: java arrays filereader


【解决方案1】:

如果在 try 块中抛出异常,则 data 在返回时可能尚未初始化。

在声明时将其初始化为某个东西,即使值为null,以满足编译器的要求。

另一方面,IOException 似乎是这里唯一抛出的异常。或者,您可以将您的方法声明为抛出IOException,并删除try-catch 块,以便在执行return 语句时始终初始化data。您当然需要在调用 numbers 方法的方法中捕获异常。

【讨论】:

  • 效果很好!我将尝试这个和 Kritner 的建议,看看我自己更喜欢哪一个!
【解决方案2】:

您收到此错误是因为您在 try 块内初始化 data 数组,但如果您的 try 块捕获异常,则 data 数组可能未初始化但无论如何都会被退回。

在 try-catch 之外初始化你的数组:

例如:

 int[] data = new int[1]; //default initialization

【讨论】:

    【解决方案3】:

    这是由于 try/catch 块中的初始化,如果在 try/catch 块中初始化之前抛出异常,则数组可能永远不会被实例化。

    我认为只需在声明时将数组长度设置为 1 或 null 即可解决您的问题

    int[] data = new int[1];
    try
    // the rest
    

    或

    int[] data = null;
    

    【讨论】:

    • 初始化为 null 处理了编译问题。感谢您的回复!
    【解决方案4】:

    我有两个建议与其他答案略有不同(仅略有不同)。如果有异常,那么您应该 1)抛出异常(如 RuntimeException)或 2)只返回 null(我的猜测是您不希望实际抛出异常)。

    public static int[] numbers(String filename)
    {
        BufferedReader buffer = null;
        try
        {
            final FileReader input = new FileReader(filename);
            BufferedReader buffer = new BufferedReader(input);
    
            final int arraySize = Integer.parseInt(buffer.readLine());
            final int[] data = new int[arraySize];
    
            for (int x = 0; x < arraySize; x++)
            {
                data[x] = Integer.parseInt(buffer.readLine());
            }
    
            buffer.close();
            return data;
        }
        catch(Exception e)
        {
            System.out.println("Error reading: "+e.getMessage());
        }
        finally{
            // a NumberFormatException may be thrown which will leave
            //   the buffer open, so close it just in case
            if(buffer != null)
                buffer.close();
        }
        // else there was an exception, return null
        return null;
    }
    

    【讨论】:

    • 这会在假设可以在这个块中吞下异常的情况下工作,对吧?
    • 我的代码 sn-p 没有抛出异常。如果由于捕获了抛出的异常或检查了是否返回 null 而发生异常,则必须做一些事情。如果此方法失败(我假设),当然 main 无法继续。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多