Thứ Ba, 22 tháng 1, 2019

Khóa học 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ệ , Khóa học lập trình Java 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.

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 Khóa học lập trình Java.

Khóa học lập trình Java
Khóa học 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.

Ví dụ: Khóa học lập trình Java nếu bạn sử dụng lớp FileReader trong chương trình của mình để đọc dữ liệu từ một tệp, nếu tệp được chỉ định trong hàm tạo của nó không tồn tại, thì FileNotFoundException sẽ xảy ra và trình biên dịch sẽ nhắc lập trình viên xử lý ngoại lệ.
import java.io.File;
import java.io.FileReader;

public class FilenotFound_Demo {

   public static void main(String args[]) {  
      File file = new File("E://file.txt");
      FileReader fr = new FileReader(file); 
   }
}
Nếu bạn cố gắng biên dịch chương trình trên, bạn sẽ nhận được các ngoại lệ sau.

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

Lưu ý - Vì các phương thức read () và close () của lớp FileReader ném IOException, bạn có thể quan sát rằng trình biên dịch thông báo để xử lý IOException, cùng với FileNotFoundException.

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.

Ví dụ: Khóa học lập trình Java bạn đã khai báo một mảng có kích thước 5 trong chương trình của mình và cố gắng gọi phần tử thứ 6 của mảng thì xảy ra ArrayIndexOutOfBoundExceptionexception .
public class Unchecked_Demo {
   
   public static void main(String args[]) {
      int num[] = {1, 2, 3, 4};
      System.out.println(num[5]);
   }
}
Nếu bạn biên dịch và thực hiện chương trình trên, bạn sẽ nhận được ngoại lệ sau.

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 Khóa học lập 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 Khóa học lập trình 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 Ném được 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.

Sau đây là một mảng được khai báo với 2 phần tử. Sau đó, mã cố gắng truy cập vào phần tử thứ 3 của mảng sẽ đưa ra một ngoại lệ.

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 phù hợ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.

Đây là đoạn mã chỉ ra cách sử dụng nhiều câu lệnh try / Catch.
try {
   file = new FileInputStream(fileName);
   x = (byte) file.read();
} catch (IOException i) {
   i.printStackTrace();
   return -1;
} catch (FileNotFoundException f) // Not valid! {
   f.printStackTrace();
   return -1;
}

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

Kể từ Khóa học lập trình 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ệ.

Khóa học lập trình Java 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.
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class ReadData_Demo {

   public static void main(String args[]) {
      FileReader fr = null;  
      try {
         File file = new File("file.txt");
         fr = new FileReader(file); char [] a = new char[50];
         fr.read(a);   // reads the content to the array
         for(char c : a)
         System.out.print(c);   // prints the characters one by one
      } catch (IOException e) {
         e.printStackTrace();
      }finally {
         try {
            fr.close();
         } catch (IOException ex) {  
            ex.printStackTrace();
         }
      }
   }
}
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 Khóa học lập trình 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.

try(FileReader fr = new FileReader("file path")) {
   // use the resource
   } catch () {
      // body of catch 
   }
}

Sau đây là chương trình đọc dữ liệu trong một tệp bằng cách sử dụng câu lệnh try-with-resource.
importjava.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();
      }
   }
}
Các đ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 Khóa học lập trình 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.

// File Name InsufficientFundsException.java
import java.io.*;

public class InsufficientFundsException extends Exception {
   private double amount;
   
   public InsufficientFundsException(double amount) {
      this.amount = amount;
   }
   
   public double getAmount() {
      return amount;
   }
}
Để chứng minh bằng cách sử dụng ngoại lệ do người dùng định nghĩa của chúng tôi, lớp CheckingAccount sau đây chứa phương thức rút () ném ra một Insu enoughFundsException.
// File Name CheckingAccount.java
import java.io.*;

public class CheckingAccount {
   private double balance;
   private int number;
   
   public CheckingAccount(int number) {
      this.number = number;
   }
   
   public void deposit(double amount) {
      balance += amount;
   }
   
   public void withdraw(double amount) throws InsufficientFundsException {
      if(amount <= balance) {
         balance -= amount;
      }else {
         double needs = amount - balance;
         throw new InsufficientFundsException(needs);
      }
   }
   
   public double getBalance() {
      return balance;
   }
   
   public int getNumber() {
      return number;
   }
}
Chương trình BankDemo sau đây thể hiện việc gọi các phương thức tiền gửi () và rút tiền () của CheckingAccount.
// File Name BankDemo.java
public class BankDemo {

   public static void main(String [] args) {
      CheckingAccount c = new CheckingAccount(101);
      System.out.println("Depositing $500...");
      c.deposit(500.00);
      
      try {
         System.out.println("\nWithdrawing $100...");
         c.withdraw(100.00);
         System.out.println("\nWithdrawing $600...");
         c.withdraw(600.00);
      } catch (InsufficientFundsException e) {
         System.out.println("Sorry, but you are short $" + e.getAmount());
         e.printStackTrace();
      }
   }
}

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

Trong Khóa học lập trình 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...