Mục lục
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.
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á throw và throws 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á throw và throws. 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