Khóa học free Bài 22: Try, catch, finally trong Java

Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 21/7/13.

  1. Tiasangmoi92

    Tiasangmoi92 Super Moderator

    Lượt xem: 28,686
    /* Bài viết thuộc loạt bài hướng dẫn trong "Khóa Học Lập Trình Java Miễn Phí"
    trên diễn đàn Android.Vn, bạn có thể vào đây đọc

    để hiểu hơn về khóa học và tham gia ngay cùng mọi người;) */

    20111020_Java-Xulyngoaile-p2_2
    Trước khi vào chi tiết, mình sẽ nêu 1 tình huống như này, đó là lỗi chia cho 0.
    Bình thường theo các bài trước, các bạn sẽ dùng if, else để loại bỏ, in ra lỗi. (tất nhiên nếu bạn đã biết try catch rồi thì không nói :D). Đọc xong bài này, các bạn sẽ có thêm 1 cách khác, và tất nhiên nó còn sử dụng để bắt và xử lý nhiều loại lỗi hơn!

    Ví dụ: Các bạn xem đoạn code này trước khi đọc lý thuyết, chạy thử nó, có thể nó cũng khá dễ hiểu!
    PHP:
    package javaandroidvn;
     
    public class 
    JavaAndroidVn {
     
        public static 
    void main(String[] args) {
            
    int a 5;
            
    int b 0;
     
            
    //Cách các bài trước thường làm, dùng if, else:
            
    if (== 0) {
                
    System.out.println("Lỗi chia cho 0");
            } else {
                
    System.out.println("a/b = " b);
            }
     
            
    System.out.println("\nCách dùng try - catch - finally \n");
     
            
    //Sử dụng try, catch để bắt lỗi:
            
    try {
                
    System.out.println("a/b = " b);
            } catch (
    Exception e1) {
                
    System.out.println("Có lỗi gì đó xảy ra  ");
                
    System.out.println("Tên lỗi là: " e1);
            } finally {
                
    System.out.println("Có lỗi hay không thì cái dòng cuối cùng này vẫn được in ra!");
            }
     
        }
    }
    1, Try - catch:

    - Trong ví dụ trên, trong khối try{} là những dòng lệnh chúng ta cần thực hiện!
    Khối catch (Exception e1) {} là nơi chứa các dòng lệnh thực hiện khi phát hiện lỗi!
    - Ở đây, ta cần hiểu rõ khái niệm Exception:
    Exception
    (Ngoại lệ) là sự kiện xảy ra khi một chương trình đang chạy mà phát sinh ra lỗi. Nó sẽ làm gián đoạn chương trình!
    (Exception e1) trong đó "e1" là tên của được gán nếu đối tượng bị lỗi, các bạn có thể đặt tên này bằng các từ khác.
    - Bạn có thể in "e1" ra ngoài, sẽ thấy được lỗi cụ thể!
    - Exception là lớp cha, nó nói chung, và in ra các lỗi, ngoài ra còn có lớp con cụ thể và các ngoại lệ khác như sau:

    Exception | Lớp nền của run-time
    NullPointerException | Một đối tượng không tồn tại
    ClassNotFoundException | Không tìm thấy Class
    FileNotFoundException | Không tìm thấy file
    SecurityException | Exception liên quan đến bảo mật
    ArrayIndexOutOfBoundsException | Vượt quá chỉ mục của mảng
    IllegalAccessException | Truy cập không hợp lệ
    IllegalArgumentException | Đối số hàm
    ArithmeticException | Lỗi thực thi một phép toán
    NumberFormatException | Định dạng số không đúng
    IOException | Lỗi nhập xuất
    EOFException | Kết thúc một tập tin
    NoSuchMethodException | Sai tên phương thức
    InterruptedException | Ngắt luồng đang được thực thi

    Ví dụ: In ra lỗi cụ thể vượt quá chỉ mục của mảng.
    PHP:
    package javaandroidvn;
     
    public class 
    JavaAndroidVn {
     
        public static 
    void main(String[] args) {
            
    int arrInt[] = {124710};
            try {
                
    System.out.println("arrInt[6] = " arrInt[6]);
     
            } catch (
    ArrayIndexOutOfBoundsException e2) {
                
    System.out.println("Lỗi! Vượt quá chỉ mục của mảng! " e2);
            }
     
        }
    }
    Ngoài ra, để in nhiều Exception thì ra làm như sau:
    PHP:
    try {
        
    //Nội dung muốn bẫy lỗi
    } catch (ExceptionType1 e) {
        
    //Khối lệnh cho lỗi
    }catch (ExceptionType2 e1) {
        
    //Khối lệnh cho lỗi
    } catch (Exception ex) {
        
    //Exception cho những cái còn lại
    }
    Trong đó ExceptionType là những loại Exception cụ thể đã nêu ở phía trên!

    2, Finally?

    Nó nằm ở cuối cùng của khối lệnh try - catch - finally, nó luôn luôn được thực hiện ngay cả khi chương trình có bắt được lỗi
    hay không!
    Trong khối lệnh đầy đủ như ví dụ ở đầu bài, dòng System.out.println("Có lỗi hay không thì cái dòng cuối cùng này vẫn được in ra!");
    Luôn luôn được thực hiện và in ra khi bạn gán bất giá trị nào cho b!

    Xem thêm video nói khá đầy đủ về try - catch - finally của Blog StudyAndShare




    Bổ sung thêm video về throw and throws


    [​IMG]

    Bài tập về nhà::D
    Làm lại bài giải phương trình ax + b = 0 . Lập trình hướng đối tượng. Các hệ số nhập vào từ bàn phím. Sử dụng try - catch để bẫy các lỗi khi nhập sai kiểu dữ liệu, ví dụ nhập số lại nhập chữ. Bẫy lỗi chia cho 0.

    (Chú ý: Các bạn nên tự giác làm bài tập, hoàn thiện rồi đăng lên, các bài bạn đã làm, nên để code trong thẻ code - chọn thẻ PHP cho rõ ràng và để ẩn code trong thẻ ẩn spoiler, để khi click vào mới hiện code lên , trước khi thử sức tự làm, bạn không nên nhìn code của các bạn khác đã đăng nhé;))

    [​IMG]

    My Facebook: https://www.facebook.com/tiasangmoi

    Bài viết đăng lên diễn đàn khác vui lòng ghi rõ nguồn: Android.Vn
    try catch finally java, try trong java, catch trong java, finally trong java là gì, bẫy lỗi trong java, xử lý lỗi trong java, khóa học lập trình java, khóa học java, throw trong java, throws trong java
    nguyenthanhTuyen, Mr_Gru, Quagn19982 others thích bài này.
  2. phongdt

    phongdt New Member

    Show Spoiler

    PHP:
    package basic;
     
    import basic.NumbersHandling;                            // class minh viet san nham muc dich kiem soat truong hop nhap chu thay vi nhap so
     
    public class SimpleEquation
    {
        private 
    float a;
        private 
    float b;
       
        public 
    SimpleEquation()
        {
            
    boolean continueLoop true;
            while( 
    continueLoop )
            {
                try
                {
                    
    System.out.print( "Enter a: " );
                    
    NumbersHandling.inputFloatHandling();  
                    if ( 
    == )
                        throw new 
    IllegalArgumentException "First Argument cannot be zero!" );
                    else
                        
    continueLoop false;
                }
                catch ( 
    Exception e )
                {
                    
    System.out.println);
                }
            }
            
    System.out.print( "Enter b: " );
            
    NumbersHandling.inputFloatHandling();
        }
       
        public 
    void run()
        {
            
    System.out.println"x = " + ( -) );
        }
       
        public static 
    void main(String[] args)
        {
            
    SimpleEquation newTest = new SimpleEquation();
            
    newTest.run();
        }
     
    }
    tuanleedragonTiasangmoi92 thích bài này.
  3. diepthanh94

    diepthanh94 New Member

    bài này e chịu :)
  4. Tiasangmoi92

    Tiasangmoi92 Super Moderator

    Làm lại ví dụ đi em, không tham khảo bài bạn trên nữa!
    nqteo110 thích bài này.
  5. gabk

    gabk Active Member

    Sao phương trình bậc nhất mà a = 0 thì lại là Illegal nhỉ. Với phương trình bậc nhất thì người ta phân rõ các trường hợp:
    1 - a=0 && b=0 => vô số nghiệm
    2- a=0 && b!=0 => vô nghiệm
    3 - a!=0 => nghiệm duy nhất
    Bài toán này ko phù hợp lắm
    Tiasangmoi92 thích bài này.
  6. Tiasangmoi92

    Tiasangmoi92 Super Moderator

    Chủ yếu là mong các bạn ấy làm cái này, nhưng lại chưa làm được ^^
  7. phongdt

    phongdt New Member

    Ồ thực ra mình không để ý lắm, lúc đó mình chỉ nghĩ là nếu a = 0 thì không còn là phương trình :D
  8. rockman1510

    rockman1510 New Member

    Show Spoiler

    PHP:
    /*
    * To change this template, choose Tools | Templates
    * and open the template in the editor.
    */
    package learning.basic;
     
    import java.util.InputMismatchException;
    import java.util.Scanner;
     
    /**
    *
    * @author Le Van Huy
    */
    public class Try_Catch {
        public static 
    void main (String[] args){
            
    Math cal = new Math();
            
    cal.input();
            
    System.out.println("//----------------------------------------//");
            
    cal.show();
        }
    }
     
    class 
    Math{
        public 
    int ab;
        public 
    void input(){
            
    Scanner input = new Scanner(System.in);
            try {  
    // set input method in try{}.
            
    System.out.print("Let put value of a: ");
            
    input.nextInt();
            
    System.out.print("Let put value of b: ");
            
    input.nextInt();
            }
            catch(
    InputMismatchException e){    //set Exception and error report in catch(){}.
                
    System.out.println("Error: " e.toString());
            }
            catch(
    Exception e){
                
    System.out.println("Error: " e.toString());
            }   
        }
           
        public 
    void show(){
            
    System.out.println("ax + b = 0, a = " ", b = " b);
            try{    
    // set input method in try{}.
              
    System.out.println("=> x = " + (-b/a));
            }
            catch(
    ArithmeticException e){  //set Exception and error report in catch(){}.
                
    System.out.println("Error: " e.toString());
            }
        }
    }
  9. gabk

    gabk Active Member

    Có một chú ý nhỏ như thế này với các bạn:
    Với 1 try thì có thể có nhiều catch. Ta có thể dùng nhiều catch để bắt chính xác loại ngoại lệ sẽ gặp phải, tuy nhiên, nhiều khi ta không thể lường hết được, biết đâu có 1 ngoại lệ nào đó (chẳng hạn runtimeexception) nó ko vào một cái catch nào của bạn (ví dụ bạn có 3 catch: NumberFormatException, NullPointerException, FileNotFoundException) thì lúc đó chương trình của bạn vẫn bị crash. Để tránh tình trạng này, ta nên cẩn thận (mặc dù có thể như thế là thừa thãi nhưng đôi lúc lại có giá trị) đó là luôn để vòng catch cuối cùng là lớp Exception, như vậy nếu các vòng catch cụ thể ko gặp thì thằng catch này sẽ bắt được, và như thế sẽ ko bị crash. Và nếu mình không cần quan tâm quá nhiều đến ngoại lệ thì tốt nhất chỉ cần 1 catch(Exception e) là đủ. Mình đã gặp tình huống trong khi làm thực tế nên muốn chú ý các bạn chút
    stoai, nqteo110, phongvanptit6 others thích bài này.
  10. dienlh93

    dienlh93 New Member

    Show Spoiler

    PHP:
    /*
    * To change this template, choose Tools | Templates
    * and open the template in the editor.
    */
     
    /**
    *
    * @author dienlh
    */
    import java.io.DataInputStream;
    class 
    NhapDL{
        static 
    DataInputStream str=new DataInputStream(System.in);
        public static 
    String nhapString(){
            
    String st="";
            
    boolean ok=false;
            while(!
    ok){
                try{
                    
    st=str.readLine();
                    
    ok=true;
     
                }catch(
    Exception e){
                    
    System.out.println("Not found"+e.toString()+"\nVui long nhap lai:");
                 
                }
            }
            return 
    st;
        }
        public static 
    double NhapDouble(){
            
    String st;
            
    double d=0;
            
    boolean ok=false;
            while(!
    ok){
                try{
                    
    st=NhapDL.nhapString();
                    
    d=Double.valueOf(st).doubleValue();
                    
    ok=true;
                }catch(
    Exception e){
                    
    System.out.print("Error"+e.toString());
                    
    System.out.print("Vui long nhap lai: ");
                }
            }
            return 
    d;
        }
    }
    public class 
    TryCatch {
        
    double a,b;
        public 
    void nhapTT(){
            
    System.out.print("Nhap a: ");
            
    a=NhapDL.NhapDouble();
            
    System.out.print("Nhap b: ");
            
    b=NhapDL.NhapDouble();
        }
        public 
    void Xuly(){
            if(
    a==0&&b==0){ System.out.println("Phuong trinh vo so nguyen thuoc R!!");}
            else if(
    a==0&&b!=0){    System.out.println("Phuong trinh vo nghiem!!");}
            else{
                
    System.out.println("Phuong trinh co nguyen duy nhat: "+(-b/a));
            }
        }
        public static 
    void main(String[] args){
            
    TryCatch tryc=new TryCatch();
            
    tryc.nhapTT();
            
    tryc.Xuly();
        }
    }
    Tiasangmoi92 thích bài này.
  11. HaiHack

    HaiHack Member

    cho mình hỏi khi nhập điểm, muốn bắt ngoại lệ nhập điểm ngoài vùng 0-10 thì làm thế nào
    Tiasangmoi92 gabk
  12. gabk

    gabk Active Member

    Hồ hồ, cách đầu tiên là bạn tự định nghĩa exception của riêng bạn mà thôi vì cái bạn nêu ra ko phải là exception chuẩn. Bạn lên mạng search từ khóa "custom exception in java" hoặc các từ đại loại như thế sẽ ra rất nhiều. Demo một link nhóe:
    http://www.javatutorialhub.com/java-user-defined-exception.html
    Nhưng những tình huống như bạn nêu thì nên check bằng if,else thì có lẽ hay hơn chứ viết hẳn exception riêng mình nghĩ nó cứ giống như kiểu mang dao mổ trâu đi giết kiến vậy :)

    Cách thứ 2 có thì khá là củ chuối nhưng nó cũng là 1 cách làm, giờ bạn tạo 1 mảng có 11 phần tử, mỗi phần tử chứa 1 giá trị từ 0->10, gọi là mảng điểm, tên là scoreArr. Giờ khi người dùng nhập điểm là 1 số, thay vì lấy số đó là điểm thì ta lấy đó là vị trí của điểm trong mảng scoreArr, giả sử người dùng nhập là 7 thì cũng là 7 điểm nhưng ta ko lấy trực tiếp mà lấy bằng cách score = scoreArr[7]
    Và nếu làm theo cách này thì nếu người dùng nhập vào 1 số ngoài phạm vi từ 0->10 sẽ phát sinh ra ngoại lệ IndexOutOfBounException
    Nói thật là mình chưa làm như bạn nói bao giờ nên chỉ giúp bạn kiểu này được 2 ý tưởng "chuối" này thôi, nhờ các pro giúp bạn vậy. Bạn làm được cách nào hay thì chia sẻ với a e nhóe
    TaHuy, HaiHackTiasangmoi92 thích bài này.
  13. Tiasangmoi92

    Tiasangmoi92 Super Moderator

    Nếu điểm nhập nhỏ hơn 0 hoặc lớn hơn 10 thì báo người dùng nhập sai, if là quá đủ rồi bạn :rolleyes:
    TaHuy thích bài này.
  14. dienlh93

    dienlh93 New Member

    Bạn dùng if là được rồi bạn à! ko cần try{}catch{} làm gì cho nó rắc rối! gì thì nó cũng có giải pháp thôi nhưng mà suy nghĩ nó phức tạp mà vấn đề nó lại ko phức tạp...^^!
  15. HaiHack

    HaiHack Member

    Hi,
    Biết là dùng if là được nhưng mà vì mới học exception nên thầy bắt dùng kiểu này
    Mình cũng làm được rồi, custom exception rồi ném ra thôi
    Tiasangmoi92 thích bài này.
  16. kienit

    kienit New Member

    Show Spoiler
    PHP:
    package ede.cacbt.kien;
     
    import java.util.InputMismatchException;
    import java.util.Scanner;
     
    public class 
    TryCatchBt {
        public static 
    void main(String[] args) {
            
    Scanner nhap = new Scanner(System.in);
     
            try {
                
    int a;
                
    int b;
     
                
    System.out.println("Nhap a:  ");
                
    nhap.nextInt();
                
    System.out.println("Nhap b:  ");
                
    nhap.nextInt();
     
                
    System.out.println("Ngiem la  :" + (-a));
     
            } catch (
    ArithmeticException e) {
                
    System.out.println("Error=  :" e);
     
            } catch (
    InputMismatchException e1) {
                
    System.out.println("Error nhap sai kieu du lieu: " e1);
            }
        }
     
    }
  17. kienit

    kienit New Member

    add xem e với
    Show Spoiler
    PHP:
    package ede.cacbt.kien;
     
    import java.util.InputMismatchException;
    import java.util.Scanner;
     
    public class 
    TryCatchBt {
        public static 
    void main(String[] args) {
            
    Scanner nhap = new Scanner(System.in);
     
            try {
                
    int a;
                
    int b;
     
                
    System.out.println("Nhap a:  ");
                
    nhap.nextInt();
                
    System.out.println("Nhap b:  ");
                
    nhap.nextInt();
     
                
    System.out.println("Ngiem la  :" + (-a));
     
            } catch (
    ArithmeticException e) {
                
    System.out.println("Error=  :" e);
     
            } catch (
    InputMismatchException e1) {
                
    System.out.println("Error nhap sai kieu du lieu: " e1);
            }
        }
     
    }
    soiconsutucon, TaHuyTiasangmoi92 thích bài này.
  18. Show Spoiler

    Mã:
    package javaandroid.vn;
     
    import java.util.Scanner;
     
    public class BTBai22 {
        private float a,b;
        public static void main(String[]args){
            BTBai22 b=new BTBai22();
            b.nhap();
            System.out.println("In a:"+b.getA());
            System.out.println("In b:"+b.getB());
            try{
                System.out.println("Nghiem pt ="+(-b.getB())/(b.getA()));
            }catch(Exception e){
                System.out.println(e);
            }
        }
       
        public float getA() {
            return a;
        }
     
        public void setA(float a) {
            this.a = a;
        }
     
        public float getB() {
            return b;
        }
     
        public void setB(float b) {
            this.b = b;
        }
     
        public void nhap(){
            Scanner in=new Scanner(System.in);
            try{
                System.out.println("Nhap a:");
                setA(in.nextFloat());
                System.out.println("Nhap b:");
                setB(in.nextFloat());   
            }catch(Exception e){
                System.out.println(e);
            }
        }
    }
    
    soiconsutucon, tuanleedragonTiasangmoi92 thích bài này.
  19. ma_vuong_19

    ma_vuong_19 New Member

    System.out.println(Math.toRadians((double)('o' * 3 * 21)))
    câu này cho ra được gì vậy các bác
    em đăng kí trên diễn đàn java nó bắt điền mà em thì chưa biết chạy kiểu j
  20. haizax

    haizax New Member

    sửa giúp mình với :D
    Show Spoiler

    PHP:
    //Làm lại bài giải phương trình ax + b = 0 . Lập trình hướng đối tượng.
    //Các hệ số nhập vào từ bàn phím. Sử dụng try - catch để bẫy các lỗi khi nhập sai kiểu dữ liệu,
    //ví dụ nhập số lại nhập chữ. Bẫy lỗi chia cho 0.
    package bai.pkg22;
     
    import java.util.Scanner;
    public class 
    Bai22 {
     
     
        public static 
    void main(String[] args) {
            
    PhuongTrinh x = new PhuongTrinh();
            
    x.in();
            
    x.out();
        }
    }
    class 
    PhuongTrinh{
        private 
    float a,b;
        public 
    void in(){
            
    Scanner in = new Scanner(System.in);
            try{
            
    System.out.println("Nhap a: ");
            
    this.in.nextFloat();
            
    System.out.println("Nhap b: ");
            
    this.in.nextFloat();
        } catch(
    Exception e){
                
    System.out.println("Loi Nhap sai ki tu" e);
        }
        }
        public 
    void out(){
            
    System.out.println("Gia tri a la: "this.a);
            
    System.out.println("Gia tri b la: "this.b);
            try {
                
    System.out.println("Gia tri x = " +b/a);
            }catch (
    Exception e){
                
    System.out.println("Phat hien loi " e);
            }
        }
    }

Chia sẻ trang này