Tranh thủ lúc chán chán ngồi viết cái này rồi post lên. Không biết có ai dùng được ko [IMG]images/smilies/tongue.png[/IMG]
<ps: Mất gần 2 tiếng viết rồi máy đơ. hix mất hết h phải viết lại hic>
Phần I: Ngoại Lệ có Sẵn
Các bạn có thể theo dõi ví dụ sau để dễ mường tượng về ngoại lệ hơn. Sau đó mình sẽ định nghĩa nó [IMG]images/smilies/biggrin.png[/IMG]
Mã:
import java.util.Scanner;public class DemoException { public static void main (String args []) { int tuso, mauso, ketqua; System.out.println ("Chuong trinh tinh phan so: "); Scanner input = new Scanner (System.in); System.out.print ("Tu so: "); tuso = input.nextInt (); System.out.print ("Mau so: "); mauso = input.nextInt (); System.out.print ("Ket Qua: " + tuso/mauso); }}
///
Nếu không để ý thì bạn ko phát hiện ra. Chúng ta vẫn dịch và chạy chương trình một cách bình thường. Nhưng nếu nhập mẫu số = 0 thì sao nhỉ [IMG]images/smilies/laughing.gif[/IMG][IMG]images/smilies/laughing.gif[/IMG][IMG]images/smilies/laughing.gif[/IMG]. Giống như kiểu đi đêm lắm có ngày gặp ma ý [IMG]images/smilies/biggrin.png[/IMG]. Bình thường thì ko gặp nhưng đi lắm thì gặp. Chương trình trên mình demo dễ nhận thấy 0 gây ra lỗi nhưng có nhiều chương trình mà ta ko phát hiện được. Như thế test nhiều mới phát hiện được lỗi
I> Ngoại lệ là gì ?
- Đã theo dõi ví dụ xong, vậy ngoại lệ là gì vậy ? .... Ngoại lệ là lỗi xảy ra trong quá trình thực thi chương trình
- Nếu không xử lý thì làm sao, ntn ? ..... Đương nhiên nếu không được xử lý thì ngoại lệ sẽ làm cho máy treo hay dừng đột ngột. Hix. Vậy mà cũng hỏi =.="
- Có mấy loại ngoại lê ?????? //// ?????: Có nhiều cách phân chia ngoại lệ ra để định nghĩa. Ở đây mình chọn cách "cách biểu hiện trong quá trình dịch hay chạy ?" Người ta còn gọi: Cheched exception và UnCheched exception
------> Loại Checked là loại mà máy ảo java phát hiện ngay trong quá trình dịch. Cái loại mặt mĩ thế kia thả ra thế nào cũng gây tội ---> xử lý mau lẹ. Thả ra lại làm khổ mình, khổ người
Loại UnChecked: Thả cho ra khỏi tù. Loại này có thể cải tạo đc [IMG]images/smilies/biggrin.png[/IMG] (ví dụ ở trên thuộc loại này): Hoàn toàn bình thường nếu như lỗi khác 0.
II> Exception class
Trong Java mỗi loại ngoại lệ được thể hiện trong một lớp. Có một Siêu lớp Exception là lớp cha cho tất cả các lớp thể hiện ngoại lệ. Một số bạn nói tới một số lớp khác hay lớp cha của exception... Xin thưa từ exception trở xuống mới gọi là exception [IMG]images/smilies/biggrin.png[/IMG]
Cú pháp: Cơ bản thì có 2 khối chính là try và catch ngoài ra còn có khối finally
- try: Nằm trong try là các đối tượng tình nghi. Bọn này có khả năng cao phạm tội đây mà. Bắt nó vào trong try để khảo, tấn [IMG]images/smilies/laughing.gif[/IMG][IMG]images/smilies/laughing.gif[/IMG][IMG]images/smilies/laughing.gif[/IMG]. Lúc nào khai ra mới ... chưa thôi ---> chuyển tới khối catch
- catch: Xử lý cắt chân cắt tay hay vân vân thì tùy =))
phương thức hay sử dụng chú ý: printStackTrace ()---> Kiểu như in ra theo thứ tự phạm lỗi ấy mà. Từ đó có biện pháp xử lý [IMG]images/smilies/biggrin.png[/IMG]
- finally: Khối bắt buộc thực thi, cho dù có lỗi hay ko có lỗi. Thường là dọn dẹp bộ nhớ hoặc là đóng các stream
Bạn có thể theo dõi forms sau:
Mình xin chú ý 2 điều sau:
- Các cụ ta vẫn còn tư tưởng trọng nam khinh nữ [IMG]images/smilies/biggrin.png[/IMG]: do đó mà try chỉ có 1 còn mình nó được lấy 5, 6 vợ .... (tức là catch bao nhiêu tùy ý [IMG]images/smilies/biggrin.png[/IMG])
- Nếu excepiton a là cha của exception b thì khối catch chưa b phải nằm trên khối catch chưa excetpion a. Đơn giản vì nếu ngược lại thì thằng b chả bao giờ được dùng tới cả [IMG]images/smilies/biggrin.png[/IMG]
III> Phát sinh ngoại lệ
Ngoại lệ sẽ được máy ảo bắt và ném ra (ném linh tinh lắm các bạn đừng quan tâm kẻo ném trúng mình [IMG]images/smilies/biggrin.png[/IMG]). Java cho phép ném bằng từ khóa throw Chú ý là throw nhé. đừng nhầm sang throws. Vì sắp tới đây sẽ đề cập tới cả throws [IMG]images/smilies/biggrin.png[/IMG]
Bạn có thể theo dõi ví dụ sau. (dịch và chạy như ví dụ đầu tiên)
Mã:
import java.util.Scanner;public class DemoException { public static void ps (int a, int b) throws RuntimeException { if (b == 0) throw new RuntimeException (); else System.out.print ("Ket Qua: " + a/b); } public static void main (String args []) { int tuso, mauso, ketqua; System.out.println ("Chuong trinh tinh phan so: "); Scanner input = new Scanner (System.in); System.out.print ("Tu so: "); tuso = input.nextInt (); System.out.print ("Mau so: "); mauso = input.nextInt (); ps (tuso, mauso); }}
Giải thích:
- throw: Dùng để ném các ngoại lệ
- throws: Dùng để thông báo rằng "cái method này chứa chấp mấy thằng phạm tội [IMG]images/smilies/biggrin.png[/IMG], bất cứ lúc nào cũng có thể bắt"
Note: Chú ý. Một phương thức gọi một phương thức chứa ngoại lệ thì bản thân nó phải có từ khóa throws.
IV> Các phương thức chính của Exception
- Exception ()
- Exception (String msg)
2 cái trên chắc mình ko cần phải giải thích nhỉ [IMG]images/smilies/biggrin.png[/IMG]
- String getMessage () : Lấy câu thông báo của Exception
- void printStackTrace (): In ra stack lan truyền của Exception
- Một vài cái nữa mình định nói nhưng thôi vì cũng chả mấy khi dùng [IMG]images/smilies/biggrin.png[/IMG]
Phần II: Ngoại lệ tự định nghĩa
Ngoài việc dùng lớp đối tượng có sẵn trong Java. Ta có thể tự tạo cho mình các lớp ngoại lệ bằng cách kế từa Exception hoặc lớp dẫn xuất của nó ... Sau đó thì cài đặt thôi. hehe
Demo cái cho nó trực quan [IMG]images/smilies/biggrin.png[/IMG]
Mã:
public class ExDM extends Exception{ public ExDM () { super ("Nham roi em ah. Phai lon hon 0"); } public ExDM (String msg) { super (msg); }}
Hehe. Có vẻ chả có method nào nhỉ. Cái này thì vất vả ở khâu xây dựng test
Mã:
import java.util.Scanner; public class Test{ public static void nhap () throws ExDM { Scanner input = new Scanner (System.in); System.out.print ("Nhap so nguoi: "); int a = input.nextInt (); if (a <= 0) throw new ExDM (); } public static void main (String args []) { try { nhap (); } catch (ExDM e) { System.out.println (e.getMessage ()); } }}
Note: Một chú ý: Khi ta overriding. Nếu lớp cha ném ra ngoại lệ X thì lớp con cũng phải ném ra ngoại lệ X hoặc ném ra ngoại lệ x (với x là con của X hehehe)
Phía trên mình xây dựng một class nhập phải lớn hơn 0. Tuy nhiên mình ko để hàm nhập trong class exception ExDM. Bạn nào muốn có thể cho vào đấy
View more random threads:
Vừa qua, Chính phủ đã ban hành Quyết định số 2383/QĐ-TTg ngày 09/12/2013 về việc xếp hạng di tích quốc gia đặc biệt. Theo đó, khu di tích Đường Trường Sơn - Đường Hồ Chí Minh là 1 trong 14 kỷ vật...
Các relic, danh thắng được xếp...