0
    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]);
            }
        }
    }

}
4

2 に答える 2

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();
}
于 2012-05-24T20:12:29.140 に答える
2

私が推測したように、あなたinUseは静的であるため、クラスのすべてのインスタンスで常に同じになります。他のクラスのメンバーもそうです。

于 2012-05-24T20:29:43.927 に答える