Thứ Năm, 28 tháng 3, 2019

Lập trình Java - Ngoại lệ

Một ngoại lệ (hoặc sự kiện đặc biệt) là một vấn đề phát sinh trong quá trình thực hiện chương trình. Khi xảy ra Ngoại lệ , luồng bình thường của chương trình bị gián đoạn và chương trình / Ứng dụng chấm dứt bất thường, do đó không được khuyến nghị, do đó, các ngoại lệ này sẽ được xử lý.

Một ngoại lệ có thể xảy ra vì nhiều lý do khác nhau. Sau đây là một số tình huống trong đó một ngoại lệ xảy ra.

Học lập trình Java chuyên nghiệp
Học lập trình Java chuyên nghiệp

Một người dùng đã nhập dữ liệu không hợp lệ.

Một tập tin cần phải được mở không thể được tìm thấy.

Một kết nối mạng đã bị mất ở giữa các liên lạc hoặc JVM đã hết bộ nhớ.

Một số ngoại lệ này là do lỗi người dùng, một số khác là do lỗi lập trình viên và một số khác là do tài nguyên vật lý đã bị lỗi theo một cách nào đó.

>> Dựa trên những điều này, chúng tôi có ba loại Ngoại lệ. Bạn cần hiểu chúng để biết cách xử lý ngoại lệ hoạt động trong lập trình Java <<

Các ngoại lệ được kiểm tra - Một ngoại lệ được kiểm tra là một ngoại lệ được kiểm tra (thông báo) bởi trình biên dịch tại thời gian biên dịch, chúng cũng được gọi là ngoại lệ thời gian biên dịch. Những ngoại lệ này không thể đơn giản bỏ qua, lập trình viên nên quan tâm (xử lý) những ngoại lệ này.

C:\>javac FilenotFound_Demo.java
FilenotFound_Demo.java:8: error: unreported exception FileNotFoundException; must be caught or declared to be thrown
      FileReader fr = new FileReader(file);
                      ^
1 error

Các ngoại lệ không được kiểm tra - Một ngoại lệ không được kiểm tra là một ngoại lệ xảy ra tại thời điểm thực hiện. Chúng cũng được gọi là Ngoại lệ Thời gian chạy .

Chúng bao gồm các lỗi lập trình, chẳng hạn như lỗi logic hoặc sử dụng API không đúng cách. Ngoại lệ thời gian chạy được bỏ qua tại thời điểm biên dịch.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
 at Exceptions.Unchecked_Demo.main(Unchecked_Demo.java:8)

Lỗi - Đây hoàn toàn không phải là ngoại lệ, mà là những vấn đề phát sinh ngoài tầm kiểm soát của người dùng hoặc lập trình viên.

Lỗi thường bị bỏ qua trong mã của bạn vì bạn hiếm khi có thể làm bất cứ điều gì về lỗi. Ví dụ: nếu xảy ra tràn ngăn xếp, sẽ xảy ra lỗi. Chúng cũng bị bỏ qua tại thời điểm biên dịch.

Phân cấp ngoại lệ


Tất cả các lớp ngoại lệ là các kiểu con của lớp java.lang.Exception. Lớp ngoại lệ là một lớp con của lớp Ném được. Khác với lớp ngoại lệ, còn có một lớp con khác gọi là Lỗi xuất phát từ lớp Ném được.

Lỗi là các điều kiện bất thường xảy ra trong trường hợp thất bại nghiêm trọng, chúng không được xử lý bởi các chương trình Java. Lỗi được tạo để chỉ ra lỗi được tạo bởi môi trường thời gian chạy. Ví dụ: JVM hết bộ nhớ. Thông thường, các chương trình không thể phục hồi từ các lỗi.

Lớp Exception có hai lớp con chính: lớp IOException và lớp RuntimeException.

Sau đây là danh sách các Ngoại lệ tích hợp sẵn được kiểm tra và không được kiểm tra phổ biến nhất của Java .

Phương pháp ngoại lệ


Sau đây là danh sách các phương thức quan trọng có sẵn trong lớp Ném được.
Sr.Không.Phương pháp & Mô tả
1chuỗi công khai getMessage ()

Trả về một thông điệp chi tiết về ngoại lệ đã xảy ra. Thông báo này được khởi tạo trong hàm tạo có thể ném được.
2công khai Có thể ném được Nguyên nhân ()

Trả về nguyên nhân của ngoại lệ như được đại diện bởi một đối tượng Ném được.
3chuỗi công khai toString ()
Trả về tên của lớp được nối với kết quả của getMessage ().
4công khai void printStackTrace ()

In kết quả của toString () cùng với dấu vết ngăn xếp sang System.err, luồng đầu ra lỗi.
5công khai StackTraceEuity [] getStackTrace ()

Trả về một mảng chứa mỗi phần tử trên dấu vết ngăn xếp. Phần tử tại chỉ mục 0 đại diện cho đỉnh của ngăn xếp cuộc gọi và phần tử cuối cùng trong mảng biểu thị phương thức ở dưới cùng của ngăn xếp cuộc gọi.
6công khai FillableStInTrackTrace ()

