Cách bắt lỗi khi nhập vào ngày không hợp lệ năm 2024
Lỗi là những lỗi phát sinh trong quá trình biên dịch hoặc trong quá trình thực thi chương trình. Lỗi có thể đến từ nhiều phía: do dữ liệu người dùng nhập vào ko đúng định dạng, do lập trình viên ko soát hết các trường hợp ko như ý muốn, hay các lỗi bất thường. Chúng ta hay gọi chung là “lỗi”, chứ lỗi được phân chia làm 3 loại:
Cách xử lý các ngoại lệ :Nếu có thể dự đoán được các trường hợp lỗi có thể xảy ra thì cố gắng sử dụng if…else để xử lý các trường hợp. Còn không thì hẵng dùng try…catch để bắt lỗi và xử lý lỗi. try…catch và xử lý lỗi luôn tại catch : String chuoiA = "24"; String chuoiB = "12"; try { int a = Integer.parseInt(chuoiA); int b = Integer.parseInt(chuoiB); double thuong = (double) a / b; System.out.println("Thương a/b = " + thuong); } catch (NumberFormatException e) { System.out.println("Lỗi chuyển đổi định dạng số."); } catch (ArithmeticException e2) { System.out.println("Lỗi chia cho 0."); } Cùng một khối try nhưng có thể có nhiều khối catch cũng được. Chương trình sẽ thực hiện khối lệnh trong try. Nếu gặp lỗi, chương trình sẽ lập tức nhảy sang khối catch, tuỳ vào việc bạn bắt lỗi nào thì khối lệnh trong catch tương ứng sẽ được thực thi. Sau khi hết khối catch thì chương trình sẽ chạy tiếp code ở bên dưới bên ngoài vòng try…catch. Nếu ko gặp lỗi, chương trình sẽ chạy hết try mà ko vào catch. Bên cạnh lệnh try…catch còn có lệnh try…catch…finally. Khi gặp lỗi ở dòng nào đó trong try, chương trình ngay lập tức nhảy vào catch, nên những lệnh ở bên dưới lệnh mà bị lỗi đó sẽ ko được thực thi. Trong trường hợp dù lỗi hay ko có lỗi, bạn vẫn muốn thực hiện gì đó, ví dụ trong đọc ghi file cần phải có đóng luồng đọc ghi, bất kể có lỗi hay ko, thì khối finally sẽ giúp bạn thực hiện điều đó. throw và throws : Trong trường hợp bạn ko muốn xử lý lỗi ngay trong catch, mà muốn gửi lỗi đó cho một đối tượng khác xử lý, thì bạn chỉ cần quăng lỗi ra bằng throw hoặc throws. Throw được sử dụng ngay trong thân phương thức, còn throws thì khai báo trên đầu của phương thức. try { int a = Integer.parseInt(chuoiA); } catch(NumberFormatException e) { throw e; } public int chuyenDoiChuoiA() throws NumberFormatException { int a = Integer.parseInt(chuoiA); return a; } Nếu bạn dùng throw thì bắt buộc phương thức chứa nó phải khai báo throws (Eclipse sẽ tự gợi ý cho bạn làm điều này). Đồng thời bạn phải viết try…catch tại nơi gọi phương thức đó. Đọc, ghi trong Java :Đọc từ bàn phím: Scanner sc = new Scanner(System.in); System.out.println("Nhập họ tên:"); String name = sc.nextLine(); // xử lý xong xuôi, nhớ đóng luồng đọc sc.close(); Trên đây là ví dụ đơn giản cách đọc chuỗi kí tự từ bàn phím. Việc cần làm là khởi tạo đối tượng try { int a = Integer.parseInt(chuoiA); } catch(NumberFormatException e) { throw e; } 0 để đọc số nguyên, ngoài ra còn có các phương thức khác như nextBoolean(), nextDouble(), …. tương ứng với kiểu dữ liệu mà bạn cần đọc. Khi bạn đọc số rồi sau đó đọc chuỗi, bạn sẽ gặp tình trạng ko đọc được chuỗi. Nguyên nhân là do dữ liệu nhập từ bàn phím ko phải bắt đầu đọc từ lúc phương thức ấy chạy, mà nó tạm thời lưu trong bộ nhớ đệm. Khi bạn nhập số rồi nhấn enter, phương thức nextInt() chỉ đọc các chữ số mà bỏ lại dấu xuống dòng (enter) trong bộ nhớ đệm. Phương thức nextLine() thì lấy trong bộ đệm một chuỗi cho đến khi kết thúc bởi dấu xuống dòng. Mà lúc này, nó gặp ngay dấu xuống dòng đầu tiên trong bộ nhớ đệm, nên trả về luôn một chuỗi rỗng. Có 2 cách để chữa: một là chèn thêm lệnh nextLine() ngay sau khi đọc số để nó thải bớt dấu xuống dòng ra khỏi bộ nhớ đệm, hai là ko dùng nextInt() nữa mà thay bằng nextLine() đồng thời chuyển đổi chuỗi đọc được sang dạng số luôn bằng phương thức Integer.parseInt(). Cách 2 này nên dùng vì ta có thể áp dụng để chuyển đổi các kiểu dữ liệu khác nhau. À tất nhiên, muốn parse thành công phải đặt lệnh trong khối try…catch, phòng trường hợp chuỗi nhập vào có chứa cả kí tự ko phải số. try { System.out.println("Nhập tuổi:"); int age = Integer.parseInt(sc.nextLine()); System.out.println("Nhập địa chỉ:"); String address = sc.nextLine(); System.out.println(age + "_" + address); } catch (NumberFormatException e) { System.err.println("Không thể chuyển đổi chuỗi sang số."); } sc.close(); Đọc file: public String readFile (String path) { String data = ""; try { } catch (IOException e) { }
// trả kết quả đọc được cho phương thức
return data;
}Ghi file: public void writeFile (String path, String data, boolean isAppend) { try { } catch (IOException e) { }
}Đọc, ghi object: Đọc, ghi object có lợi thế là dữ liệu được ra, vào dưới dạng object, điều này vừa giúp chúng ta bỏ qua quy cách trình bày dữ liệu, vừa dễ dàng thể hiện nhiều thuộc tính. |