【问题标题】:Java:Local variable may not have been initialized?Java:局部变量可能尚未初始化?
【发布时间】:2014-02-04 17:49:49
【问题描述】:

问题:编写一个读取实数列表的程序。程序结束后,它应该只打印出唯一的数字。也就是说,只有在列表中出现一次的数字。如果列表中的唯一编号超过 50 个,那么您应该只打印前 50 个。

import java.util.*;
import java.io.*;
import java.util.Arrays;


public class Hmwk {

    public static void main(String[] args) throws FileNotFoundException {
        Scanner input=new Scanner (new File ("input.txt"));
        int n = 0;
        final int MAX_SIZE = 50;
        double[] numbersArray;
        while (input.hasNextDouble() && n<MAX_SIZE){
            double in = input.nextDouble();
            if (inList(in,numbersArray))
                numbersArray[n]=in;
                n++;

        }
        printReport(numbersArray);
    }


    public static boolean inList(double number, double[] list){
        for (double i : list) {
            if (i == number){
                return false;
            }
            else
                return true;
        }
    }

    public static void printReport(double[] list) {
        System.out.printf("The unique numbers were", Arrays.toString(list));
    }

}

我收到错误消息,提示 numbersArray 可能尚未初始化。我也收到一个错误,说我的布尔方法 inList 必须返回一个布尔类型,这让我感到困惑,因为我有两个选项可以返回 true 或 false。非常感谢任何帮助。

【问题讨论】:

    标签: java arrays methods while-loop boolean


    【解决方案1】:

    其实你的变量

    double[] numbersArray;
    

    没有初始化,只是声明了。您可以将其初始化为:

    double[] numbersArray = new double[MAX_SIZE];
    

    在您发表评论后:

    它打印出“唯一编号是”,但仅此而已,没有唯一编号

    你正在使用

    System.out.printf("The unique numbers were",Arrays.toString(list));
    

    两种选择:

    1. 使用%s 发送String 参数,您希望/需要将数组打印为字符串:

      System.out.printf("The unique numbers were %s.",Arrays.toString(list));
      
    2. 使用System.out.println

      System.out.println("The unique numbers were " + Arrays.toString(list));
      

    【讨论】:

    • @user102817 不客气。请不要忘记将最有帮助的帖子标记为答案。
    • 由于某种原因它没有打印出任何东西?你能帮忙吗?它打印出“唯一的数字是”,但就是这样,没有唯一的数字?不知道哪里搞砸了
    【解决方案2】:
    public static void main(String[] args) throws FileNotFoundException {
            Scanner input=new Scanner (new File ("input.txt"));
            int n = 0;
            final int MAX_SIZE = 50;
            double[] numbersArray; // local variable are initialized at time of declaration
            while (input.hasNextDouble() && n<MAX_SIZE){
                double in = input.nextDouble();
                if (inList(in,numbersArray))
                    numbersArray[n]=in;
                    n++;
    
            }
            printReport(numbersArray);
        }
    

    你必须像初始化它一样

    double[] numbersArray = new double[SIZE];
    

    【讨论】:

    • 局部变量在声明时初始化这是错误的。类字段在创建类的新实例时被初始化,其默认值例如class Foo { double[] numbersArray; }numbersArray 字段的默认值为null
    • @Luiggi Mendoza 类中的实例变量在创建对象时分配默认值而不是局部变量
    • 我只是评论double[] numbersArray;旁边的评论,有误导性。
    • 不,不是,这是错误的。变量只是定义,没有初始化。在方法内部,您应该始终在使用变量之前手动初始化它们。请注意,那里的评论具有误导性或导致混淆。
    【解决方案3】:

    在这两种情况下,您都没有考虑到您可能不会进入循环。

    在第一种情况下:

    double[] numbersArray;
    while (input.hasNextDouble() && n<MAX_SIZE){
        double in = input.nextDouble();
        if (inList(in,numbersArray))
            numbersArray[n]=in;
            n++;
    
    }
    

    如果输入从一开始就没有双精度怎么办?如果是这种情况,您的 numbersArray 从未初始化。虽然在更一般的情况下,即使有一个 double 未初始化您的 numbersArray 也会导致异常。

    在第二种情况下:

    for (double i : list)
        {
            if (i == number){
                return false;
        }
            else
                return true;
    }
    

    如果列表为空,则没有返回语句可返回。

    希望有帮助

    【讨论】:

      【解决方案4】:

      如上所述,需要初始化numbersArray,如图:

      double[] numbersArray = new double[100]; //100可以替换为任意整数,如50、67、62152等

      尝试像这样重写 inList:

      public static boolean inList(double number, double[] list){
          for (double i : list)
              {
                  if (i == number){
                      return false;
                  }
          }
          return true;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多