SWING做简单的登录界面,抛出空指针异常

package com.hu.login;

import java.awt.*;
import javax.swing.*;

public class Loginframe extends JFrame {

/**
 * 
 */
private static final long serialVersionUID = 1L;
/**
 * @param args
 */
JPanel jp1, jp2;
JLabel jl1, jl2;
JButton jb1, jb2;
JTextField jtf;
JPasswordField jpf;

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Loginframe lf = new Loginframe();
}

public Loginframe() {
    jl1 = new JLabel("用户名:");
    jtf = new JTextField(10);
    jl2 = new JLabel("密  码:");
    jpf = new JPasswordField();
    jb1 = new JButton("登录");
    jb1 = new JButton("取消");

    jp1 = new JPanel();
    jp2 = new JPanel();

    jp2.add(jl1);
    jp2.add(jtf);
    jp2.add(jl2);
    jp2.add(jpf);
    jp2.add(jb1);
    jp2.add(jb2);

    this.setSize(400, 400);
    this.setTitle("登录界面");

    this.add(jp1, BorderLayout.NORTH);
    this.add(jp2, BorderLayout.SOUTH);

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);

}

}

[code="java"]
jb2 = new JButton("取消");
jb2 不是 jb1 。。。。
[/code]

[code="java"]
Exception in thread "main" java.lang.NullPointerException
at com.hu.login.Loginframe.(Loginframe.java:42)
at com.hu.login.Loginframe.main(Loginframe.java:23)
空指针异常:程序中的错误与我们程序相关的就停在42行。那看一下42行
jp2.add(jb2); 这说明不是 jp2 就是jb2
查看一下,发现是 jb2没有初始化。这纯脆是个手误,但要学会如何看错。
[/code]