2015-04-19 3 views
0

первый вопрос здесь. Попытка некоторых проблем подготовки к выпуску журналов журналов скобок - то есть: запишите позиции открытого и закрытого кронштейнов строки. Я попытался использовать объект скобки, чтобы затем использовать один массив с открытой и закрытой позицией для каждой записи. Все условия кажутся пойманными, но тогда массив просто дублирует последние результаты для всех записей в массиве. Любая идея, что я делаю неправильно? Оставил печать на экране для моих попыток отладить это уже и знаю, что я рассматриваю только основной случай с моим алгоритмом. Заранее спасибо.Доступ к объекту Java для записи предыдущих записей

class ParanthesisMatch { 

static final char leftBracket = '('; 
static final char rightBracket = ')'; 

public static void main(String[] args) { 

    String str = "(I (am (the) basic) case)"; 
    char[] input = str.toCharArray(); 

    int opens = 0; 
    int closes = 0; 
    int brackets = 0; 

    Bracket[] bracketArray = new Bracket[10]; 

    System.out.println(input.length); 

    for (int i = 0; i < input.length; i++) { 
     System.out.println(input[i]); 
     if (input[i] == leftBracket) { 
      bracketArray[opens] = new Bracket(); 
      System.out.println("Open trigger: " + i); 
      bracketArray[brackets].openBracket = i; 
      System.out.println("Open bracket is: " + bracketArray[opens].openBracket); 
      brackets++; 
      opens++; 
     } 
     if (input[i] == rightBracket) { 
      System.out.println("Close trigger: " + i); 
      bracketArray[brackets - closes].closeBracket = i; 
      System.out.println("Pos: " + (brackets - closes) 
        + "Close bracket is: " + bracketArray[brackets - closes].closeBracket); 
      closes++; 
     } 
    } 

    for (int i = 0; i < brackets; i++) { 
     System.out.println("Bracket: " + i + " Open is " + bracketArray[i].openBracket + ", Close is " + bracketArray[i].closeBracket); 
    } 
} 
} 

class Bracket { 

public static int openBracket; 
public static int closeBracket; 

Bracket() { 
    openBracket = 0; 
    closeBracket = 0; 
} 

public void setOpen(int open) { 
    this.openBracket = open; 
} 

public void setClose(int close) { 
    this.closeBracket = close; 
} 
} 

Обновление - Спасибо вам большое. Я обнаружил ошибку исключения нулевого указателя после и смог зафиксировать себя с тем же самым изменением. Статический наконечник был очень полезен для множества проблем, которые у меня были с моими объектами! Рабочий код для базового случая ((())), не вложенными (()()) все же:

class ParanthesisMatch { 

static final char leftBracket = '('; 
static final char rightBracket = ')'; 

public static void main(String[] args) { 

    String str = "(I (am (the) basic) case)"; 
    char[] input = str.toCharArray(); 
    System.out.println(input.length); 

    int opens = 0; 
    int closes = 0; 
    int brackets = 0; 

    Bracket[] bracketArray = new Bracket[10]; 

    for (int i = 0; i < input.length; i++) { 
     if (input[i] == leftBracket) { 
      bracketArray[opens] = new Bracket(); 
      bracketArray[brackets].setOpen(i); 
      brackets++; 
      opens++; 
     } 
     if (input[i] == rightBracket) { 
      bracketArray[brackets - 1 - closes].setClose(i); 
      closes++; 
     } 
    } 
    System.out.println(input); 
    for (int i = 0; i < brackets; i++) { 
     System.out.println("Bracket: " + i + " Open is " + bracketArray[i].openBracket + ", Close is " + bracketArray[i].closeBracket); 
    } 
} 
} 
class Bracket { 
public int openBracket; 
public int closeBracket; 
Bracket() { 
    openBracket = 0; 
    closeBracket = 0; 
} 
public void setOpen(int open) { 
    this.openBracket = open; 
} 
public void setClose(int close) { 
    this.closeBracket = close; 
} 
} 

ответ

0

Есть две вещи, которые не так с вашим кодом.

Первая проблема заключается в вашем Bracket классе:

class Bracket { 

    public static int openBracket; 
    public static int closeBracket; 

Вы объявили поля openBracket и closeBracket как static, что означает, что они принадлежат к самому Bracket классу, а не каждого Bracket объекта, который вы создаете. В результате имеется только одна копия каждого поля, разделенная между классом Bracket и всеми его экземплярами. Это объясняет, почему одни и те же значения отображаются для каждого Bracket в конце.

Однако это не единственная проблема. Возьмите static модификаторов прочь и вы получите NullPointerException на этой линии:

 bracketArray[brackets - closes].closeBracket = i; 

Причина этого заключается в том, что вы доступ к неправильной записи в массиве. В точке это не удается, brackets - 3 и closes - 0, но bracketArray[3] по-прежнему null. Вместо этого вы хотите получить доступ к записи с индексом 2, поэтому замените brackets - closes на brackets - closes - 1 во всех трех местах, где вы его используете.

После замены brackets - closes на brackets - closes - 1 я смог успешно запустить ваш код.

Что мне удивило, так это то, что после удаления модификатора static из этих двух полей появилось исключение NullPointerException. Я не сделал никаких других изменений, и если бы я снова ввел модификатор static, исключение NullPointerException исчезло. Оказывается, что даже если у вас есть ссылка null, вы все равно можете вызвать методы static и получить доступ к полям static. Например, если вы повторно ввести модификатор static ваших полей, то следующая строка будет не бросить NullPointerException:

System.out.println(((Bracket) null).openBracket); 
Смежные вопросы