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
Thắc mắc NULLpointer java
Đưa mã của bạn lên xem nào.
Đăng cả code lên đây xem nào ! Và hãy nhớ cách để tạo bài viết đúng !!
Vất vả thật, đọc vất vả quá.
https://daynhauhoc.com/t/112
Không thấy new SinhVien()
ở đâu hết.
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 @@
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.
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é
Xin lỗi, đoạn này mình nhầm.
Nhưng như mình nói:
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