Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 14
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Quản lý ngoại lệ trong lập trình Java

    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

  2. #2
    Được đấy [IMG]images/smilies/biggrin.png[/IMG]
    Trước giờ mình ko thích xài try catch ( vì ko quen, C/C++ éo cóa) mà thay vào đó là tự if else.
    Giờ đọc dc cái xử lý tội phạm thì cũng ngon. Mình theo mọi người cũng "bày đặt" try catch cho bằng người ta ^^

    Cho mình hỏi phát: Là mấy cái Exception tham số của mấy cái catch là nó mọc ở đâu ra ? Làm sao để biết exception nào tương ứng với loại lỗi nào để mình có cách xử lý thích hợp ?
    Làm sao biết thằng tội phạm 1 nó phạm tội gì để phạt nó ? Làm sao biết thằng tội phạm 2 phạm tội gì để xử phạt nó ?
    Ở cái demo try catch code trên thì chỉ mới thấy câu In ra màn hình chứ ko thấy "gom các thằng tội phạm vào" rồi đánh số chúng (như việc mỗi thằng cầm 1 cái bảng -mã tù nhân) rồi công an chụp cái ảnh ấy ^^

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi clchicken
    Được đấy [IMG]images/smilies/biggrin.png[/IMG]
    Trước giờ mình ko thích xài try catch ( vì ko quen, C/C++ éo cóa) mà thay vào đó là tự if else.
    Giờ đọc dc cái xử lý tội phạm thì cũng ngon. Mình theo mọi người cũng "bày đặt" try catch cho bằng người ta ^^

    Cho mình hỏi phát: Là mấy cái Exception tham số của mấy cái catch là nó mọc ở đâu ra ? Làm sao để biết exception nào tương ứng với loại lỗi nào để mình có cách xử lý thích hợp ?
    Làm sao biết thằng tội phạm 1 nó phạm tội gì để phạt nó ? Làm sao biết thằng tội phạm 2 phạm tội gì để xử phạt nó ?
    Ở cái demo try catch code trên thì chỉ mới thấy câu In ra màn hình chứ ko thấy "gom các thằng tội phạm vào" rồi đánh số chúng (như việc mỗi thằng cầm 1 cái bảng -mã tù nhân) rồi công an chụp cái ảnh ấy ^^
    Thực ra thì trong C++ cũng có try và catch tuy nhiên nhiều sách ko đề cập tới [IMG]images/smilies/biggrin.png[/IMG]

    try, catch trong C++

    Làm sao biết thằng tội phạm 1 nó phạm tội gì để phạt nó ? Làm sao biết thằng tội phạm 2 phạm tội gì để xử phạt nó ?
    Khi xây dựng các lớp exception thì người ta đã phân ra các loại tội phạm. Trong khối try nếu phát hiện tội phạm nào thì xử lý bằng khối catch
    ---> Ở trên mình dùng biện pháp in ra màn hình để thông báo. Chứ không thể sửa 0 thành 1 được [IMG]images/smilies/biggrin.png[/IMG] ---> Người dùng nhập sai có thể yêu cầu nhập lại. Hoặc gần đây nhất mình có làm mô hình sinh thái [IMG]images/smilies/biggrin.png[/IMG] ---> các entity va chạm với nhau ---> Mình chưa nghĩ ra biện pháp ----> Làm ngơ. Tức là bắt lỗi và bỏ qua lỗi đó [IMG]images/smilies/tongue.png[/IMG]

    - Còn phần tự xây dựng các lớp exception mình chưa viết nốt [IMG]images/smilies/biggrin.png[/IMG]

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi clchicken
    Được đấy [IMG]images/smilies/biggrin.png[/IMG]
    Trước giờ mình ko thích xài try catch ( vì ko quen, C/C++ éo cóa) mà thay vào đó là tự if else.
    Giờ đọc dc cái xử lý tội phạm thì cũng ngon. Mình theo mọi người cũng "bày đặt" try catch cho bằng người ta ^^

    Cho mình hỏi phát: Là mấy cái Exception tham số của mấy cái catch là nó mọc ở đâu ra ? Làm sao để biết exception nào tương ứng với loại lỗi nào để mình có cách xử lý thích hợp ?
    Làm sao biết thằng tội phạm 1 nó phạm tội gì để phạt nó ? Làm sao biết thằng tội phạm 2 phạm tội gì để xử phạt nó ?
    Ở cái demo try catch code trên thì chỉ mới thấy câu In ra màn hình chứ ko thấy "gom các thằng tội phạm vào" rồi đánh số chúng (như việc mỗi thằng cầm 1 cái bảng -mã tù nhân) rồi công an chụp cái ảnh ấy ^^
    Hi, nó sẽ nhảy đến catch bắt Exception nào đó, tuỳ theo loại Exception được ném ra, ở trên bài của của cậu chủ topic mới chỉ nói về một loại Exception chung nhất, có nhiều loại Exception, được kế thừa từ lớp Exception.

    C++ có try catch rồi nha clchicken

  5. #5
    Ôi thế ah . Thế mà bữa h cứ tưởng nó ko có (vì thấy mấy người Java với C# mới hay xài nên...), đúng là nông cạn thật.
    Mà mình vẫn chưa hiểu Mấy loại Exception lắm. (tự dưng thấy nó mọc ra, lạ lạ )
    Mấy Exception đó đã được ngôn ngữ xây dựng sẵn và mình chỉ việc lôi ra đối chiếu thôi hoặc là mình override thêm vào lớp nữa đúng không nhỉ ?
    Mình có đọc ở đâu đó ở 1 hướng tiếp cận khác là việc throw Exception trong 1 hàm/phương thức nào đấy. Nếu trong quá trình thực hiện phương thức mà bị lỗi thì throw exception đó ra.
    Vậy có phải cái exception mình đã viết trong hàm đó bây giờ nó được bắn ra ngoài này để catch bắt không ?

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi clchicken
    Ôi thế ah . Thế mà bữa h cứ tưởng nó ko có (vì thấy mấy người Java với C# mới hay xài nên...), đúng là nông cạn thật.
    Mà mình vẫn chưa hiểu Mấy loại Exception lắm. (tự dưng thấy nó mọc ra, lạ lạ )
    Mấy Exception đó đã được ngôn ngữ xây dựng sẵn và mình chỉ việc lôi ra đối chiếu thôi hoặc là mình override thêm vào lớp nữa đúng không nhỉ ?
    Tại mấy lỗi trên chưa nghiêm trọng thôi. Chứ dùng nhiều là quen ngay, thích ngay ý mà [IMG]images/smilies/biggrin.png[/IMG]
    Exception là ông tổ của các loại lỗi mà. Trong Exception có 2 lớp con chính: RuntimeException, IOException. Trong Runtime lại có NullPointer .... [IMG]images/smilies/biggrin.png[/IMG]. Ngoài ông tổ đó ra còn có cụ tổ Throwable [IMG]images/smilies/11.gif[/IMG][IMG]images/smilies/11.gif[/IMG][IMG]images/smilies/11.gif[/IMG]. Nhưng mà rộng quá. Quản lý cả error nữa [IMG]images/smilies/laughing.gif[/IMG][IMG]images/smilies/laughing.gif[/IMG][IMG]images/smilies/laughing.gif[/IMG]


    Vậy có phải cái exception mình đã viết trong hàm đó bây giờ nó được bắn ra ngoài này để catch bắt không ?
    Java cũng cung cấp các key word để mình tự xây dựng cho riêng mình nữa mà [IMG]images/smilies/tongue.png[/IMG]. Mình sẽ post tiếp vào ngày gần đây nhất [IMG]images/smilies/biggrin.png[/IMG]

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Hê, đã mườn tượng được cái try catch nó làm trò gì rồi [IMG]images/smilies/biggrin.png[/IMG]
    Hy vọng bài mới sớm ra lò để mình không còn "mườn tượng" nữa. Mà còn có cái áp dụng với người ta chứ. Bữa h toàn tự bắt lỗi = tay thôi

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    cái demo này có vấn đề đó bạn , xem lại nhé [IMG]images/smilies/biggrin.png[/IMG]

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Em ko phát hiện lỗi sai, mong a chỉ giúp. Cơ bản là mù mờ + lâu không đụng tới nên ko phát hiện
    Chỉ muốn góp sức mọn vào forum mới mở [IMG]images/smilies/biggrin.png[/IMG]
    Thanks

    beautifulsoul84hung,

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi Mr_Chan
    Em ko phát hiện lỗi sai, mong a chỉ giúp. Cơ bản là mù mờ + lâu không đụng tới nên ko phát hiện
    Chỉ muốn góp sức mọn vào forum mới mở [IMG]images/smilies/biggrin.png[/IMG]
    Thanks

    beautifulsoul84hung,
    Giữa 2 cái catch sao lại có .... ( có code) thế kia [IMG]images/smilies/icon_question.gif[/IMG]
    Edit: Ah, giờ mới hiểu, đó là những cái catch khác.
    Cơ mà type của các exception trong mỗi mệnh đề catch phải khác nhau, giống nhau thì thằng phía trên nó catch rồi làm sao throw cho thằng dưới catch được

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •