Ошибка реализации Java-интерфейса Swing

1

Мой проект должен выполнять основные операции над многочленами. Каждый многочлен si является ArrayList объектов из класса Monom. Я создал интерфейс с Swing. Я сделал метод, который преобразует строку, полученную в объект Polinom. Если я использую основные команды, например, когда я нажимаю кнопку, получаю текст и показываю его, все работает нормально. Но когда я называю метод, упомянутый ранее (toPolinom), кнопки больше не работают, а красные строки записываются в консоль.

Вот как выглядит код кнопки:

 mybutton = new JButton("Suma");
    mybutton.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {

            String pol1 = numberField1.getText();
            String pol2 = numberField2.getText();
            polinom1 = new Polinom(p1);
            polinom2 = new Polinom(p2);
            polinom1 = polinom1.toPolinom(pol1);
            polinom2 = polinom2.toPolinom(pol2);
            resultField.setText(polinom1.suma(polinom1, polinom2)
                    .toString());       

        }
    }); 

   mybutton2 = new JButton("Diferenta");
    mybutton2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String pol1 = numberField1.getText();
            String pol2 = numberField2.getText();
            polinom1 = polinom1.toPolinom(pol1);
            polinom2 = polinom2.toPolinom(pol2);
            resultField.setText(rezultat.diferenta(polinom1, polinom2)
                    .toString());

        }
    });

resultField и numberField1 - это тип JTextField;

Это мой toPolinom() из класса Polinom.java:

   public  Polinom toPolinom(String p1) {

    List<Monom> prez = new ArrayList<Monom>();
    int grad, coef;
    int i = 0;
    for(i=0; i<p1.length()-1; i=i+5){
        grad=0; coef=0;
        if(p1.charAt(i)=='+') coef=Character.getNumericValue(p1.charAt(i+1));
        else if (p1.charAt(i)=='-') coef=-Character.getNumericValue(p1.charAt(i+1));
        grad=Character.getNumericValue(p1.charAt(i+4));
        prez.add(new MonomZ(grad, coef));
    }


    return new Polinom(prez);
}

Я тестировал этот метод, и он работает.

Наконец, это то, что я получаю, когда я нажимаю на свои кнопки:

   Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at tema1.Polinom.toString(Polinom.java:208)
at tema1.Fatza$1.actionPerformed(Fatza.java:61)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$400(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Добавлен предупреждающий метод:

  public String toString() {

    String Rezultat = "";
    for (int i = 0; i < polinom.size() - 1; i++) {
        Rezultat = Rezultat + verificare(polinom.get(i), polinom, i);
    }
    return Rezultat
            + verificare(polinom.get(polinom.size() - 1), polinom, //line 208
                    polinom.size() - 1);

}

private String verificare(Monom monom, List<Monom> polinom, int n) {
    // functia verifica daca trebuie adaugat semn sau nu
    String text;
    boolean ok = true;
    for (int i = 0; i < n; i++) {
        if (polinom.get(i).getCoef().doubleValue() != 0) {
            ok = false;
            break;
        }
    }
    double numar = monom.getCoef().doubleValue();
    if (ok == true && numar > 0) {
        text = monom.toString();
    } else {
        text = "+" + monom.toString();
    }
    if (numar < 0) {// numarul are inclus semn negativ
        text = monom.toString();
    }
    return text;
}

Если я забыл какую-либо информацию, пожалуйста, спросите меня.

  • 2
    Не игнорируйте сообщение об исключении, так как оно говорит вам, что не так, ArrayIndexOutOfBoundsException , что является неправильным значением, -1 и номер строки, где это происходит: at tema1.Polinom.toString(Polinom.java:208) . Так какой код находится в строке 208 класса Polinom?
  • 0
    Пожалуйста, покажите эту строку кода и код вокруг него. Отредактируйте свой вопрос. И это не имеет большого значения, если он работает хорошо где-то еще, поскольку он не работает сейчас хорошо.
Теги:
swing

3 ответа

3
Лучший ответ

Вы звоните

verificare(polinom.get(polinom.size() - 1), polinom,' 'polinom.size() - 1);

и получение ArrayIndexOutOfBoundsException с -1 значением, предполагающим, что ваш размер коллекции полинома равен 0 когда вы получаете ошибку. Проверьте это и не вызывайте этот метод, если размер равен 0.

  • 0
    Ты прав. Если я не призываю этот метод в ActionListener , у меня нет ошибок. Но почему это работает в моих тестах и все остальное? Не могли бы вы указать, что я делаю не так? Спасибо
  • 0
    @LauraD: для этого вам нужно создать и опубликовать минимальный пример программы или mcve .
3

в вашем методе:

public  Polinom toPolinom(String p1) {
    ....
    for(i=0; i<p1.length()-1; i=i+5){

вы увеличиваете каждый цикл около 5

поэтому представьте эту строку "1234567": первый цикл вы получите 12345, следующий цикл - только 67, но вы пытаетесь это сделать:

grad=Character.getNumericValue(p1.charAt(i+4));

в этот момент я + 4 = 9, и это outOfBound... я думаю (не тестировал его, и вы не показывали строку, где была ошибка), это ваша проблема

  • 0
    Дело в том, что toPolinom() состоит в том, что он работает только для определенных случаев. Пользователь должен соблюдать некоторые правила. Итак, моя строка выглядит так: + 1X ^ 3-2X ^ 0.
  • 0
    @LauraD В этом случае ваша проблема, вероятно, из того, что упомянул Ховеркрафт, пока вы проверяете длину p1. +1 в любом случае, поскольку это могло быть проблемой, если бы не было правил для проверки p1.Length%5==0
0

Все отлично работало после того, как я изменил методы toString() и verificare() следующим образом:

      public String toString() {
    int ok = 0;
    String Rezultat = "";
    for (int i = 0; i < polinom.size(); i++) {
        Rezultat = Rezultat + verificare(polinom.get(i), polinom, i);
        if (polinom.get(i).getCoef().doubleValue() != 0)
            ok = 1;
    }
    if (ok == 1)
        return Rezultat;
    else
        return "0";

}

private String verificare(Monom monom, List<Monom> polinom, int n) {
    String text = "";

    double numar = monom.getCoef().doubleValue();
    if (n != 0 && numar > 0) {

        text = "+" + monom.toString();
    } else
        text = monom.toString();
    if (numar < 0) {// numarul are inclus semn negativ
        text = monom.toString();
    }
    return text;

}

Большое вам спасибо за вашу помощь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню