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]);
  		   
  	   }
  		   
   }
}
Trần Ngọc Vĩnh Nhơn viết 16:36 ngày 01/10/2018

Đã 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.

daothien viết 16:38 ngày 01/10/2018

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)

Đâ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:

  • Vì ở trên đã kiểm tra nếu phần tử cuối cùng có tên là “Vi” thì n-- (loại bỏ phần tử cuối)
    –> ở 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)
  • Còn nữa: Sau khi vòng while kết thúc và n-- thì bạn lại khởi tạo mảng HTSinhVien và DiemTb mới rất khó hiểu, điều này sẽ gây ra lỗi NullPointerException khi bạn hiển thị phần tử ra màn hình (không có phần tử nào trong mảng) --> loại bỏ

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

Vĩ Huỳnh viết 16:31 ngày 01/10/2018

thank bạn mình tưởng giống C nên ko để ý vụ đó lắm

Vĩ Huỳnh viết 16:36 ngày 01/10/2018

Ok Thank bạn nhé , mình sửa được rùi

daothien viết 16:38 ngày 01/10/2018

mình tưởng giống C nên ko để ý vụ đó lắm

Ngôn ngữ nào cũng thế mà

Bài liên quan
0