Hỏi về xử lý ngoại lệ trong java

Em chào mọi người, em mới học xong Java cơ bản và giờ có chút thắc mắc về phần ngoại lệ trong java. Các Exception sử dụng try catch để bắt và xử lý ngoại lệ, nhưng những gì e làm qua thì đa phần sau khi phát hiện ra ngoại lệ chỉ là in câu lệnh thông báo lỗi, nay e muốn làm hơn thế nhưng chưa nghĩ ra.

VD: e muốn tạo 1 danh sách Vận Động Viên đi kèm Số Báo Danh và cả 2 biến đó đều do người dùng nhập vào. Giả sử việc nhập tên và SBD cho các vận động viên 1 2 làm ok nhưng đến nhập cho người thứ 3 thì người dùng nhập lỗi như:

  • Thay vì gõ số vào sbd thì lại gõ nhầm chữ
  • Gõ trùng số báo danh.

2 lỗi này sẽ nảy sinh ngoại lệ, chương trình sẽ thông báo cho người dùng biết lỗi sai và bắt nhập lại vdv thứ 3 cho đến khi đùng thì mới nhập tiếp những người sau.

Em loay hoay mãi chưa tìm được cách làm, mọi người có thể cho e gợi ý không ạ? em cảm ơn.

Bạn nên viết hàm kiểm tra nhập vào toàn số báo danh, hoặc chữ, khi người dùng vi phạm thì cho thông báo lỗi ra thôi. Có thể dùng do{}while(); để kiểm tra rồi bắt người dùng nhập lại.

Hi Kim Phuong DO.
Up code lên đây.
Cái này thì liên quan gì ngoại lệ chứ ?

Em có thể tự viết ngoại lệ riêng của mình.
Bên dưới là 1 ví dụ custom exception khi số tuổi vận động viên nhỏ hơn 18

class InvalidAgeException extends Exception{  
 InvalidAgeException(String s){  
  super(s);   // dòng này gọi non - parameter constructor của Exception để throws ra message trong exception của bạn
 }  
}  
class TestCustomException1{  
  
   static void validate(int age)throws InvalidAgeException{  
     if(age<18)  
      throw new InvalidAgeException("not valid");  
     else  
      System.out.println("welcome to vote");  
   }  
     
   public static void main(String args[]){  
      try{  
      validate(13);  
      }catch(Exception m){System.out.println("Exception occured: "+m);}  
  
      System.out.println("rest of the code...");  
  }  
}  
1 Like

Cái này chỉ cần throws exception lên tầng View rồi thông báo thôi. Chắc chú đang vướng chỗ này.

Dạ e cảm ơn mọi người đã giúp đỡ. Hiện tại e đã áp dụng cách của anh Nguyen Ca nhưng có vẻ không được, làm ngoại lệ giống anh Đỗ Trung Quân thì của e nó hơi khác chút xíu, dùng do while như gợi ý của a Hoàng Khoa thì hiện tại e chưa làm ra, mới chỉ dùng do while cho exception nên bị lỗi (lỗi là khi nhập sai giá trị nó báo lỗi liên tùng tục chẳng dừng). Và nghe lời anh Phong (Tao Không Ngu) thì em xin up đoạn code mà e làm ví dụ lên để mọi người chỉ cho e sai chỗ nào. Em cảm ơn rất nhiều và chúc mọi người luôn nhiều sức khỏe và tỉnh táo để code cho nó chất lượng :smile:

public class InputMismatchException extends Exception {
	InputMismatchException(String s) {
		super(s);
	}
}

trên là khai tạo exception và dưới là chạy chương trình.

import java.util.Scanner;

public class Test {

	public static void main (String[ ] args) throws InputMismatchException {
		Scanner sc = new Scanner(System.in);
		int[] a = new int[5];
		int i=0;
		while(i<5){
			try{
			System.out.print("Nhap a " + i + " ");
			a[i] = sc.nextInt();
			i++;
			}catch (Exception ex){
				System.out.print("error");
			}
		}
		for(i=0;i<a.length;i++){
		System.out.print(a[i]);
		}

}
}

You can use this solution:

        boolean checkInput = true; // biến này để kiểm tra user nhập hợp lệ hay không
        int id = 0;
        Scanner sc = new Scanner(System.in); // Khởi tạo luồng nhập từ bàn phím
        do {
            try {
                System.out.print("Hay nhap ID: ");
                id = sc.nextInt(); // Ở bước này nếu user nhập chữ thì sẽ gây ra ngọai lệ,luồng thực thi chương trình
                                    // sẽ nhảy vào khối catch ở dưới
                checkInput = true;
            } catch (Exception e) {
                checkInput = false;
                sc.nextLine(); // Dòng này để đọc ký tự Enter lúc nhập, thực ra Enter sẽ gồm 2 ký tự trở về đầu dòng và
                                // sinh dòng mới, bạn tra bảng mã Ascii sẽ rõ.
            }
            
        } while (!checkInput);
        System.out.println("ID là: " + id);

Bạn có thể dùng break thay vì phải dùng 1 biến flag

int id = -1;
Scanner sc = new Scanner(System.in); // Khởi tạo luồng nhập từ bàn phím
while(true) {
    try {
        System.out.print("Hay nhap ID: ");
        id = sc.nextInt(); // Ở bước này nếu user nhập chữ thì sẽ gây ra ngọai lệ,luồng thực thi chương trình
                            // sẽ nhảy vào khối catch ở dưới
        break
    } catch (Exception e) {
        sc.nextLine(); // Dòng này để đọc ký tự Enter lúc nhập, thực ra Enter sẽ gồm 2 ký tự trở về đầu dòng và
                        // sinh dòng mới, bạn tra bảng mã Ascii sẽ rõ.
    }   
}
System.out.println("ID là: " + id);
2 Likes

Cảm ơn bạn đã bỏ thời gian ra xem xét giúp đỡ vấn đề của mình :slight_smile: Còn vấn đề quan trọng nữa bạn cho mình hỏi, nếu mình khởi tạo ID theo dạng Array thì làm sao để mình có thể nhập được toàn bộ giá trị cho mảng ID đó mà khi nhập lỗi nó bắt nhập lại đến khi đúng thì thôi. Mình dựa trên cách của bạn, đã lồng thêm thử if else và kể cả for nhưng nó vẫn cứ sai sai :weary:

Cảm ơn bạn nhiều !

Cảm ơn bạn đã quan tâm :slight_smile: nhưng mình tưởng khi dùng break là nó sẽ nhảy ra khỏi vòng luôn chứ nhỉ?

Bạn thử cách này xem nhé :smiley:

while (true) {		
	String SBD = sc.nextLine();
            if (SBD.equals("n") || SBD.equals("N")) {
		break;
		while(true) {
	try {	
		Integer.parseInt(SBD)
		break;
		
	} catch (Exception e) {
		System.out.println("SBD phai la kieu so");
		System.out.println("Nhap SBD ");
		SBD = sc.nextLine();
		}
	}		
}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?