【问题标题】:assigning values to objects in arrays为数组中的对象赋值
【发布时间】:2012-05-24 20:07:33
【问题描述】:
    package macroreader;

    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;

    public class MacroReader {

        public static Macro[] macroArray = new Macro[20];

        public static int macroID;

        public static BufferedReader br;

        public static void main(String[] args) throws IOException {
            br = new BufferedReader(new FileReader("Macros.txt"));
            String currentLine;
            while((currentLine = br.readLine()) != null) {
                if(currentLine.equalsIgnoreCase("#newmacro")) {
                    br.mark(1000);
                    createMacro();
                    br.reset();
                }
            }
            if (br != null) {
                br.close();
            }
        }

    public static void createMacro() throws IOException {
        String currentLine;
        macroID = getEmptyMacro();
        while((currentLine = br.readLine()) != null && !currentLine.equalsIgnoreCase("#newmacro")) {
            macroArray[macroID].readMacro(currentLine);
        }
        macroArray[macroID].inUse = true;
        macroArray[macroID].printData();
    }

    public static int getEmptyMacro() {
        for(int i = 0; i < macroArray.length; i++) {
            if(!macroArray[i].inUse) {
                return i;
            }
        }
        return 0;
    }

}

不是将从文件读取器读取的值分配给数组中的指定对象,在本例中为“macroID”,而是将值分配给数组中的所有对象

现在只是在整个文件中进行了编辑,但问题在于 createMacro() void

这是我的宏类

package macroreader;

public class Macro {

    public static String key;
    public static String[] commands = new String[20];
    public static boolean inUse;

    public static void readMacro(String input) {
        if (!input.equals("")) {
            if (input.startsWith("key = ")) {
                key = input.substring(6);
                System.out.println("Key Value for Macro set to " + key);
            } else {
                for (int i = 0; i < commands.length; i++) {
                    if (commands[i] == null) {
                        commands[i] = input;
                        System.out.println("Command [" + input + "] assigned");
                        break;
                    }
                }
            }
        }
    }

    public static void printData() {
        System.out.println("Macro Key: " + key);
        for(int i = 0; i < commands.length; i++) {
            if(commands[i] != null) {
                System.out.println(commands[i]);
            }
        }
    }

}

【问题讨论】:

  • macroArray持有什么数据类型,又是如何定义的?我不擅长猜测。 --- 难道inUsestatic
  • public static Macro[] macroArray = new Macro[20];
  • 您显示的代码不可能运行到那个点,因为您正在创建一个新数组而没有初始化其内容,因此在尝试访问 inUse 字段时您将得到一个 NullPointerException . (我自己进行了测试以确保。)请显示您正在使用的实际代码。您不必包含所有内容 - 只需包含与 macroArray 一起使用的所有代码。
  • 啊,它是静态的,所以你实际上不需要任何实例(也没有任何实例)。

标签: java arrays bufferedreader


【解决方案1】:

正如我所怀疑的 - 您的 inUse 是静态的,因此对于该类的所有实例来说它总是相同的。和你的其他班级成员一样。

【讨论】:

  • 我已将值从静态更改。但是,现在我似乎无法使用宏类中的 readMacro 方法
  • 那是因为你需要在一个实例上使用它:Macro m = new Macro(); m.readMacro("inputstring...");
  • 谢谢你,mata,我会投票给你,但显然我需要 15 名声望......好吧,至少你知道你帮助了我!干杯
【解决方案2】:

“更改数组中的所有内容”的典型原因是,如果您实际上为数组中的每个元素分配了相同的对象。我们无法判断您是否这样做,因为您没有向我们展示 macroArray 的初始化,但它可能是这样的:

Macro m = new Macro();
for (int i = 0; i < macroArray.length; i++) {
  macroArray[i] = m;
}

这将导致您描述的结果。要修复它,请为数组的每个元素创建一个单独的对象:

for (int i = 0; i < macroArray.length; i++) {
  macroArray[i] = new Macro();
}

【讨论】:

  • 我已将值从静态更改。但是,现在我似乎无法使用宏类中的 readMacro 方法
猜你喜欢
  • 1970-01-01
  • 2018-07-24
  • 2019-03-14
  • 2014-01-02
  • 2011-06-21
  • 1970-01-01
  • 2012-11-19
  • 2018-10-26
  • 1970-01-01
相关资源
最近更新 更多