Java 无法识别创建为数组的对象

Java is not recognizing an object created as an array

我正在创建一个简单的机械计算机模拟器,带有虚拟计数器和打孔卡,但我在 java 中不断出错。 它将计数器创建为一个对象数组,如下所示:

private static void createcounters(int counternums, int digits,
        int[] countervals){
    for (int i=0; i<counternums; i++){
        try {
            if (digits < 1){
                System.out.println("Invalid number of digits, reverting to 1 digit");
                digits = 1;
            }
            Counter[] counter = null;
            counter[i] = new Counter(digits, countervals[i]);

        } catch (Exception ex) {

        }
    }

}

该对象在程序中的不同点被引用以读取值并将这些值放入整数数组中:

public int[] getcounters(){
    int[] countervals = null;
    for (int i=0; i<counternums; i++){
        countervals[i] = counter[i].ReturnVal;           
    }
    return countervals;
}

Java 在编译时出现此错误:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - cannot find symbol
  symbol:   variable counter
  location: class mechanicalcomputeremulator.Computer
    at mechanicalcomputeremulator.Computer.getcounters(Computer.java:49)
    at mechanicalcomputeremulator.MechanicalComputerEmulator.main(MechanicalComputerEmulator.java:20)
Java Result: 1

如果我在创建对象的方法中引用计数器,则不会出现错误。

Counter[] counter in createCounters 是一个 方法范围的 变量。它将无法以不同的方式使用。如果你想让它对你的 class 中的所有方法可用,那么它需要是一个字段。

但是,您需要注意,您在 createcounters 方法上使用了 static,因此除非删除该方法上的 static 关键字,否则您无法访问实例字段。

你也不能做Counter[] counter = null;然后给它赋值,你需要做Counter[] counter = new Counter[size];。我怀疑您还想要一个可扩展数组,因此应该改用 ArrayList

public class MyClass {
  private Counter[] counter = new Counter[10]; // arbitrary fixed size array
  private /*static*/ void createcounters(int counternums, int digits,
    int[] countervals){
   ...
    counter[i] = new Counter(digits, countervals[i]);
  }
  public int[] getcounters(){
    int[] countervals = null;
    for (int i=0; i<counternums; i++){
        countervals[i] = counter[i].ReturnVal;           
    }
    return countervals;
  }
}

你至少有四个问题:

  • 您在方法中将 counter 变量声明为 local 变量。我怀疑你打算在某处声明一个 field - 或者 return 方法的引用,并将它分配给那里的一个实例变量。

  • 您正在将变量初始化为 null,然后立即尝试取消引用它。您认为它会如何运作?

  • 您要为循环的每次迭代声明一个不同的变量。我强烈怀疑你的意思是声明 one 变量并在所有迭代中填充相同的数组。

  • 你正在捕捉 Exception 而只是忽略它。 永远不要那样做。(最好不要做任何一部分。)

所以采样更好的代码:

private static void createCounters(int counterNums,
                                   int digits,
                                   int[] counterVals) {
    // Moved out of the loop, as it's pointless there.
    if (digits < 1) {
        // TODO: Throw an exception instead?
        System.out.println("Invalid number of digits, reverting to 1 digit");
        digits = 1;
    }
    counter = new Counter[counterNums];
    for (int i=0; i < counterNums; i++) {
        counter[i] = new Counter(digits, counterVals[i]);
    }    
}

或者:

private static Counter[] createCounters(int counterNums,
                                        int digits,
                                        int[] countervals) {
    if (digits < 1) {
        // TODO: Throw an exception instead?
        System.out.println("Invalid number of digits, reverting to 1 digit");
        digits = 1;
    }
    Counter[] counter = new int[counterNums];
    for (int i=0; i < counterNums; i++) {

        counter[i] = new Counter(digits, counterBals[i]);
    }
    return counter;
}

注意如果counterNumscounterVals的长度一样,你可以去掉那个参数,只用counterVals.length.