Thắc mắc NULLpointer java

giả sử mình tạo lớp sinh vien có 2thuộc tính tên và tuổi , tạo sao nếu mình tạo 1 vòng lặp 1 mảng danh sach sinh vien rồi đặt vong for chạy từ 0-> len , rồi set tên , xong lại vong for thứ 2 set tuổi thì báo nullpointer , còn nếu set cả 2 thuộc tính 1 lúc cho 1 đối tượng thì đc

Đưa mã của bạn lên xem nào.

1 Like

Đăng cả code lên đây xem nào ! Và hãy nhớ cách để tạo bài viết đúng !!

1 Like

Vất vả thật, đọc vất vả quá.
https://daynhauhoc.com/t/112

Không thấy new SinhVien() ở đâu hết.

2 Likes
package bai1;

import java.text.DecimalFormat;
import java.util.Random;

public class DanhsachSinhvien {
	public Sinhvien[] dssv;;
	private int soPhantu;
	
	
	public DanhsachSinhvien(int n) {
		if(n > 0)
			dssv = new Sinhvien[n];
		else 
			dssv = new Sinhvien[10];//Default value
		
		soPhantu = 0;
	}
	public void init() {
		// tạo  MSSV ngẫu nhiên
		DecimalFormat deci = new DecimalFormat("00000");
		Random random = new Random();
		String j;//chuỗi để  random mssv
		for(int i=0;i<dssv.length;i++)
		{
			do
				{
					j=deci.format(random.nextInt(100000));//random từ 0->99999
					dssv[i].setMssv(j);
				
				}
			while( soPhantu!=0 && j.equals(dssv[i-1].getMssv()) );/* sẽ random lại nếu 
			trùng mssv với sinh viên  đứng trước từ sinh viên thứ 2 và sinh viên đầu tiên 
			sẽ không cần kiểm tra điều kiện */
				
			soPhantu++;
			
		} 
		// tạo ngẫu nhiên họ cho sinh viên 
		String Ho[]= {
				"Cù" ,"Lê" ," Đào" , "Nguyễn","Đoàn" ,"Hồ","Ngô","Hà","Mạc",
				"Đỗ","Mai","Lưu","Bùi","Trần","Dương"  };
		for (int i = 0; i < dssv.length; i++) {
				int k=random.nextInt(15);//chọn ngẫu nhiên chỉ số  của mảng từ 0->14
			 	dssv[i].setHo(Ho[k]);//chọn ngẫu nhiên họ theo chỉ số mảng
		}
		// tạo ngẫu nhiên tên cho sinh viên
		String Ten ="An, Anh, Bình, Bảo, Chánh, Cường, Duy, Dũng, Giang, Giáp, Hiếu, Hiệp,\r\n" + 
				"Hoan, Hoàn, Huy, Hân, Hùng, Hưng, Hường, Hạ, Hải, Hậu, Kha, Khang, Khánh, Khải, Kim,\r\n" + 
				"Kiện, Lai, Luân, Lân, Minh, Mạnh, Nam, Nghĩa, Nguyên, Nhàn, Nhân, Nhựt, Ny, Phi, Phong,\r\n" + 
				"Phát, Phúc, Phương, Quang, Quân, Quốc, Sang, Sách, Sơn, Thao, Thiên, Thiêng, Thiện, Thọ,\r\n" + 
				"Thành, Thông, Thương, Thạnh, Thảo, Thắng, Thịnh, Thọ, Tiến, Trí, Trường, Tuyết, Tuyền, Tuân,\r\n" + 
				"Tuấn, Tài, Tâm, Tân, Tùng, Tú, Tới, Tự, Vi, Vinh, Việt, Vĩ, Vũ, Vượng, Vửng, Xương, Ân, Đạt,\r\n" + 
				"Đức";
		String Ten1[]= Ten.split(",");// lọc chuỗi các tên và nạp vào mảng Tên1
		for (int i = 0; i < dssv.length; i++) {
			int k=random.nextInt(Ten1.length+1);
			dssv[i].setTen(Ten1[k]);
		}
			
	}
	
	
		

}
package bai1;

