2012-03-03 4 views
0

방금 ​​계산기를 프로그래밍하려고했습니다. 그것은 부비동과 다른 것을 계산할 수 있습니다 (잘 작동합니다),하지만 같은 버튼에 문제가 있습니다.계산기에서 "스위치"를 수정하는 방법 (NoSuchElementException)?

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

    } 

내가 당신 경우 매우 감사하게 될 것입니다 :

여기
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) 

내 완료 애플릿의 코드입니다 : 내가 5 예를 들어 + 5에 넣고 = 버튼을 누른 후, 나는이 오류 도와 줄 수 있어요.

+0

400 개가 넘는 코드가 있습니다. 너무 많이 - 당신은 문제를 증명하는 * 최소한의 프로그램으로 줄여야합니다. http://tinyurl.com/so-hints –

답변

2

먼저 몇 가지 기본적인 코딩 문제 :

  • 당신이 이렇게위한 좋은 이유 (그렇지)가 정말이 일을 할 때 당신이 무슨 일을하는지 알지 못한다면 AWT와 스윙 구성 요소를 혼합하지 마십시오 (당신은하지 않으며, 실제로 나는 어느 쪽도하지 않습니다). 따라서 TextField를 JTextField, Button to JButton 등으로 변경하십시오.
  • 코드를 단순화하고 단축하려면 배열을 사용해보십시오. 코드의 90 % 이상이 중복되므로 오류를 찾아 내기가 더 어려워지며 코드를 디버그하는 것이 훨씬 더 어려워집니다. 에 대한 더 큰 코드 추한 코드는 디버그 일뿐 만 아니라 을 이해하고 디버그하는 것이 훨씬 더 어렵습니다.
  • 변수 이름이 의미가 있어야하며 코드 자체를 주석으로 작성해야합니다.
  • 스윙 레이아웃 관리자를 사용하여 하드 레이아웃 작업을 수행하십시오. 구체적인

    지금

  • 귀하의 스위치 코드는, 당신이 스캐너 잘못 사용하고있는 intial 문제입니다하지 않습니다. 튜토리얼을 올바르게 사용하는 방법을 확인하십시오.
  • 아주 작은 비 GUI 테스트 프로그램에서이 방법을 수정하십시오. 하나는 관련없는 코드 라인에서 분리 된 것입니다. 테스트 문자열을 메서드에 던지고이 작은 환경에서 코드를 수정하여 올바르게 작동하는지 확인한 다음 큰 프로그램에 추가하십시오.
+0

변수를 저장하는 것이 가능한지 알고 계십니까?나는 필드에 3을 넣고 "+"버튼을 클릭하면 이중 x로 저장합니다. 필드에 다른 숫자를 입력하면 (3이 삭제 된 후) "="- 버튼을 클릭하면이 값이 double y로 저장됩니다. 그래서 스캐너를 사용할 필요가없고 스위치 만 사용해야합니다. – user1247054

+0

@ user1247054 : 나중에 선입 선출 (LIFO) 스택을 사용하여 숫자와 연산자를 스택에 넣고 나중에 필요할 때 순서대로 검색 할 수 있습니다. Google Stack Stackingflow.com에서 스택을 처음으로 시도해 보았습니다. –

+0

스택을 사용하여 지금 시도했지만 어떤 이유로 든 다음과 같이 처리합니다. "AWT-EventQueue-1"java.util.EmptyStackException 예외. 최대한 빨리 코드를 게시하겠습니다. – user1247054

0

스캐너를 사용하려면 매번 다시 시작하지 않아야합니다.

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(); 

이 그냥 한 걸음 더 가까이 당신을 얻을하고 예외를 전달할 수 있습니다. 다른 우수한 답변을 읽으십시오.

0

매번 스캐너를 다시 실행하면 nextDouble()이 항상 동일한 값을 반환합니다. 또한 사용하지 않는 경우 연산자를 사용하는 이유가 약간 궁금합니다.

관련 문제