Điền vào dấu vết ngăn xếp của đối tượng Có thể ném này bằng dấu vết ngăn xếp hiện tại, thêm vào bất kỳ thông tin nào trước đó trong theo dõi ngăn xếp.

Bắt ngoại lệ

Một phương thức bắt một ngoại lệ bằng cách sử dụng kết hợp các từ khóa thửvà bắt . Một khối thử / bắt được đặt xung quanh mã có thể tạo ra ngoại lệ.

Mã trong khối try / Catch được gọi là mã được bảo vệ và cú pháp sử dụng try / Catch trông giống như sau


try {
   // Protected code
} catch (ExceptionName e1) {
   // Catch block
}

Mã có xu hướng ngoại lệ được đặt trong khối thử. Khi một ngoại lệ xảy ra, ngoại lệ đó xảy ra được xử lý bởi khối bắt liên kết với nó. Mỗi khối thử phải được theo dõi ngay lập tức bằng khối bắt hoặc khối cuối cùng.

Một tuyên bố bắt liên quan đến việc khai báo loại ngoại lệ bạn đang cố gắng nắm bắt. Nếu một ngoại lệ xảy ra trong mã được bảo vệ, khối bắt (hoặc khối) theo sau thử được kiểm tra. 

Nếu loại ngoại lệ xảy ra được liệt kê trong khối bắt, ngoại lệ được truyền cho khối bắt nhiều vì một đối số được truyền vào tham số phương thức.
Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block

Nhiều khối bắt

Một khối thử có thể được theo sau bởi nhiều khối bắt. Cú pháp cho nhiều khối bắt giống như sau

try {
   // Protected code
} catch (ExceptionType1 e1) {
   // Catch block
} catch (ExceptionType2 e2) {
   // Catch block
} catch (ExceptionType3 e3) {
   // Catch block
}

Các báo cáo trước đây cho thấy ba khối bắt, nhưng bạn có thể có bất kỳ số nào trong số chúng sau một lần thử. 

Nếu một ngoại lệ xảy ra trong mã được bảo vệ, ngoại lệ được ném vào khối bắt đầu tiên trong danh sách. Nếu kiểu dữ liệu của ngoại lệ được ném khớp với ExceptionType1, nó sẽ bị bắt ở đó. Nếu không, ngoại lệ chuyển xuống câu lệnh bắt thứ hai.

Điều này tiếp tục cho đến khi ngoại lệ bị bắt hoặc rơi qua tất cả các lần bắt, trong trường hợp đó phương thức hiện tại dừng thực thi và ngoại lệ được ném xuống phương thức trước đó trong ngăn xếp cuộc gọi.

Bắt nhiều loại ngoại lệ


Kể từ Java 7, bạn có thể xử lý nhiều hơn một ngoại lệ bằng một khối bắt đơn, tính năng này giúp đơn giản hóa mã. Đây là cách bạn sẽ làm điều đó

