请问为何我的JUnit Test出现了NullPointerException的错误呢

orocsy 2013-10-28 06:27:33
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");
}
}
}
...全文
532 5 打赏 收藏 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
boblxj0815 2013-10-28
  • 打赏
  • 举报
回复
楼主,当你 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的日志。
邵云龙 2013-10-28
  • 打赏
  • 举报
回复
debug跟一遍,注意下stack的引用什么时候变null了
失落夏天 2013-10-28
  • 打赏
  • 举报
回复
我猜最大的可能是 stack 这个对象要么已经被释放了,要么就是没有被实例化
orocsy 2013-10-28
  • 打赏
  • 举报
回复
同时也谢谢楼上两位
orocsy 2013-10-28
  • 打赏
  • 举报
回复
引用 3 楼 boblxj0815 的回复:
楼主,当你 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的日志。
解释的很详细,也麻烦你了这么认真看,问题果然解决了,高手谢谢

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