Мой проект должен выполнять основные операции над многочленами. Каждый многочлен 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;
}
Если я забыл какую-либо информацию, пожалуйста, спросите меня.
Вы звоните
verificare(polinom.get(polinom.size() - 1), polinom,' 'polinom.size() - 1);
и получение ArrayIndexOutOfBoundsException
с -1 значением, предполагающим, что ваш размер коллекции полинома равен 0
когда вы получаете ошибку. Проверьте это и не вызывайте этот метод, если размер равен 0.
ActionListener
, у меня нет ошибок. Но почему это работает в моих тестах и все остальное? Не могли бы вы указать, что я делаю не так? Спасибо
в вашем методе:
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... я думаю (не тестировал его, и вы не показывали строку, где была ошибка), это ваша проблема
toPolinom()
состоит в том, что он работает только для определенных случаев. Пользователь должен соблюдать некоторые правила. Итак, моя строка выглядит так: + 1X ^ 3-2X ^ 0.
p1.Length%5==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;
}
Большое вам спасибо за вашу помощь!
ArrayIndexOutOfBoundsException
, что является неправильным значением,-1
и номер строки, где это происходит:at tema1.Polinom.toString(Polinom.java:208)
. Так какой код находится в строке 208 класса Polinom?