在 Canculator.java 的 101 行有引用为空,而且,你还使用了 . 来访问其成员。
我这里没有环境,不能帮你调试,你自己看看是什么原因吧。

解决方案 »

  1.   

    LinkedList dataList没有初始化,
    另外“1 2 3 4 4 ”这样的字符串不能用numFormat被转化为数字,如果想把数字转化外字符串,
    可以用,Integer.toString(int num,int radix)第二个参数是进制,这里一般用10。
    validate()是 Container类的一个方法,在上面的子组件删除或者添加的时候,
    迫使 Container重新放置它上面的饿组件。(可以参考sun的java  文档,说的很清楚)
    修改后的代码如下,(仍有错误,不过是算法的问题,你自己再看看吧)
    package caculator;import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.border.*;
    import java.text.NumberFormat;class Canculator
        extends JFrame
        implements ActionListener {
        NumberButton[] numberButtons;
        OperationButton[] operatorButtons;
        JTextField resultShow;
        JPanel p;
        JButton pointButton = new JButton(".");
        JButton resultButton = new JButton("=");
        LinkedList dataList = new LinkedList(); //存贮数据用链表
        boolean flag = false; //是否按下等号的标记
        final String[] s = {
            "+", "-", "*", "/"};
        public Canculator() { //构造函数完成面板的设计
            super("Simple Calculator");
            Container content = this.getContentPane();
            p = new JPanel();
            p.setLayout(new GridLayout(4, 4));
            resultShow = new JTextField(10);
            resultShow.setHorizontalAlignment(JTextField.RIGHT);
            resultShow.setBorder(new SoftBevelBorder(BevelBorder.LOWERED));
            resultShow.setBackground(Color.white);
            resultShow.setEditable(false);
            numberButtons = new NumberButton[10];
            for (int i = 0; i <= 9; i++) {
                numberButtons[i] = new NumberButton(i);
                numberButtons[i].addActionListener(this);
            }
            operatorButtons = new OperationButton[4];
            for (int i = 0; i <= 3; i++) {
                operatorButtons[i] = new OperationButton(s[i]);
                operatorButtons[i].addActionListener(this);
            }
            pointButton.setForeground(Color.blue);
            pointButton.addActionListener(this);
            resultButton.setForeground(Color.red);
            resultButton.addActionListener(this);
            p.add(numberButtons[7]);
            p.add(numberButtons[8]);
            p.add(numberButtons[9]);
            p.add(operatorButtons[0]);
            p.add(numberButtons[4]);
            p.add(numberButtons[5]);
            p.add(numberButtons[6]);
            p.add(operatorButtons[1]);
            p.add(numberButtons[1]);
            p.add(numberButtons[2]);
            p.add(numberButtons[3]);
            p.add(operatorButtons[2]);
            p.add(numberButtons[0]);
            p.add(pointButton);
            p.add(resultButton);
            p.add(operatorButtons[3]);
            content.add(resultShow, "North");
            content.add(p, "Center");
            addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent ee) {
                    System.exit(0);
                }
            });
            setBounds(100, 50, 240, 180);
            setVisible(true);
            content.setVisible(true);
            validate(); //顺便问一下这个函数是干什么用的?
        }    public void actionPerformed(ActionEvent e) {
            if (e.getSource() instanceof NumberButton) {
                NumberButton b = (NumberButton) e.getSource();
                int num = b.getNumber();
                if (dataList.size() == 0 && flag == false) {
                    String s = Integer.toString(num, 10);
                    dataList.add(s);
                    resultShow.setText(s);
                }
                else if (dataList.size() == 1 && flag == false) {
                    String s = (String) dataList.getFirst();
                    s = s.concat(Integer.toString(num, 10));
                    dataList.set(0, s);
                    resultShow.setText(s);
                }
                else if (dataList.size() == 1 && flag == true) {
                    String s = Integer.toString(num, 10);
                    dataList.set(0, s);
                    resultShow.setText(s);
                    flag = false;
                }
                else if (dataList.size() == 2) { //第二个为运算符
                    String s = Integer.toString(num, 10);
                    dataList.add(0, s);
                    resultShow.setText(s);
                }
                else if (dataList.size() == 3 && flag == false) {
                    String s = (String) (dataList.getLast());
                    s = s.concat(Integer.toString(num, 10));
                    dataList.set(2, s);
                    resultShow.setText(s);
                }
            }
      

  2.   

    //代码太长了,分开了。
     if (e.getSource() instanceof OperationButton) {
                OperationButton b = (OperationButton) e.getSource();
                String oper = b.getOperator();
                if (dataList.size() == 1) {
                    dataList.add(oper);
                }
                if (dataList.size() == 2) { //改变运算符号
                    dataList.set(1, oper);
                }
                if (dataList.size() == 3) {
                    try {
                        String number1 = (String) dataList.getFirst();
                        String number2 = (String) dataList.get(1);
                        double n1 = Double.parseDouble(number1);
                        double n2 = Double.parseDouble(number2);
                        String op = (String) dataList.getLast();
                        double n = 0;
                        if (op.equals("+")) {
                            n = n1 + n2;
                        }
                        if (op.equals("-")) {
                            n = n1 - n2;
                        }
                        if (op.equals("*")) {
                            n = n1 * n2;
                        }
                        if (op.equals("/")) {
                            n = n1 / n2;
                        }
                        String result = (String) (" " + n);
                        dataList.set(0, result);
                        dataList.removeLast();
                        dataList.removeLast();
                        resultShow.setText(result);
                        dataList.add(oper);
                    }
                    catch (Exception e1) {
                        System.out.println(e1);
                    }
                }
            }
            if (e.getSource() == pointButton) {
                String dot = ".";
                if (dataList.size() == 1) {
                    String num = (String) (dataList.getFirst());
                    if (num.indexOf(dot) == -1) {
                        String s = (String) (num.concat(dot));
                        dataList.set(0, s);
                        resultShow.setText(s);
                    }
                }
                if (dataList.size() == 3) {
                    String num = (String) (dataList.getLast());
                    if (num.indexOf(dot) == -1) {
                        String s = (String) (num.concat(dot));
                        dataList.set(2, s);
                        resultShow.setText(s);
                    }
                }
            }
            if (e.getSource() == resultButton) {
                flag = true;
                try {
                    String number1 = (String) dataList.getFirst();
                    String number2 = (String) (dataList.get(1));
                    double n1 = Double.parseDouble(number1);
                    double n2 = Double.parseDouble(number2);
                    String op = (String) (dataList.getLast());
                    double n = 0;
                    if (op.equals("+")) {
                        n = n1 + n2;
                    }
                    if (op.equals("-")) {
                        n = n1 - n2;
                    }
                    if (op.equals("*")) {
                        n = n1 * n2;
                    }
                    if (op.equals("/")) {
                        n = n1 / n2;
                    }
                    String result = (String) (" " + n);
                    dataList.set(0, result);
                    dataList.removeLast();
                    dataList.removeLast();
                    resultShow.setText(result);
                }
                catch (Exception e2) {
                    System.out.println(e2);
                }
            }
        }}class OperationButton
        extends JButton {
        public OperationButton(String operator) {
            super(operator);
            this.operator = operator;
        }    private String operator;
        public String getOperator() {
            return operator;
        }
    }class NumberButton
        extends JButton {
        public NumberButton(int aNumber) {
            super(Integer.toString(aNumber, 10));
            this.aNumber = aNumber;
        }    public int getNumber() {
            return aNumber;
        }    private int aNumber;
    }public class CalculatorTest {
        public static void main(String[] args) {
            Canculator cal = new Canculator();
            cal.show();
        }
    }
      

  3.   

    没有这两个类的定义,没法帮你测试。
    NumberButton
    OperationButton
      

  4.   

    后面那两个类hotforever在他的回复中已经加上了。就在你们楼上,麻烦看看
    谢谢hotforever的指教,麻烦你把修改过的句子标记一下,太长了。不好意思
      

  5.   

    我只改了几个地方,一个地方是 LinkList dataList = new LinkList();
    另外那些地方只是把数字的字符串表示Integer.toString(int num,int radix)这个方法,而不是用
    " " + int num 这种方式。