Lỗi khi thêm đối tượng mới vào ArrayList và JTable

Chào anh em daynhauhoc.

Mình đang làm một bài quản lý sinh viên đơn giản với java swing và mình gặp lỗi với chức năng thêm một sinh viên vào arraylist (chưa tính tới chức năng khác vì mình chưa làm). Ban đầu mình tự làm nhưng bị lỗi, sau có code mẫu làm giống y chang nhưng vẫn bị lỗi đến giờ vẫn còn đau đầu.

Đây là hàm thêm trong class DanhSachSinhVien.java của mình:

    public boolean themSV(SinhVien sv) {
                     		if (dssv.contains(sv))
                     			return false;
                     		return dssv.add(sv);
    }

Đây là hàm thêm trong class GiaoDienSV.java:

 public void themAction() {
		String maSV;
		String tenSV;
		String phaiSV;
		String ngaysinhSV;
		double diemsv;
		try {
			maSV = tfMa.getText();
			tenSV = tfTen.getText();
			if (radNam.isSelected())
				phaiSV = radNam.getText();
			else
				phaiSV = radNu.getText();
			ngaysinhSV = tfNgaySinh.getText();
			diemsv = Double.parseDouble(tfDiem.getText());
			SinhVien sv = new SinhVien(maSV, tenSV, phaiSV, ngaysinhSV, diemsv);
			if(!ds.themSV(sv))
			{
				JOptionPane.showMessageDialog(null, "TrÙng mã SV", "Error", 1);
				tfMa.requestFocus();
				return;
			}
			else napvaobang();
		}
		catch(Exception ex)
		{
			JOptionPane.showMessageDialog(null, "Có lỗi khi thêm!", "Error", 1);
			return;
		}
	}

Hàm napvaobang:

private void napvaobang() {
     		dfmodel.setRowCount(0);
     		for (int i = 0; i < ds.tongSV(); i++)
     		{
     			SinhVien sv = ds.getSV(i);
     			String[] rows = { sv.getMaSV(), sv.getTenSV(), sv.getNgaysinhSV(), sv.getPhaiSV(), sv.getDiemsv() + "" };
     			dfmodel.addRow(rows);
     		}
}

Mình luôn luôn bị hiện thông báo “Có lỗi khi thêm” ở phần catch mà không biết phải làm sao, trong khi đã làm y hệt code mẫu bài tương tự. Mong nhận được sự giúp đỡ.

Mình cảm ơn rất nhiều.

Thử thêm dòng System.out.println(e.getMessage()); ở hàm catch để nó in ra lỗi rồi xem đó là lỗi gì bạn nhé :slight_smile:

2 Likes

Cảm ơn bạn đã giúp đỡ, mình đã thử và hệ thống hiện “null”, mình vẫn chưa biết tại sao.

Vậy bạn có thể đưa toàn bộ project lên được không ? Nếu lớn quá thì nén lại và đưa lên cloud cũng được tại mình chưa biết nó lỗi gì cả :frowning:

2 Likes

Bài mình đang làm là bài cơ bản nên rất ít code, đây là 3 class hiện tại mình đang sử dụng và bị lỗi như trên

Class SinhVien.java:

package QuanLySinhVien;

import java.io.Serializable;

public class SinhVien implements Serializable {
	
	private static final long serialVersionUID = 1L;
	private String maSV;
	private String tenSV;
	private String phaiSV;
	private String ngaysinhSV;
	private double diemsv;

	public SinhVien(String maSV, String tenSV, String phaiSV, String ngaysinhSV, double diemsv) {
		super();
		this.maSV = maSV;
		this.tenSV = tenSV;
		this.phaiSV = phaiSV;
		this.ngaysinhSV = ngaysinhSV;
		this.diemsv = diemsv;
	}

	public String getTenSV() {
		return tenSV;
	}

	public void setTenSV(String tenSV) {
		this.tenSV = tenSV;
	}

	public String getPhaiSV() {
		return phaiSV;
	}

	public void setPhaiSV(String phaiSV) {
		this.phaiSV = phaiSV;
	}

	public String getNgaysinhSV() {
		return ngaysinhSV;
	}

