01/10/2018, 14:21
Xóa phần tử trong mảng bằng với một phần tử cho trước
Mình đang viết đoạn code này nhưng khi chạy nó cứ báo lỗi này các bạn xem giúp mình mình bì lỗi gì
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 3
at QLSV.main(QLSV.java:44)
import java.util.Scanner;
public class QLSV
{
public static void main(String[] args)
{
String HTSinhVien[];
double DiemTb[];
Scanner sc = new Scanner(System.in);
System.out.println("Nhap vao so sinh vien can quan ly: ");
int n = 0 ;
n = sc.nextInt();
sc.nextLine();
HTSinhVien = new String[n];
DiemTb = new double[n];
for(int i =0 ; i<n ; i++)
{
System.out.println("Nhap vao ten sinh vien thu "+(i+1)+": ");
HTSinhVien[i]= sc.nextLine();
System.out.println("Nhap vao DiemTB "+(i+1)+": ");
DiemTb[i] = sc.nextDouble();
sc.nextLine();
}
int j = 0;
while(j<n)
{
//tim vi tri khoang trong cuoi cung
int k = HTSinhVien[j].lastIndexOf(" ");
//lay doan van sau khoang trang cuoi cung
String x = HTSinhVien[j].substring(k).trim();
//so sánh tu sau khoang trang cuoi cung co = voi "Vi" ko
if(x.compareToIgnoreCase("Vi")==0)
{
int r = j;
if(j==(n-1))
{
n--;
break;
}
else
{
while(r<n)
{
HTSinhVien[r] = HTSinhVien[r+1];
DiemTb[r]=DiemTb[r+1];
r++;
}
n--;
HTSinhVien = new String[n];
DiemTb = new double[n];
j = 0;
}
}
else
j++;
}
for ( int l = 0 ; l < n ; l++)
{
System.out.println("
Ho va ten sinh vien "+(l+1)+": " +HTSinhVien[l]);
System.out.println("DTB "+(l+1)+": " +DiemTb[l]);
}
}
}
Bài liên quan
Đã xem qua bài của bạn. Mình không rõ là sai cụ thể ở đâu nhưng đoán là nằm trong phần While{} dùng để xóa phần tử trùng. Góp ý là bạn nên chia ra từng hàm rồi gọi nó trong hàm main(), viết tất cả trong hàm main() như thế rất khó kiểm tra lỗi.
Đây là lỗi ngoại lệ xảy ra khi bạn cố tình truy cập phần tử nằm ngoài giới hạn của dữ liệu dạng danh sách chứa các phần tử.
Trong bài của bạn thì lỗi này xảy ra trong vòng While:
while(r<n)
{
HTSinhVien[r] = HTSinhVien[r+1];
DiemTb[r]=DiemTb[r+1]
r++;
}
biến int r; của bạn ở đây là vị trí của phần tử trong mảng.
giả sử bạn có n=4 phần tử thì trong mảng tương ứng với vị trí 0,1,2,3.
khi r++ đến index cuối cùng (r=3) thì lúc này trong vòng while xảy ra lỗi ngoại lệ ArrayIndexOutOfBoundsException
vì bạn truy cập vào phần tử HTSinhVien[r+1] tức là HTSinhVien[4] mà trong mảng chỉ trong khoảng [0;3]
Cách giải quyết:
–> ở dưới không cần duyệt đến n-1 nữa --> sửa lại điều kiện trong While(r<n-1)
Mà bài này thì không cần code dài dòng như vậy và nên tách thành các hàm để gọi vào main thì hay hơn
thank bạn mình tưởng giống C nên ko để ý vụ đó lắm
Ok Thank bạn nhé , mình sửa được rùi
Ngôn ngữ nào cũng thế mà