public class Sinhvien {
	private String Mssv;
	private String Ho;
	private String Ten;
	private String GioiTinh;
	private int DiemCTDLvaGT;
	private int DiemLTHDT;// lap trinh huong doi tunog
	private int DiemLTDT;// li thuyen do thi
	private int DiemPPT;
	
	public Sinhvien(String mssv, String ho, String ten, String gioiTinh, int diemCTDLvaGT, int diemLTHDT, int diemLTDT,
			int diemPPT) {
		super();
		Mssv = mssv;
		Ho = ho;
		Ten = ten;
		GioiTinh = gioiTinh;
		DiemCTDLvaGT = diemCTDLvaGT;
		DiemLTHDT = diemLTHDT;
		DiemLTDT = diemLTDT;
		DiemPPT = diemPPT;
	}
	public Sinhvien()
	{
		this("","","","",0,0,0,0);
	}
	public String getMssv() {
		return Mssv;
	}
	public void setMssv(String mssv) {
		Mssv = mssv==null ||mssv.equals("") ? "Chua nhap MSSV" : mssv;
	}
	public String getHo() {
		return Ho;
	}
	public void setHo(String ho) {
		Ho = ho==null  || ho.trim() ==  ""? "Chua nhap Ho": ho ;
	}
	public String getTen() {
		return Ten;
	}
	public void setTen(String ten) {
		Ten = ten==null ||ten.trim()==""  ? "Chua nhap Ten": ten;
	}
	public String getGioiTinh() {
		return GioiTinh;
	}
	public void setGioiTinh(String gioiTinh) {
		
		if (gioiTinh==null )
			this.GioiTinh="Nam";//mac dinh la nam neu null hoac khong dung vi gioi tinh chi duoc nam hoac nu
		else {
			if(gioiTinh.trim().equalsIgnoreCase("Nữ") || gioiTinh.trim().equalsIgnoreCase("Nam") || gioiTinh.trim().equalsIgnoreCase("Nu"))
				GioiTinh=gioiTinh;
			else
				GioiTinh="Nam";//nhap gioi tinh khac nam hoac nu thi mac dinh la Nam
		}
		
	}
	public int getDiemCTDLvaGT() {
		return DiemCTDLvaGT;
	}
	public void setDiemCTDLvaGT(int diemCTDLvaGT) {
		DiemCTDLvaGT= (diemCTDLvaGT >= 0 && diemCTDLvaGT <=10) ? diemCTDLvaGT : 0;
	}
	public int getDiemLTHDT() {
		return DiemLTHDT;
	}
	public void setDiemLTHDT(int diemLTHDT) {
		DiemLTHDT =(diemLTHDT >= 0 && diemLTHDT <=10) ? diemLTHDT : 0;
	}
	public int getDiemLTDT() {
		return DiemLTDT;
	}
	public void setDiemLTDT(int diemLTDT) {
		DiemLTDT =(diemLTDT >= 0 && diemLTDT <=10) ? diemLTDT : 0;
	}
	public int getDiemPPT() {
		return DiemPPT;
	}
	public void setDiemPPT(int diemPPT) {
		DiemPPT =(diemPPT >= 0 && diemPPT <=10) ? diemPPT : 0;
	}
	public float getDiemTB()
	{
		return (float) (DiemCTDLvaGT+DiemLTDT+DiemLTHDT+DiemPPT)/4;
	}
	public String xepLoai()
	{
		String xepLoai;
		float x = getDiemTB();
		if(x>=9)
			xepLoai="Xuất Sắc";
		else if(x>=8  &&  x<9)
			xepLoai="Giỏi";
		else if(x>=  7 &&   x<8)
			xepLoai="Khá";
		else if(x>=   6  &&   x<7)
			xepLoai="Trung Bình Khá";
		else
			xepLoai="Trung Bình";
		return xepLoai;
	}
	public int getDiemNhoNhat()
	{
		int Min=0;
		int Arr[]= {
				DiemCTDLvaGT,DiemLTDT,DiemLTHDT,DiemPPT
		};
		for(int i=0;i<3;i++)
		{
			if(Arr[Min]>Arr[i])
				Min=i;
				
		}
		return Arr[Min];
		
	}
	public boolean isDiemLiet()
	{
		int Arr[]= {
				DiemCTDLvaGT,DiemLTDT,DiemLTHDT,DiemPPT
		};
		for(int i=0;i<3;i++)
		{
			if(Arr[i]<3)
				return true;
				
		}
		return false;
	}
	public boolean isKhenThuong() 
	{
		if(getDiemTB()>=7.5 && !isDiemLiet())
			return true;
		
		return false;
			
	}
	@Override
	public String toString() {
		return Ho +" "+Ten;
	}
	
	
	

}

