import java.awt.*;
import java.awt.event.*;
public class Calculator extends Frame implements ActionListener{
    Button[] btn=new Button[10];
    Button btn_add=new Button("+");
    Button btn_sub=new Button("-");
    Button btn_mul=new Button("*");
    Button btn_div=new Button("÷");
    Button btn_c=new Button("clear");
    Button btn_equ=new Button("=");
    TextField ta=new TextField(10);
    Panel p=new Panel();
    static char c;
    String s;
    double a,b;
    int n=0; //统计运算符个数 
    int i=0; // 1为+;2为-;3为*;4为/
    public Calculator()
    {
     super("我的计算器");
     this.addWindowListener(new WindowAdapter(){
     public void windowClosing(WindowEvent e)
     {
     dispose();System.exit(0);
     }
     });
     for(int i=0;i<10;i++)
     {
     btn[i]=new Button(""+i);btn[i].addActionListener(this);
     }
     btn_add.addActionListener(this);
     btn_sub.addActionListener(this);
     btn_mul.addActionListener(this);
     btn_div.addActionListener(this);
     btn_c.addActionListener(this);
     btn_equ.addActionListener(this);
    
     p.setLayout(new GridLayout(4,4));
     p.add(btn[1]);p.add(btn[2]);p.add(btn[3]);p.add(btn_add);
     p.add(btn[4]);p.add(btn[5]);p.add(btn[6]);p.add(btn_sub);
     p.add(btn[7]);p.add(btn[8]);p.add(btn[9]);p.add(btn_mul);
     p.add(btn[0]);p.add(btn_div);p.add(btn_c);p.add(btn_equ);
    
     this.setLayout(new BorderLayout(10,10));
     this.add(ta,"North");
     this.add(p,"Center");
    
     this.pack();
     this.setVisible(true);
    }


public void actionPerformed(ActionEvent e) {

if(e.getSource()==btn[0]) s=s+"0";
if(e.getSource()==btn[1]) s=s+"1";
if(e.getSource()==btn[2]) s=s+"2";
if(e.getSource()==btn[3]) s=s+"3";
if(e.getSource()==btn[4]) s=s+"4";
if(e.getSource()==btn[5]) s=s+"5";
if(e.getSource()==btn[6]) s=s+"6";
if(e.getSource()==btn[7]) s=s+7;
if(e.getSource()==btn[8]) s=s+8;
if(e.getSource()==btn[9]) s=s+9;
                  if(s=="") ta.setText("");        
                   else ta.setText(s);
                   a=Double.parseDouble(s);
                   if(n<1) b=a;
 if(e.getSource()==btn_add)  
 {
c='+';
s="";
                        n=n+1;
                        if(n>1)
                         {
                           switch(i)
                           {
                        case 1:  b=b+a;break;
case 2:  b=b-a;break;
case 3:  b=b*a;break;
case 4:  b=b/a;break;                            }
                            
                         }
                         i=1;
                           
}
if(e.getSource()==btn_sub)  
{
c='-';
s="";
                        n=n+1;
                        if(n>1)
                         {
                           switch(i)
                           {
                        case 1:  b=b+a;break;
case 2:  b=b-a;break;
case 3:  b=b*a;break;
case 4:  b=b/a;break;                            }
                            
                            }
                            i=2;
                         
}
if(e.getSource()==btn_mul)  
{
c='*';
        s="";
                        n=n+1;
                        if(n>1)
                         {
                           switch(i)
                           {
                        case 1:  b=b+a;break;
case 2:  b=b-a;break;
case 3:  b=b*a;break;
case 4:  b=b/a;break;                            }
                          }
                            i=3;
                         
}
if(e.getSource()==btn_div)  
{
c='/';
s="";
                        n=n+1;
                        if(n>1)
                         {
                           switch(i)
                           {
                        case 1:  b=b+a;break;
case 2:  b=b-a;break;
case 3:  b=b*a;break;
case 4:  b=b/a;break;                            }
                            }
                         i=4;
                         
}
if(e.getSource()==btn_equ)
{


switch(i)
{
case 1:  b=b+a;break;
case 2:  b=b+a;break;
case 3:  b=b+a;break;
case 4:  b=b+a;break;
}
                      ta.setText(Double.toString(b));
}
if(e.getSource()==btn_c)  {ta.setText("");s="";b=0;n=0;i=0;};

} public static void main(String[] args) {
Calculator ca=new Calculator();
}
}
大家帮忙看下,是哪错了还是不可以用这种方法实现?
对编写计算器还有很多不明白的地方,希望给点意见
谢谢

