2012-05-24 1 views
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() ничтожной

вот мой Macro класс

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

} 
+0

Какой тип данных является 'macroArray', и как он определяется? Я не догадываюсь. --- Неужели 'inUse' является' static'? – mata

+0

public static Macro [] macroArray = новый макрос [20]; – Arrin

+0

Код, который вы показываете, не может работать с этой точкой, потому что вы создаете новый массив без инициализации его содержимого, поэтому при попытке доступа к полю 'inUse' вы получите' NullPointerException'. (Я сам это испытал). Пожалуйста, покажите фактический код, с которым вы работаете. Вам не нужно включать все - только весь код, который работает с 'macroArray'. –

ответ

2

Как я и подозревал - ваш inUse статичен, поэтому он всегда будет одинаковым для всех экземпляров класса. Как и ваши другие члены класса.

+0

Я изменил значения из static. Однако теперь я не могу использовать метод readMacro в классе Macro – Arrin

+0

Это потому, что нам нужно это на экземпляре: 'Macro m = new Macro(); m.readMacro («inputstring ...»); ' – mata

+0

Спасибо, мата, я бы проголосовал за тебя, но, по-видимому, мне нужно 15 разбросов ... ну, по крайней мере, ты знаешь, что помог мне! ура – Arrin

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

Я изменил значения из статического. Однако теперь я не могу использовать метод readMacro в классе Macro – Arrin