stack.clear();这里出现的错误
import static org.junit.Assert.*;
import junit.framework.TestCase;
import org.junit.Test;
public class StackTest extends TestCase { private SelfDefinedStack stack_test;

public  void Test()
{
stack_test = new SelfDefinedStack();
testsize();
testclear();
testpush();
testtop();
testpop();

}
/** 
    * Test of size() method of class SelfDefinedStack 
    * This method will push an element into the stack and verify that the stack size will 
    * increase by 1 
    */
public void testsize()
{
int count = 0;
count = stack_test.size();
System.out.println("size of the stack is "+count);

stack_test.push("test_stack1");
int newcount = stack_test.size();
System.out.println("size of the stack is "+newcount);
if(newcount != count+1)
{
System.out.println("sizetest failed");
}
else
{
System.out.println("sizetest passed");
}
}
/** 
    * Test of push() method of class SelfDefinedStack 
    * This method will push an element into the stack and verify that the stack size will 
    * increase by 1
    */
public void testpush()
{
stack_test.clear();
if(stack_test.size() != 0)
{
System.out.println("testpush() failed on size");
}
else
{
stack_test.push("test_stack2");
if(stack_test.size() != 1)
{
System.out.println("testpush() failed");
}
else
{
System.out.println("testpush() passed");
}
}
}
/** 
    * Test of pop() method of class SelfDefinedStack 
    * This method will pop out the element on the top of the stack and verify the returned item
    */
public void testpop()
{
stack_test.clear();
if(stack_test.size() != 0)
{
System.out.println("testpop() failed on size");
}
else
{
stack_test.push("test_stack3");
if(stack_test.size() != 1)
{
System.out.println("testpush() failed");
}
String popElem = stack_test.pop().toString();
if(popElem == null)
{
System.out.println("testtop() failed: return element is null");
}
            else if (popElem != "test_stack3")
            {
             System.out.println("testpop() failed wrong element returned ");
            }
            else if(stack_test.size() != 0)
            {
             System.out.println("testpop() failed: size is not 0");
            }
            System.out.println("testpop() passed");
}
}
 /** 
   * Test of top() method of class SelfDefinedStack 
   * This method will verify that the element on the top of the stack will be retrieved and the
   * stack won't change
   */
public void testtop()
{
    stack_test.clear();
    if(stack_test.size() != 0)
    {
     System.out.println("testtop() failed on size");
    }
    else
    {
     stack_test.push("test_stack4");
     stack_test.push("test_stack5");
     String topElem = stack_test.top().toString();
     if(stack_test.size() != 2)
     {
     System.out.println("testtop() failed on size");
     }
     else if(topElem == null)
     {
     System.out.println("testtop() failed: Element topped from stack is null");
     }
     else if(!topElem.equals("test_stack5"))
     {
     System.out.println("testtop() failed: Element topped is not the first element of the stack");
     }
     else
     System.out.println("testtop() passed");
    }
}
/** 
   * Test of clear() method of class SelfDefinedStack 
   * This method will verify that all elements in the stack have been removed
   */
public void testclear()
{
stack_test.push("test_stack6");
if(stack_test.size() <= 0)
{
System.out.println("testclear() failed on push");
}
else
{
stack_test.clear();
if(stack_test.size() != 0)
{
System.out.println("testclear() failed");
}
else
System.out.println("testclear() passed");
}

}
}
以上是测试类
以下是实现的简单堆栈功能
import java.util.LinkedList;
/**
 * This class 
 * @author shiyucai
 *
 */
public class SelfDefinedStack implements Stack{ /**
 * 
 */
@Override
public void push(Object obj) {
      assert obj!=null;
assert wellformed();
num++;
list.addFirst(obj);
}
    /**
     * 
     */
@Override
public Object pop() {
// TODO Auto-generated method stub
assert wellformed();
return list.pollFirst();
}
   /**
    * 
    */
@Override
public int size() {
// TODO Auto-generated method stub
assert wellformed();
return list.size();
}
    /**
     * 
     */
@Override
public Object top() {
// TODO Auto-generated method stub
assert wellformed();
if(num!=0)
return list.getFirst();
else
return "empty stack";
}

