Lỗi hoạt động try-catch trong code Java

Khi mình nhập sai số (không nằm trong khoảng 1000 - 2023) thì không in ra dòng lỗi nhập lại. Chỉ khi nhập văn bản mới xuất hiện thông báo lỗi. Các bạn giúp mình sửa phần này trong cấu trúc try-catch nhé.

// Program
package JavaOop;

import java.time.Duration;
import java.time.LocalDate;
import java.util.Scanner;

public class ThoiGian {
    private int ngay, thang, nam, thu;
    private boolean laNamNhuan = true;
    private Scanner sc = new Scanner(System.in);
    public int getNgay() {
        return ngay;
    }

    public void setNgay(int ngay) {
        this.ngay = ngay;

    }

    public int layThu() {
        LocalDate date = LocalDate.of(nam, thang, ngay);
        int thu = date.getDayOfWeek().getValue();
        return thu + 1;
    }

    public int getThang() {
        return thang;
    }

    public void setThang(int thang) {
        this.thang = thang;
    }

    public int getNam() {
        return nam;
    }

    public void setNam(int nam) {
        this.nam = nam;
        if (this.nam % 4 == 0 && this.nam % 100 != 0 || this.nam % 400 == 0) {
            laNamNhuan = true;
        } else {
            laNamNhuan = false;
        }
    }

    public int getThu() {
        return thu;
    }

    public boolean isLaNamNhuan() {
        return laNamNhuan;
    }

    private int nhapLieu(String nhap, String loi, int min, int max) {
        boolean right = true;
        int number = 0;
        do {
            try {
                System.out.println(nhap);
                number = sc.nextInt();
                right = number >= min && number <= max;
            } catch (Exception e) {
                right = false;
                System.out.println(loi);
                sc.nextLine();
            }
        } while (!right);
        return number;
    }

    public ThoiGian(int nam, int thang, int ngay) {
        setNam(nam);
        setThang(thang);
        setNgay(ngay);
    }

    public ThoiGian() {
        LocalDate now = LocalDate.now();
        setNam(nhapLieu("Nhập năm: ", "Nhập không hợp lệ, nhập lại", 1000, now.getYear()));
        setThang(nhapLieu("Nhập tháng: ", "Nhập không hợp lệ, nhập lại", 1, 12));
        if (thang == 2) {
            if (laNamNhuan) {
                setNgay(nhapLieu("Nhập ngày: ", "Nhập không hợp lệ, nhập lại", 1, 29));
            } else {
                setNgay(nhapLieu("Nhập ngày: ", "Nhập không hợp lệ, nhập lại", 1, 28));
            }
        } else if (thang == 4 || thang == 6 || thang == 9 || thang == 11) {
            setNgay(nhapLieu("Nhập ngày: ", "Nhập không hợp lệ, nhập lại", 1, 30));
        }
        setNgay(nhapLieu("Nhập ngày: ", "Nhập không hợp lệ, nhập lại", 1, 31));
    }

    public static long layKhoangThoiGian(ThoiGian time1, ThoiGian time2) {
        LocalDate date1 = LocalDate.of(time1.nam, time1.thang, time1.ngay);
        LocalDate date2 = LocalDate.of(time2.nam, time2.thang, time2.ngay);
        long duration = Duration.between(date1.atStartOfDay(), date2.atStartOfDay()).toDays();
        return duration;
    }

    public void printInfo() {
        System.out.println("Thứ " + layThu() + " ngày " + ngay + "/" + thang + "/" + nam + ", là năm nhuận " + laNamNhuan);
    }
}
//Main
package JavaOop;

public class Main {

    public static void main(String[] args) {
        ThoiGian time1 = new ThoiGian();
        ThoiGian time2 = new ThoiGian(2023,10,14);
        time1.printInfo();
        System.out.println(Math.abs(ThoiGian.layKhoangThoiGian(time1,time2)) + " ngày");
    }
}

Bạn dùng scanner.nextInt() thì nó chỉ xảy ra lỗi nếu input là string. Còn trường hợp là số thì nó không có exception nào nên ko vào catch block.
Cách khắc phục là thêm if vào sau cái dòng right = number >= min && number <= max; để check xem số có nằm trong khoảng không néu không thì cũng in ra lỗi luôn.

2 Likes

Bạn code mẫu đoạn đó được không? Mình chưa hiểu cách làm của bạn cho lắm


      do {
            try {
                System.out.println(nhap);
                number = sc.nextInt();
                if(number < min || number > max) {
                     System.out.println(loi);
                     sc.nextLine();
                     continue;
                }
            } catch (Exception e) {
                System.out.println(loi);
                sc.nextLine();
            }
        } while (number < min || number > max);
3 Likes

Cảm ơn bro nhiều nhé! Mình chạy được theo ý muốn rồi. Thanks!

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