为什么我的写的程序总是报 java.lang.NllPointerExcepion  请各位高手指点哈

解决方案 »

  1.   

    那就不可能报NullPointerException
      

  2.   

    package exercise.swt;import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Date;
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JDialog;
    import javax.swing.JLabel;
    import javax.swing.JTextField;
    import exercise.swt.dal.DBManager;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    //import java.text.ParsePosition;
    import java.text.ParsePosition;
    import java.text.SimpleDateFormat;public class OffComputerDialog extends JDialog implements ActionListener { private JComboBox cboMachineNum; private JTextField txtEndTime; private Date now; private SimpleDateFormat sdf; private String url; private Connection con; private Statement st; private ResultSet rs; private PreparedStatement pre; private String sql; // private int rowCount;
    /**
     * 
     */
    private static final long serialVersionUID = 1L; /**
     * Launch the application
     * 
     * @param args
     */
    // public static void main(String args[]) {
    // try {
    // OffComputerDialog dialog = new OffComputerDialog();
    // dialog.addWindowListener(new WindowAdapter() {
    // public void windowClosing(WindowEvent e) {
    // System.exit(0);
    // }
    // });
    // dialog.setVisible(true);
    // } catch (Exception e) {
    // e.printStackTrace();
    // }
    // }
    /**
     * Create the dialog
     */
    public OffComputerDialog() {
    super();
    getContentPane().setLayout(null);
    setTitle("欢迎再次光临");
    setBounds(100, 100, 500, 375); final JButton btnSure = new JButton();
    btnSure.setFont(new Font("黑体", Font.BOLD, 22));
    btnSure.addActionListener(this);
    btnSure.setText("确定");
    btnSure.setBounds(98, 256, 89, 41);
    getContentPane().add(btnSure); final JButton btnReset = new JButton();
    btnReset.setFont(new Font("黑体", Font.BOLD, 22));
    btnReset.setText("重置");
    btnReset.setBounds(265, 256, 89, 41);
    getContentPane().add(btnReset); final JLabel lblMachineNum = new JLabel();
    lblMachineNum.setFont(new Font("黑体", Font.BOLD, 18));
    lblMachineNum.setText("机 器 号:");
    lblMachineNum.setBounds(98, 69, 125, 18);
    getContentPane().add(lblMachineNum); final JLabel lblEndTime = new JLabel();
    lblEndTime.setFont(new Font("黑体", Font.BOLD, 18));
    lblEndTime.setText("结束时间:");
    lblEndTime.setBounds(98, 164, 125, 18);
    getContentPane().add(lblEndTime); now = new Date();
    sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    txtEndTime = new JTextField();
    txtEndTime.setText(sdf.format(now));
    txtEndTime.setEditable(false);
    txtEndTime.setBounds(214, 161, 140, 25);
    getContentPane().add(txtEndTime); cboMachineNum = new JComboBox();
    try {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    } catch (ClassNotFoundException ce) {
    ce.printStackTrace();
    }
    try {
    url = "jdbc:odbc:test1";
    con = DriverManager.getConnection(url);
    st = con.createStatement();
    rs = st.executeQuery("select ComNum from Computer where Status=1");
    while (rs.next()) {
    cboMachineNum.addItem(rs.getInt(1));
    }
    rs.close();
    st.close();
    con.close();
    } catch (SQLException ce) {
    ce.printStackTrace();
    }
    cboMachineNum.setBounds(214, 66, 140, 28);
    getContentPane().add(cboMachineNum); } public void actionPerformed(ActionEvent e) {
    if (e.getActionCommand().equals("重置")) {
    txtEndTime.setText(null);
    } else {
    // “确定”按钮的响应
    try {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    } catch (ClassNotFoundException ce) {
    ce.printStackTrace();
    }
    try {
    url = "jdbc:odbc:test1";
    con = DriverManager.getConnection(url); /*
     * 更新下機時間
     */
    sql = "update Record set ComOffLine=? where ComNum=? and Fee is null";
    pre = con.prepareStatement(sql);
    pre.setString(1, new String(txtEndTime.getText()));
    pre.setString(2, new String(cboMachineNum.getSelectedItem().toString()));
    int rowcount = pre.executeUpdate();
    System.out.println(rowcount + "時間插入成功"); /*
     * 显示本次上網記錄信息中的卡号,上机时间
     */
    sql = "select CardNum,ComOnLine,ComOffLine from Record where ComNum =? and ComOffline=?";
    pre = DBManager.getPreparedStatement(con, sql);
    pre.setInt(1, Integer.parseInt(cboMachineNum.getSelectedItem()
    .toString()));
    pre.setString(2, txtEndTime.getText());
    rs = pre.executeQuery();
    rs.next();
    int cardN = rs.getInt(1);
    String comOnLine = rs.getString(2);
    String comOffline=rs.getString(3);

    SimpleDateFormat format = new SimpleDateFormat();
    Date cD=format.parse(comOnLine,new ParsePosition(0));
    Date coD=format.parse(comOffline,new ParsePosition(0));
    long mL=cD.getTime();
    long mL2=coD.getTime();
    // Date date2 = format.parse(txtEndTime.getText());
    long time = (((mL2 - mL) / 1000) / 60) / 60;
    int fee = (int) (time * 2);

    System.out.println("本次上机费用为:"+fee); /*
     * 将本次上机费用插入到表中
    */

    // Date xDate=format.parse(txtEndTime.getText());
    sql = "update Record set fee=? where  ComNum =?and ComOffline=?";
    pre = con.prepareStatement(sql);
    pre.setInt(1, fee);
    pre.setInt(2, Integer.parseInt(cboMachineNum.getSelectedItem().toString()));
    pre.setString(3, txtEndTime.getText());
    rowcount = pre.executeUpdate();
    System.out.println("fee插入成功");

    /*
     * 查询余额
    */
    sql = "select CardBalance from Card where ComNum =?";
    pre = DBManager.getPreparedStatement(con, sql);
    pre.setInt(1, Integer.parseInt(cboMachineNum.getSelectedItem().toString()));
    rs = pre.executeQuery(sql);
    rs.next();
    int banlance=rs.getInt(1)-fee;


    rs.close();
    pre.close();
    st.close();
    con.close();
    //跳转到EndIfoPanel页面
    try {
    BarFee window = new BarFee(new EndIfoPanel(cboMachineNum.getSelectedItem().toString(),cardN,txtEndTime.getText(),txtEndTime.getText(),fee,banlance));
    window.setvisible();
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    this.setVisible(false);
    } catch (Exception ce) {
    ce.printStackTrace();
    }
    }
    }
    }
    运行的时候在这个地方出错了long mL=cD.getTime();
      

  3.   

    java.lang.NllPointerExcepion其实是最容易查的错。原因是某个对象为null,但还要调用子属性或方法。
    良好的编程习惯是,在使用对象前,判断其是否为空。
    Date cD=format.parse(comOnLine,new ParsePosition(0));
    显然是comOnLine的值有问题,导致cD为空,所以在cD.getTime();时抛错。