catch (IOException|FileNotFoundException ex) {
   logger.log(ex);
   throw ex;

Từ khóa ném / ném

Nếu một phương thức không xử lý một ngoại lệ được kiểm tra, phương thức đó phải khai báo nó bằng cách sử dụng từ khóa ném . Từ khóa ném xuất hiện ở cuối chữ ký của phương thức.

Bạn có thể ném một ngoại lệ, một ngoại lệ mới được khởi tạo hoặc một ngoại lệ mà bạn vừa bắt được, bằng cách sử dụng từ khóa throw .

Cố gắng hiểu sự khác biệt giữa ném và ném từ khóa, ném được sử dụng để trì hoãn việc xử lý một ngoại lệ được kiểm tra và ném được sử dụng để gọi một ngoại lệ một cách rõ ràng.

Phương thức sau đây tuyên bố rằng nó ném RemoteException
import java.io.*;
public class className {

   public void deposit(double amount) throws RemoteException {
      // Method implementation
      throw new RemoteException();
   }
   // Remainder of class definition
}
Một phương thức có thể tuyên bố rằng nó ném nhiều hơn một ngoại lệ, trong trường hợp đó, các ngoại lệ được khai báo trong một danh sách được phân tách bằng dấu phẩy.

Ví dụ: phương thức sau đây tuyên bố rằng nó ném RemoteException và Insu enoughFundsException
import java.io.*;
public class className {

   public void withdraw(double amount) throws RemoteException, 
      InsufficientFundsException {
      // Method implementation
   }
   // Remainder of class definition
}

Khối cuối cùng

Khối cuối cùng theo sau một khối thử hoặc một khối bắt. Một khối mã cuối cùng luôn luôn thực thi, bất kể sự xuất hiện của Ngoại lệ.

Sử dụng một khối cuối cùng cho phép bạn chạy bất kỳ câu lệnh loại dọn dẹp nào mà bạn muốn thực thi, bất kể điều gì xảy ra trong mã được bảo vệ.

Một khối cuối cùng xuất hiện ở cuối các khối bắt và có cú pháp sau

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
First element value: 6
The finally statement is executed

Lưu ý những điều sau

Một mệnh đề bắt không thể tồn tại mà không có câu lệnh try.

Không bắt buộc phải có các mệnh đề cuối cùng bất cứ khi nào có khối thử / bắt.

Khối thử không thể có mặt mà không có mệnh đề bắt hoặc mệnh đề cuối cùng.

Bất kỳ mã nào cũng không thể xuất hiện ở giữa các khối thử, bắt, cuối cùng.

Các tài nguyên thử


Nói chung, khi chúng tôi sử dụng bất kỳ tài nguyên nào như luồng, kết nối, v.v., chúng tôi phải đóng chúng một cách rõ ràng bằng cách sử dụng khối cuối cùng. Trong chương trình sau, chúng tôi đang đọc dữ liệu từ một tệp bằng FileReader và chúng tôi sẽ đóng nó bằng cách sử dụng khối cuối cùng.

try-with-resource , còn được gọi là quản lý tài nguyên tự động , là một cơ chế xử lý ngoại lệ mới được giới thiệu trong Java 7, tự động đóng các tài nguyên được sử dụng trong khối thử bắt.

Để sử dụng câu lệnh này, bạn chỉ cần khai báo các tài nguyên cần thiết trong ngoặc đơn và tài nguyên đã tạo sẽ được đóng tự động ở cuối khối. Sau đây là cú pháp của câu lệnh try-with-resource.
import java.io.FileReader;
import java.io.IOException;

public class Try_withDemo {

   public static void main(String args[]) {
      try(FileReader fr = new FileReader("E://file.txt")) {
         char [] a = new char[50];
         fr.read(a);   // reads the contentto the array
         for(char c : a)
         System.out.print(c);   // prints the characters one by one
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}
Những điểm sau đây cần được ghi nhớ trong khi làm việc với tuyên bố thử tài nguyên.

Để sử dụng một lớp với câu lệnh try-with-resource, nó nên triển khai giao diện AutoClosizable và phương thức close () của nó được gọi tự động khi chạy.

Bạn có thể khai báo nhiều hơn một lớp trong câu lệnh try-with-resource.

Trong khi bạn khai báo nhiều lớp trong khối thử của câu lệnh try-with-resource, các lớp này được đóng theo thứ tự ngược lại.

Ngoại trừ việc khai báo tài nguyên trong ngoặc đơn, mọi thứ đều giống như khối thử / bắt thông thường của khối thử.

Tài nguyên được khai báo trong try được khởi tạo ngay trước khi bắt đầu khối thử.

Tài nguyên được khai báo tại khối thử được khai báo ngầm là cuối cùng.

Ngoại lệ do người dùng xác định

Bạn có thể tạo các ngoại lệ của riêng bạn trong Java. Hãy ghi nhớ các điểm sau đây khi viết các lớp ngoại lệ của riêng bạn

Tất cả các ngoại lệ phải là một đứa trẻ của Ném.

Nếu bạn muốn viết một ngoại lệ được kiểm tra được thực thi tự động bởi Quy tắc Xử lý hoặc Khai báo, bạn cần mở rộng lớp Ngoại lệ.

Nếu bạn muốn viết một ngoại lệ thời gian chạy, bạn cần mở rộng lớp RuntimeException.

Chúng ta có thể định nghĩa lớp Exception của riêng mình như dưới đây

class MyException extends Exception {
}

Bạn chỉ cần mở rộng lớp Exception được xác định trước để tạo Exception của riêng bạn. Đây được coi là ngoại lệ được kiểm tra.

Lớp Insu enoughFundsException sau đây là một ngoại lệ do người dùng định nghĩa mở rộng lớp Exception, làm cho nó trở thành một ngoại lệ được kiểm tra.

Một lớp ngoại lệ giống như bất kỳ lớp nào khác, chứa các trường và phương thức hữu ích.

Depositing $500...

Withdrawing $100...

Withdrawing $600...
Sorry, but you are short $200.0
InsufficientFundsException
         at CheckingAccount.withdraw(CheckingAccount.java:25)
         at BankDemo.main(BankDemo.java:13)

Trường hợp ngoại lệ phổ biến

Trong Java, có thể định nghĩa hai nguồn cung cấp Ngoại lệ và Lỗi.

Các ngoại lệ JVM - Đây là các ngoại lệ / lỗi được JVM độc quyền hoặc logic. Ví dụ: NullPulumException, ArrayIndexOutOfBoundException, ClassCastException.

Các ngoại lệ lập trình - Các ngoại lệ này được các ứng dụng hoặc lập trình viên API ném ra một cách rõ ràng. Ví dụ: IllegalArgumentException, IllegalStateException.

Không có nhận xét nào:

Đăng nhận xét

Lập trình Java - Ngoại lệ

Một ngoại lệ (hoặc sự kiện đặc biệt) là một vấn đề phát sinh trong quá trình thực hiện chương trình. Khi xảy ra Ngoại lệ , luồng bình thường...