 public void clear() {
      list = new LinkedList<Object>();
      num = 0;
    }

public boolean isEmpty() {return list.isEmpty();}
protected boolean wellformed(){ if (this.size() < 0 || this.size() > num) { 
            return false; 
        } 
        return true;
  }
public String Link()
{
LinkedList<Object> lnk = new LinkedList<Object>();
if(num >= 1)
{
lnk = list;
}
else
{
return "Empty Stack";
}
return lnk.toString();
}
   private LinkedList<Object> list = new LinkedList<Object>();
   private int num = 0;
}
public interface Stack 
{
    public void push(Object obj);
    public Object pop();
    public int size();
    public Object top();
    
}import javax.swing.JApplet;
public class StackJApplet extends JApplet implements ActionListener{
public StackJApplet() {
}
Toolkit kit = Toolkit.getDefaultToolkit();
private JTextField txtEnterANumber;
private Dimension d = kit.getScreenSize();
private SelfDefinedStack stack = new SelfDefinedStack();
private JPanel panel;
private JLabel lblPleaseEnterThe, lblNewLabel ;
private JButton btnTop,btnPush,btnPop,btnNewButton;
private JTextArea txtrEmptyStack;
public void init() {
setSize(d.width/4,d.height/3);
panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setLocation(d.width/2, d.height/2);
panel.setBackground(Color.YELLOW);
panel.setForeground(Color.WHITE);
getContentPane().add(panel, BorderLayout.CENTER);
panel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
lblPleaseEnterThe = new JLabel("please enter the number you want to push");
lblPleaseEnterThe.setForeground(Color.BLUE);
panel.add(lblPleaseEnterThe);
txtEnterANumber = new JTextField();
panel.add(txtEnterANumber);
txtEnterANumber.setColumns(10);
btnTop = new JButton("top");
btnTop.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
TopButtonaction(e);
}
});
panel.add(btnTop, BorderLayout.WEST);
btnPush = new JButton("Push");
btnPush.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
PushButtonaction(e);
}
});
btnPop = new JButton("Pop");
btnPop.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
PopButtonaction(e);
}
});
panel.add(btnPop);
panel.add(btnPush);
txtrEmptyStack = new JTextArea();
txtrEmptyStack.setText("Empty Stack");
txtrEmptyStack.setRows(10);
txtrEmptyStack.setLineWrap(true);
txtrEmptyStack.setFont(new Font("Lucida Grande", Font.BOLD, 13));
txtrEmptyStack.setEditable(false);
txtrEmptyStack.setColumns(20);
panel.add(txtrEmptyStack);

lblNewLabel = new JLabel("<html><font size = 4 color = Blue>Welcome!");
lblNewLabel.setForeground(Color.BLUE);
panel.add(lblNewLabel, BorderLayout.SOUTH);

btnNewButton = new JButton("Clear Stack");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ClearButtonaction(e);
}
});
panel.add(btnNewButton, BorderLayout.SOUTH); }
protected void ClearButtonaction(ActionEvent e) {
// TODO Auto-generated method stub
if(stack.isEmpty())
{
lblNewLabel.setText("<html><font size = 4 color = Red>Stack is already cleared");
}
else
{
stack.clear();
lblNewLabel.setText("<html><font size = 4 color =Blue>StackCleared");
txtrEmptyStack.setText("Empty Stack");
}
}
protected void PopButtonaction(ActionEvent e) {
// TODO Auto-generated method stub
if(stack.isEmpty())
{
lblNewLabel.setText("<html><font size = 4 color = Red>Stack's Empty Can't Pop");
}
else
{
Object obj = stack.pop();
lblNewLabel.setText("<html><font size = 4 color = Blue>"+obj.toString()+"is poped");
newText();
}
}
protected void PushButtonaction(ActionEvent e) {
// TODO Auto-generated method stub
if(txtEnterANumber.getText().equals(""))
{
lblNewLabel.setText("<html><font size = 4 color = Red>Please input a number to push");
}
else
{
stack.push(txtEnterANumber.getText());
lblNewLabel.setText("<html> <font size = 4 color = Blue>"+txtEnterANumber.getText()+"is pushed");
newText();
}
txtEnterANumber.setText("");
}
protected void TopButtonaction(ActionEvent e) {
// TODO Auto-generated method stub
if(stack.isEmpty())
{
lblNewLabel.setText("<html><font size = 4 color = Red>Empty Stack Can't Top");
}
else
{
stack.top();
lblNewLabel.setText("<html><font size = 4 color = Blue>"+stack.top().toString()+"is topped");
newText();
}
}
protected void MouseClickedaction(MouseEvent e) {
// TODO Auto-generated method stub
if(txtEnterANumber.getText().equals(""))
{
txtEnterANumber.setText("Enter a number");
}
else
{
txtEnterANumber.setText("");
}
}
public void newText() {
    if (!stack.isEmpty()) {
     txtrEmptyStack.setText(stack.Link() + "\r\n" + "Size of Stack: " + stack.size() + 
        "\r\nTop of Stack: " + stack.top());
    } else {
     txtrEmptyStack.setText("Empty Stack");
    }
  }
}

解决方案 »

  1.   

    我猜最大的可能是stack
    这个对象要么已经被释放了,要么就是没有被实例化
      

  2.   

    debug跟一遍,注意下stack的引用什么时候变null了
      

  3.   

    楼主,当你 Run as JUnit Test时,在你的StackTest类中的Test函数是不会被调用的。
    只会调用你写的test***的测试函数类。
    所以,stack_test这个变量在JUnit Test 调用 test*** 函数时,会是被认为没有初始化。
    所以会抛出NullPoint这个异常。解决方案: 定义时就初始化stack_test 这个变量。
    private SelfDefinedStack stack_test;
    修改为:
    private SelfDefinedStack stack_test = new SelfDefinedStack();;
    然后再运行,就没有任何问题了。
    楼主的test***函数写的都没有问题,如果
    楼主的unit test 自己写个main函数,调用Test()函数,并且最后Run as Java Application,而不是Run as JUnit Test,那么,也不会报NullPointer的异常,而且会正常打印出 test pass的日志。