Cách sử dụng throw và throws trong java

Throw trong java

Từ khoá throw trong java được sử dụng để ném một checked hoặc unchecked exception.

Cú pháp 

throw Instance

Example:
throw new ArithmeticException("/ by zero");

Luồng chạy của chương trình sẽ bị ngừng ngay sau khi throw được gọi. Chương trình sẽ tiến hành tìm khối try-catch  gần nhất để xử lý exception, nếu không tìm thấy chương trình sẽ tiến hành tìm khối try-catch cao hơn cứ như vậy cho đến khi không tìm được khối try-catch nào thì trình xử lý mặc định sẽ tạm ngừng chương trình. 

throw in java

class ThrowExcep {
    static void fun() {
        try {
            throw new NullPointerException("demo");
        } catch (NullPointerException e) {
            System.out.println("Caught inside fun().");
            throw e; // rethrowing the exception 
        }
    }

    public static void main(String args[]) {
        try {
            fun();
        } catch (NullPointerException e) {
            System.out.println("Caught in main.");
        }
    }
}

Output

Caught inside fun().
Caught in main.

Throws trong java

Throws được sử dụng để khai báo các exception có thể ném ra bởi method. Nơi gọi method này phải xử lý các exception bằng try-catch hoặc sử dụng lại từ khoá throws để ném lên cho method ở trên xử lý. 

type method_name(parameters) throws <danh sách các exception>

Nếu một method khai báo các exception có thể ném với từ khoá throws thì các method sử dụng chúng sẽ bắt buộc phải xử lý nếu không sẽ bị trình biên dịch báo unreported exception XXX must be caught or declared to be thrown.

class ThrowsExecp {
    static void fun() throws IllegalAccessException {
        System.out.println("Inside fun(). ");
        throw new IllegalAccessException("demo");
    }

    public static void main(String args[]) {
        try {
            fun();
        } catch (IllegalAccessException e) {
            System.out.println("caught in main.");
        }
    }
}

Output: 

Inside fun().
caught in main.

Giải thích:

  • Method A() -> B(); B() ->C()
  • Trong C() có khả năng bị ném ra exception X. C() không muốn xử lý nên throws X.
  • B() bị buộc xử lý X. B() thích thì try-catch xử lý không thì throws lên A().
  • Nếu B() throws X thì A() xử lý không thì thôi ok =).

Note: Throws nên được dùng với CheckedException. Nếu có UncheckedException xảy ra đó là lỗi do lập trình viên không thực hiện đầy đủ các điều kiện kiểm tra.

Khi nào dùng throws

Nhiều bạn cứ thấy báo lỗi phải xử lý exception này nọ cứ dùng throws cho nhanh. Quá sai lầm nhé, chúng ta phải tiến hành xác định xem đâu là nơi xử lý exception đó để sử dụng try-catch xử lý. Ví dụ sau

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

class Main {

    public static String readFirstLine(String path) {
        String line = "";
        try (BufferedReader bir = new BufferedReader(new FileReader(path))) {
            line = bir.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return line;
    }

    public static void main(String[] args) {
        String line = readFirstLine("mypath");
        System.out.println("First line of mypath: " + line);
    }
}

Ở ví dụ trên readFirstLine() sẽ đọc dòng đầu tiên của file theo đường dẫn được chỉ định. Theo ý của mình muốn nếu đường dẫn không chính xác hoặc file rỗng thì trả về chuỗi rỗng luôn nên mình xử lý exception ngay tại readFirstLine() method.

Sự khác nhau giữa throw và throws

Hai từ khoá throwthrows mặc dù cách sử dụng khác nhau thế nhưng nhiều bạn mới học rất dễ nhầm lẫn. Dưới đây mình sẽ nêu các điểm khác nhau giữa hai từ khoá này để các bạn dễ phân biệt

1, Throws được dùng để khai báo các exception của một method trong khi Throw được dùng để ném một exception cụ thể.

2, Theo sau từ khoá Throw là một instance của exception trong khi theo sau Throws là tên class của các exception.

throw new IllegalArgumentException("IllegalArgumentException Exception");

throws FileNotFoundException;

3, Từ khoá Throw được dùng bên trong method trong khi Throws được dùng chung với phần khai báo của method.

Ví dụ Throw

void myMethod() {
   try {
      //throwing IllegalArgumentException exception using throw
      throw new IllegalArgumentException("Something went wrong!!");
   } 
   catch (Exception exp) {
      System.out.println("Error: "+exp.getMessage());
   }
}

Ví dụ Throws

void sample() throws IOException{
   //Statements
}

Lời kết

Qua bài viết trên với hy vọng các bạn sẽ nắm được cơ bản về 2 từ khoá throwthrows. Luôn nhớ chỉ sử dụng throws với checked exception thôi nhé.

Nguồn tham khảo

https://www.geeksforgeeks.org/throw-throws-java/

Difference between throw and throws in java

5 1 vote
Article Rating
Subscribe
Notify of
guest
2 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
2
0
Would love your thoughts, please comment.x
()
x