Как исправить «переключатель» в калькуляторе (NoSuchElementException)? - PullRequest
0 голосов
/ 03 марта 2012

Я только что попытался запрограммировать калькулятор. Он может рассчитать синус и другие вещи (которые работают нормально), но у меня есть проблема с кнопкой равных. Например, после ввода 5 + 5 и нажатия кнопки = я получаю эту ошибку:

Exception in thread "AWT-EventQueue-1" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:907)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.nextDouble(Scanner.java:2456)
at Taschenrechner2.button15_ActionPerformed(Taschenrechner2.java:349)
at Taschenrechner2$15.actionPerformed(Taschenrechner2.java:172)
at java.awt.Button.processActionEvent(Button.java:409)
at java.awt.Button.processEvent(Button.java:377)
at java.awt.Component.dispatchEventImpl(Component.java:4860)
at java.awt.Component.dispatchEvent(Component.java:4686)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Вот код для моего полного апплета:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.Locale.*;
import java.util.Scanner.*;


public class Taschenrechner2 extends JApplet {
  // Anfang Attribute
  private TextField textField1 = new TextField();
  private Button button1 = new Button();
  private Button button2 = new Button();
  private Button button3 = new Button();
  private Button button4 = new Button();
  private Button button5 = new Button();
  private Button button6 = new Button();
  private Button button7 = new Button();
  private Button button8 = new Button();
  private Button button9 = new Button();
  private Button button10 = new Button();
  private Button button11 = new Button();
  private Button button12 = new Button();
  private Button button13 = new Button();
  private Button button14 = new Button();
  private Button button15 = new Button();

  private TextField textField2 = new TextField();

  public void button15_ActionPerformed(ActionEvent evt) {

    double x = new java.util.Scanner( textField1.getText() ).nextDouble();
    char operator = new java.util.Scanner( textField1.getText() ).nextLine().charAt( 0 );
    double y = new java.util.Scanner( textField1.getText() ).nextDouble();


          switch ( operator )
     {
      case '+':

      double c=x+y;
      String s=String.valueOf(c);
      textField1.setText(s);
       break;
      case '-':

      double d=x-y;
      String g=String.valueOf(d);
      textField1.setText(g);
      break;
      case '*':

      double e=x*y;
      String h=String.valueOf(e);
      textField1.setText(h);
      break;
      case '/':

      double f=x/y;
      String i=String.valueOf(f);
      textField1.setText(i);
      break;
    }

  }

Я был бы очень признателен, если бы вы могли мне помочь.

Ответы [ 3 ]

2 голосов
/ 03 марта 2012

Сначала некоторые основные проблемы кодирования:

  • Не смешивайте компоненты AWT и Swing, если у вас нет веских причин для этого (у вас нет), и вы действительно не знаете, что делаете, когда делаете это (у вас нет, и на самом деле я тоже не знаю) ). Поэтому измените TextField на JTextField, Button на JButton и т. Д ...
  • Попробуйте использовать массивы для упрощения и сокращения вашего кода. Более 90% вашего кода является избыточным, что повышает риск обнаружения ошибок и значительно затрудняет отладку кода. Мало того, что уродливый код сложнее для вам для отладки, но и для us гораздо сложнее понять и отладить!
  • Имена переменных должны иметь смысл, должны сделать ваш код комментирующим.
  • Используйте менеджеры компоновки Swing для выполнения сложной компоновки за вас.

Теперь по конкретике

  • Ваш код коммутатора не является основной проблемой, это то, что вы используете сканер неправильно. Пожалуйста, проверьте учебники, чтобы увидеть, как правильно его использовать.
  • Работа над исправлением этого метода в очень маленькой тестовой программе без графического интерфейса, изолированной от сотен строк несвязанного кода. Бросьте строку «Test Strings» в метод и посмотрите, сможете ли вы изменить код в этой небольшой среде для правильной работы, и только затем добавьте его в свою большую программу.
0 голосов
/ 03 марта 2012

Когда вы повторно запускаете сканер каждый раз, ваш nextDouble () всегда будет возвращать одно и то же значение. Кроме того, мне немного любопытно, почему вы используете оператор, когда вы никогда его не используете.

0 голосов
/ 03 марта 2012

Если вы хотите использовать сканер, вы не должны повторно инициировать каждый раз.

Вы не сказали, что содержит textField1. Попробуйте это, если он содержит текст в следующем формате: «1.0 \ n + \ n2.0» (если это другой формат, объясните где-нибудь):

Scanner sca = new Scanner(textField1.getText());
double x = sca.nextDouble();
sca.nextLine();
char operator = sca.nextLine().charAt( 0 );
double y = sca.nextDouble();

Это может просто сделать вас на шаг ближе и пропустить это исключение. Обязательно прочитайте другие отличные ответы здесь.

...