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

时间:2015-01-29 15:43:23

标签: java arrays object

我正在创建一个简单的机械计算机模拟器,带有虚拟计数器和穿孔卡,但我一直在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

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

2 个答案:

答案 0 :(得分:4)

你至少有四个问题:

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

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

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

  • 您正在抓住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

答案 1 :(得分:0)

Counter[] counter中的

createCounters方法范围的变量。它不会以不同的方法提供。如果您想让它可用于您班级中的所有方法,那么它必须是一个字段。

但是,您需要知道在createcounters方法上使用静态,因此除非删除方法上的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;
  }
}