Khi i = 0 thì chuyện gì xảy ra?!

trong cái khởi tạo dssv có new mảng rồi mà bạn

soPhantu!=0 && j.equals(dssv[i-1].getMssv()) ;

đã tính cả trong cái soPhantu rồi phải thỏa 2 đk mới đc

Đó là khởi tạo mảng, từng phần tử trong mảng chưa được khởi tạo.

mình nghĩ khi mình tạo mảng với kiểu dữ liệu sinh viên thì nó đã chừa ô nhớ cho mình rrồi chứ bạn , trong cái khởi tạo của dssv mình có dòng

dssv = new Sinhvien[n];

rồi mà

Từ đó ta có:
do - while chỉ chạy 1 lần duy nhất.
Chạy do > kiểm tra while: khi soPhanTu = 0, nên điều kiện soPhanTu !=0 trả về false > kết thúc vòng lặp.

for(int i=0;i<dssv.length;i++)
		{
			do
				{
					j=deci.format(random.nextInt(100000));//random từ 0->99999
					dssv[i].setMssv(j);
				
				}
			while( soPhantu!=0 && j.equals(dssv[i-1].getMssv()) );/* sẽ random lại nếu 
			trùng mssv với sinh viên  đứng trước từ sinh viên thứ 2 và sinh viên đầu tiên 
			sẽ không cần kiểm tra điều kiện */
				
			soPhantu++;
			
		} 

khi ssô phần tử trong mảng bây giờ là 0 -> chạy do -> kiểm tra while sai -> break, số phần tử =1 , vào for chay i=1, -> chạy do -> kiểm tra điều kiện spt >0 -> kiểm tra có trùng với thằng thứ 0 -> đúng thì chạy lại do , sai thì break nạp đúng , mình đang hỏi cái null mà bạn @@

1 Like

Vài lời cho bạn:

Khởi tạo mảng không nghĩa là từng phần tử được khởi tạo

Bạn phải khởi tạo từng phần tử trong mảng đó. Trừ trường hợp đó là mảng của kiểu nguyên thủy: int, bool, float…
VD:

// Khởi tạo mảng,
// ss đã trỏ đến ô nhớ chứa các con trỏ,
// nhưng mỗi con trỏ đang trỏ về null
String[] ss = new String[12];
// Khởi tạo từng phần tử,
// gán các con trỏ về ô nhớ chứa giá trị.
for(int i =0;i<ss.length();i++){
   ss[i]=new String("Giá trị");
}

Kiểm tra trùng lặp

Kiểm tra trùng với phần tử trước (i-1) nó có khả thi?
Nếu nó trùng với i-2, i-3, i-4,… thì sao?

// Kiểm s có trùng với phần tử nào trong mảng.
public bool checkDuplicate(String s){
   if(s==null)return false;
   for(int i=0;i<ss.length;i++){
      if(s.equals(ss[i])) return true;
   }
   return false;
}

  • soPhantu khá là vô dụng.
3 Likes

Bạn mới chỉ khai báo 1 mảng, chứ chưa khai báo phần thử cho nó ! Nên là lúc lấy phần tử thứ i trong mảng thì sẽ là null ==> Không thể dùng các setter và gây ra lỗi NullPointer


Lần sau đăng code thì nên cho vào 1 reply thôi. Và code của bạn còn nhiều chỗ chưa được clear và sai, kiểm tra và sửa lại đi nhé :wink:

2 Likes

Xin lỗi, đoạn này mình nhầm.
Nhưng như mình nói:

1 Like

cái trùng mình vừa thấy sai sửa khi nãy rồi , còn cái tạo mảng các đối tượng cần khởi tạo thì giờ mới biết cứ tưởng nhu int ,float ,… biét thêm 1 cái thanks 2 bạn

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