Thắc mắc về ngoại lệ trong java

public class SampleException5 {
 public void writeFile() throws IOException {
    FileWriter fw = new FileWriter("data.txt");
    fw.write("Xu ly ngoai le trong java");
    fw.close();
 }

 public static void main(String args[]) {
    try {
      SampleException5 se5 = new SampleException5();
      se5.writeFile();
    } catch (IOException ioe) {
      System.out.println("Co loi ghi file: "+ ioe);
    }
 }
}

giả sử mình có đoạn code như trên … mình vẫn không hiểu vì sao phải dùng throws trên hàm vì nếu dùng try catch thì nó sẽ kiểm tra luôn cả đoạn code hàm writeFile khi gọi đến chứ vậy thì throws báo cái phương thức đó có khả năng xảy ra ngoại lệ làm gi nữa (mặc dù biết đây là người viết java là cao thủ rồi nên thắc mắc mình biết chắc sẽ sai nhưng vẫn không hiểu sao nó lại sai)

Khi có exception thì phải báo throws ra để các calling methods khác nó biết là called method này sẽ xảy ra những lỗi gì, để người viết code sẽ handle. Việc handle sẽ nằm trong try-catch hoặc tiếp tục throws lên các lớp trên hoặc ko handle để chương trình crash luôn là việc của người code.

1 Like

mặc dù là cao thủ nhưng viết vẫn có khả năng sai mà bạn, nên thắc mắc khi thấy có gì đó chưa hiểu cũng là 1 cách để học hỏi.
Về ý trả lời thì @Nancru đã nêu rồi nên mình không nhắc lại nữa. Chọn try catch hay chỉ khai báo throws trên method signature thì là tùy ở bạn. Tùy vào mục đích mà sẽ catch 1 số exception hoặc không.
Ngoài ra code của cao thủ trên mắc 1 sai lầm, nếu bạn nhận ra được thì quá tốt. Không xem spoiler trước khi nghiên cứu nhé
[spoiler]

public void writeFile() throws IOException {
    FileWriter fw = new FileWriter("data.txt");
    fw.write("Xu ly ngoai le trong java");
    fw.close(); // nếu có exception thì fw sẽ không close được, có thể hỏng file
}

code chuẩn

public void writeFile() throws IOException {
    FileWriter fw = null;
    try {
        fw = new FileWriter("data.txt");
        fw.write("Xu ly ngoai le trong java");
   } finally {
       if (fw != null) fw.close();
   }
}

[/spoiler]

1 Like

đơn giản vì chúng ta không muốn bắt exception tại hàm writeFile đó mà để việc try-catch cho những hàm gọi nó. Thường thường khi làm những thứ phức tạp cần phải tổ chức code theo từng nhiệm vụ 1 thì cần quan tâm đến điều này. Kiểu như:

class FileWriterAction {
   public boolean write(String fileName, Object data) throws IOException {
       // create new File instance
       // write data to file
       // return true if write success. Otherwise, return false
   }

class FileWriterService extend Service {
    // parent method: handleException(Exception ex);

    public ServiceResponse write(String fileName) {
        try {
            new FileWriterAction().write(fileName);
        } catch (IOException e) {
            handleException(e);
            /* catch the exception here cause we want to handle all statuses of business logic (FileWriterAction class)
            in the service class. I want to know whether the FileWriterAction is success, false or thow the exception. 
            This is the organization of my code: focus all exceptions in one place: method handleException() to make
            more easily to handle all exceptions in the future. Of course there is no right or wrong about which class you 
            want to throw exception . It's all about reasonable and acceptable. */
        } finally {
            // do something
            // return response
        }
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?