Skip to content

Từ khóa throw và throws trong Java

Từ khóa throw trong java

Từ khóa throw trong java được sử dụng để ném ra một ngoại lệ(exception) cụ thể.

Chúng ta có thể ném một trong hai ngoại lệ checked hoặc unchecked bằng từ khóa throw. Từ khóa throw chủ yếu được sử dụng để ném ngoại lệ tùy chỉnh(ngoại lệ do người dùng tự định nghĩa).

Cú pháp:

throw exception;

Ví dụ 1: throw ngoại lệ nhưng không xử lý

Tạo phương thức checkNum với giá trị truyền vào có kiểu dữ liệu int. Nếu giá trị truyền vào nhỏ hơn 1 thì ném một ngoại lệ ArithmeticException, nếu không in ra bình phương của giá trị truyền vào.

public class TestThrow {
    public static void checkNum(int num) {
        if (num < 1) {
            throw new ArithmeticException("Number is negative, cannot calculate square");
        }
        else {
            System.out.println("Square of " + num + " is " + (num*num));
        }
    }
    //main method
    public static void main(String[] args) {
        TestThrow obj = new TestThrow();
        obj.checkNum(-3);
        System.out.println("Rest of the code..");
    }
}

Kết quả:

Exception in thread "main" java.lang.ArithmeticException: Number is negative, cannot calculate square
	at com.example.demo.TestThrow.checkNum(TestThrow.java:6)
	at com.example.demo.TestThrow.main(TestThrow.java:15)

Ví dụ 2: throw ngoại lệ có xử lý

public class TestThrow {
    public static void checkNum(int num) {
        try {
            if (num < 1) {
                throw new ArithmeticException("Number is negative, cannot calculate square");
            }
            else {
                System.out.println("Square of " + num + " is " + (num*num));
            }
        } catch(Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
    //main method
    public static void main(String[] args) {
        TestThrow obj = new TestThrow();
        obj.checkNum(-3);
        System.out.println("Rest of the code..");
    }
}

Kết quả:

Number is negative, cannot calculate square
Rest of the code..

Từ khóa throws trong java

Từ khóa throws được sử dụng để khai báo một ngoại lệ. Nó thể hiện thông tin cho lập trình viên rằng có thể xảy ra một ngoại lệ. Vì vậy, tốt hơn là lập trình nên cung cấp mã xử lý ngoại lệ để có thể duy trì luồng bình thường của chương trình.

Xử lý ngoại lệ chủ yếu được sử dụng để xử lý các ngoại lệ checked. Nếu xảy ra bất kỳ ngoại lệ unchecked, chẳng hạn như NullPointerException, thì đó là lỗi của lập trình viên khi không kiểm tra mã trước khi sử dụng.

Cú pháp:

return_type method_name() throws exception_class_name{  
//method code  
}  

Ngoại lệ nào nên được khai báo

Chỉ ngoại lệ checked, bởi vì:

  • Ngoại lệ unchecked: nằm trong sự kiểm soát của bạn.
  • error: nằm ngoài sự kiểm soát của bạn, ví dụ bạn sẽ không thể làm được bất kì điều gì khi các lỗi VirtualMachineError hoặc StackOverflowError xảy ra.

Lợi ích của từ khóa throws trong java

  • Ngoại lệ checked có thể được ném ra ngoài và được xử lý ở một hàm khác.
  • Cung cấp thông tin cho caller của phương thức về các ngoại lệ.

Ví dụ:

import java.io.IOException;

class TestThrows {

    void m() throws IOException {
        throw new IOException("device error");//checked exception
    }

    void n() throws IOException {
        m();
    }

    void p() {
        try {
            n();
        } catch (Exception e) {
            System.out.println("exception handled");
        }
    }

    public static void main(String args[]) {
        TestThrows obj = new TestThrows();
        obj.p();
        System.out.println("normal flow...");
    }
}

Kết quả:

exception handled
normal flow...

Có hai trường hợp:

  • TH1: Bạn đã bắt ngoại lệ, tức là xử lý ngoại lệ bằng cách sử dụng try/catch.
  • TH2: Bạn khai báo ném ngoại lệ, tức là sử dụng từ khóa throws với phương thức.

TH1: xử lý ngoại lệ với try/catch

import java.io.*;

class M {

    void method() throws IOException {
        throw new IOException("device error");
    }
}

public class TestThrows1 {

    public static void main(String args[]) {
        try {
            M m = new M();
            m.method();
        } catch (Exception e) {
            System.out.println("exception handled");
        }

        System.out.println("normal flow...");
    }
}

Kết quả:

exception handled
normal flow...

TH2: Khai báo throws ngoại lệ

  • Trong trường hợp bạn khai báo throws ngoại lệ, nếu ngoại lệ không xảy ra, code sẽ được thực hiện tốt.
  • B) Trong trường hợp bạn khai báo throws ngoại lệ, nếu ngoại lệ xảy ra, một ngoại lệ sẽ được ném ra tại runtime vì throws nên không xử lý ngoại đó.

1. Ngoại lệ không xảy ra

import java.io.*;

class M2 {

    void method() throws IOException {
        System.out.println("device operation performed");
    }
}

class TestThrows2 {

    public static void main(String args[]) throws IOException {//declare exception
        M2 m = new M2();
        m.method();

        System.out.println("normal flow...");
    }
}

Kết quả:

device operation performed
normal flow...

2. Ngoại lệ xảy ra

import java.io.*;

class M3 {

    void method() throws IOException {
        throw new IOException("device error");
    }
}

class TestThrows3 {

    public static void main(String args[]) throws IOException {//declare exception  
        M3 m = new M3();
        m.method();

        System.out.println("normal flow...");
    }
}  

Kết quả:

Exception in thread "main" java.io.IOException: device error
	at com.example.demo.M3.method(TestThrows3.java:8)
	at com.example.demo.TestThrows3.main(TestThrows3.java:16)

Sự khác nhau giữa throwthrows

throwthrows
Từ khóa throw trong java được sử dụng để ném ra một ngoại lệ rõ ràng.Từ khóa throws trong java được sử dụng để khai báo một ngoại lệ.
Ngoại lệ checked không thể được truyền ra chỉ bằng cách sử dụng từ khóa throw.Từ khóa throws chỉ có thể được sử dụng để truyền bá các ngoại lệ checked.
Sau throw là một instance.Sau throws là một hoặc nhiều class.
Throw được sử dụng trong phương thức.Throws được khai báo ngay sau dấu đóng ngoặc đơn của phương thức.
Không thể throw nhiều ngoại lệ.Có thể throws nhiều ngoại lệ.
Ví dụ: main() throws IOException, SQLException.

Published inJava Core

Be First to Comment

Leave a Reply

Your email address will not be published. Required fields are marked *