	public void setNgaysinhSV(String ngaysinhSV) {
		this.ngaysinhSV = ngaysinhSV;
	}

	public double getDiemsv() {
		return diemsv;
	}

	public void setDiemsv(double diemsv) {
		this.diemsv = diemsv;
	}

	public String getMaSV() {
		return maSV;
	}
	
}

Class DanhSachSinhVien:

package QuanLySinhVien;

import java.util.List;
import java.util.ArrayList;

public class DanhSachSinhVien {

	ArrayList<SinhVien> dssv;
	
	public DanhSachSinhVien() {
		dssv = new ArrayList<SinhVien>();
	}
	
	public boolean themSV(SinhVien sv) {
		if (dssv.contains(sv))
			return false;
		return dssv.add(sv);
			
	}
	
	//Trả về tổng số lượng sinh viên trong danh sách
	public int tongSV() {
		return dssv.size();
	}
	
	//Lấy thông tin sinh viên tại vị trí i trong danh sách
	public SinhVien getSV(int i)
	{
		if (i >= 0 && i < dssv.size())
			return dssv.get(i);
		return null;
	}
}

Class GiaoDienSV.java

package QuanLySinhVien;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class GiaoDienSV extends JFrame implements ActionListener {
	
	private JLabel
		lbMa = new JLabel("Mã số sinh viên: "),
		lbTen = new JLabel("Tên sinh viên: "),
		lbPhai = new JLabel("Phái: "),
		lbNgaySinh = new JLabel("Ngày sinh: "),
		lbDiem = new JLabel("Điểm: ");
		
	private JTextField
		tfMa = new JTextField(25),
		tfTen = new JTextField(25),
		tfNgaySinh = new JTextField(25),
		tfDiem = new JTextField(25),
		tfTim = new JTextField(25);

	private JRadioButton
		radNam = new JRadioButton("Nam"),
		radNu = new JRadioButton("Nữ");
	
	private JButton
		btTim = new JButton("Tìm"),
		btThem = new JButton("Thêm"),
		btSua = new JButton("Sửa"),
		btXoa = new JButton("Xóa"),
		btLuu = new JButton("Lưu"),
		btClear = new JButton("Clear");
	
	private ButtonGroup bg;

	private DefaultTableModel dfmodel;
	
	private JTable table;
	
	private DanhSachSinhVien ds;
	
	private static final long serialVersionUID = 1L;
	public GiaoDienSV() {
		setTitle("Quản lý sinh viên");
		setSize(730,500);
		setLocationRelativeTo(null);
		setResizable(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		//north panel
		JPanel nPanel = new JPanel();
		JLabel nLabel = new JLabel("QUẢN LÝ SINH VIÊN");
		nLabel.setFont(new Font("Arial",Font.BOLD,25));
		nLabel.setForeground(Color.BLUE);
		nPanel.add(nLabel);
		this.add(nPanel, BorderLayout.NORTH);
		
		//center panel
		JPanel cPanel = new JPanel();
		cPanel.setLayout(new BoxLayout(cPanel,BoxLayout.Y_AXIS));
		Box b = Box.createVerticalBox();
		Box b1 = Box.createHorizontalBox();
		Box b2 = Box.createHorizontalBox();
		Box b3 = Box.createHorizontalBox();
		Box b4 = Box.createHorizontalBox();
		b1.add(lbMa); b1.add(tfMa);
		b2.add(lbTen); b2.add(tfTen);
		b3.add(lbNgaySinh); b3.add(tfNgaySinh); b3.add(lbPhai);
		bg = new ButtonGroup(); bg.add(radNam); bg.add(radNu);
		b3.add(radNam); b3.add(radNu);
		b4.add(lbDiem); b4.add(tfDiem);
		lbTen.setPreferredSize(lbMa.getPreferredSize());
		lbNgaySinh.setPreferredSize(lbMa.getPreferredSize());
		lbDiem.setPreferredSize(lbMa.getPreferredSize());
		b.add(b1); b.add(Box.createVerticalStrut(10));
		b.add(b2); b.add(Box.createVerticalStrut(10));
		b.add(b3); b.add(Box.createVerticalStrut(10));
		b.add(b4); b.add(Box.createVerticalStrut(10));
		//table
		dfmodel = new DefaultTableModel();
		table = new JTable(dfmodel);
		dfmodel.addColumn("MSSV");
		dfmodel.addColumn("Tên sinh viên");
		dfmodel.addColumn("Ngày sinh");
		dfmodel.addColumn("Giới tính");
		dfmodel.addColumn("Điểm");
		JScrollPane sp = new JScrollPane(table);
		JPanel tablePanel = new JPanel(new GridLayout(1,1));
		b.add(tablePanel);
		tablePanel.add(sp);
		cPanel.add(b);
		this.add(cPanel, BorderLayout.CENTER);
		
		//south panel
		JPanel sPanel = new JPanel();
		JPanel leftPane = new JPanel();
		JPanel rightPane = new JPanel();
		leftPane.add(tfTim);
		leftPane.add(btTim);
		rightPane.add(btThem);
		rightPane.add(btClear);
		rightPane.add(btSua);
		rightPane.add(btXoa);
		rightPane.add(btLuu);
		JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,leftPane,rightPane);
		sPanel.add(split);
		btThem.addActionListener(this);
		btClear.addActionListener(this);
		this.add(sPanel, BorderLayout.SOUTH);
	}
	
	public static void main(String[] args) {
		new GiaoDienSV().setVisible(true);
	}
	
	public void actionPerformed(ActionEvent e)
	{
		//if(e.getSource().equals(btTim))
		//	timAction();
		if(e.getSource().equals(btClear))
			clearAction();
		if(e.getSource().equals(btThem))
			themAction();
		//if(e.getSource().equals(btSua))
		//	suaAction();
		//if(e.getSource().equals(btXoa))
		//	xoaAction();
		//if(e.getSource().equals(btLuu))
		//	luuAction();
	}
	
	public void themAction() {
		String maSV;
		String tenSV;
		String phaiSV;
		String ngaysinhSV;
		double diemsv;
		try {
			maSV = tfMa.getText();
			tenSV = tfTen.getText();
			if (radNam.isSelected())
				phaiSV = radNam.getText();
			else
				phaiSV = radNu.getText();
			ngaysinhSV = tfNgaySinh.getText();
			diemsv = Double.parseDouble(tfDiem.getText());
			SinhVien sv = new SinhVien(maSV, tenSV, phaiSV, ngaysinhSV, diemsv);
			if(!ds.themSV(sv))
			{
				JOptionPane.showMessageDialog(null, "TrÙng mã SV", "Error", 1);
				tfMa.requestFocus();
				return;
			}
			else napvaobang();
		}
		catch(Exception ex)
		{
			JOptionPane.showMessageDialog(null, "Có lỗi khi thêm!", "Error", 1);
			System.out.println(ex.getMessage());
			return;
		}
	}
	
	private void napvaobang() {
		dfmodel.setRowCount(0);
		for (int i = 0; i < ds.tongSV(); i++)
		{
			SinhVien sv = ds.getSV(i);
			String[] rows = { sv.getMaSV(), sv.getTenSV(), sv.getNgaysinhSV(), sv.getPhaiSV(), sv.getDiemsv() + "" };
			dfmodel.addRow(rows);
		}
	}
	
	private void clearAction() {
		tfMa.setText("");
		tfTen.setText("");
		tfNgaySinh.setText("");
		bg.clearSelection();
		tfDiem.setText("");
		tfTim.setText("");
		tfMa.requestFocus();
	}
	
}

Ở chỗ private DanhSachSinhVien ds;. Bạn mới chỉ khai báo là có một biến DanhSachSinhVien ds thôi chứ chưa gán giá trị cho biến đó. Nên là khi chạy dòng code ds.themSV(sv) thì hệ thống sẽ không biết ds có giá trị là gì, sinh ra lỗi NullPointerException


Bây giờ chỉ cần gán thêm giá trị cho ds thôi :slight_smile: Sửa lại thành thế này bạn nhé:

private DanhSachSinhVien ds = new DanhSachSinhVien();

3 Likes

Thế này mà không nhìn ra, cảm ơn bạn rất nhiều nhé! :smiley:

1 Like

2 posts were split to a new topic: Lỗi khi parse integer một xấu empty

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?