解决方案 »

  1.   

    第一,你的String s没有初始化,所以导致始终报空指针,只要String s=""就可以了
    第二,我测试了下,逻辑有问题,具体的逻辑自己看吧,如果需要,我可以提供个以前自己写的给你参考
      

  2.   

    以前学java的时候写的import java.awt.*; 
    import java.awt.event.*; 
    public class Calculator extends WindowAdapter implements ActionListener { 
        private double result=0,data1=0,radixPointDepth=1; 
        private boolean radixPointIndicate=false,resultIndicate=false; 
        private char prec='+'; 
        private Frame f; 
        private TextField tf; 
        private Button b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17; 
        private Panel p; 
        private static String a="";
        static public void main(String args[]) { 
            Calculator de=new Calculator(); 
            de.go(); 
        } 
        public void go() { 
            f=new Frame("傻瓜计算器"); 
            p=new Panel(); 
            p.setLayout(new GridLayout(4,4)); 
            tf=new TextField(30); 
            b1=new Button("7"); 
            b2=new Button("8"); 
            b3=new Button("9"); 
            b4=new Button("+"); 
            b5=new Button("4"); 
            b6=new Button("5"); 
            b7=new Button("6"); 
            b8=new Button("-"); 
            b9=new Button("1"); 
            b10=new Button("2"); 
            b11=new Button("3"); 
            b12=new Button("*"); 
            b13=new Button("0"); 
            b14=new Button("."); 
            b15=new Button("="); 
            b16=new Button("/"); 
            b17=new Button("清零"); 
            f.add(tf,"North"); 
            f.add(p,"Center"); 
            f.add(b17,"South"); 
            p.add(b1); 
            p.add(b2); 
            p.add(b3); 
            p.add(b4); 
            p.add(b5); 
            p.add(b6); 
            p.add(b7); 
            p.add(b8); 
            p.add(b9); 
            p.add(b10); 
            p.add(b11); 
            p.add(b12); 
            p.add(b13); 
            p.add(b14); 
            p.add(b15); 
            p.add(b16); 
            b1.addActionListener(this); 
            b2.addActionListener(this); 
            b3.addActionListener(this); 
            b4.addActionListener(this); 
            b5.addActionListener(this); 
            b6.addActionListener(this); 
            b7.addActionListener(this); 
            b8.addActionListener(this); 
            b9.addActionListener(this); 
            b10.addActionListener(this); 
            b11.addActionListener(this); 
            b12.addActionListener(this); 
            b13.addActionListener(this); 
            b14.addActionListener(this); 
            b15.addActionListener(this); 
            b16.addActionListener(this); 
            b17.addActionListener(this); 
            f.addWindowListener(this); 
            f.setSize(250,190); 
            f.setVisible(true); 
        } 
        public void actionPerformed(ActionEvent e) { 
            String s; 
            s=e.getActionCommand(); 
            switch(s.charAt(0)) { 
                case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 
                if(resultIndicate) { 
                    result=0; 
                    data1=0; 
                    prec='+'; 
                } 
                Integer Int1=new Integer(s); 
                if(radixPointIndicate) { 
                    radixPointDepth=radixPointDepth/10; 
                    data1=data1+(Int1.intValue())*radixPointDepth; 
                }     else { 
                    data1=data1*10+(Int1.intValue()); 
                } 
                Double displayNumber=new Double(data1); 
                tf.setText(a+displayNumber.toString()); 
                resultIndicate=false; 
                break; 
                case '+': case '-':case '*':case '/':case '=': 
                if(s.charAt(0)!='='&&resultIndicate) { //不是等于而且真
                    prec=s.charAt(0); 
                    resultIndicate=false; 
                } else { 
                    switch(prec) { 
                        case '+': 
                        result=result+data1; 
                        break; 
                        case '-': 
                        result=result-data1; 
                        break; 
                        case '*': 
                        result=result*data1; 
                        break; 
                        case '/': 
                        result=result/data1; 
                        break; 
                    } 
                } 
                radixPointIndicate=false; 
                radixPointDepth=1; 
                displayNumber=new Double(result); 
                a=new String(displayNumber.toString()+s.charAt(0));
                if(s.charAt(0)=='='){
                    tf.setText(displayNumber.toString()); 
                }else{
                    tf.setText(a);
                }    
                
                if(s.charAt(0)!='=') { //不是等于
                    data1=0; 
                    prec=s.charAt(0); 
                } else { 
                    resultIndicate=true; 
                } 
                break; 
                case '.':
                radixPointIndicate=true; 
                break; 
            } 
            if(s.equals("清零")) { 
                result=0; 
                data1=0; 
                radixPointDepth=1; 
                tf.setText(""); 
                a="";
            } 
        } 
        public void windowClosing(WindowEvent e) { 
            System.exit(0); 
        } 
    }