Java khẳng định

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về câu lệnh khẳng định Java (Java khẳng định) với sự trợ giúp của các ví dụ.

Các xác nhận trong Java giúp phát hiện lỗi bằng cách kiểm tra mã mà chúng tôi cho là đúng.

Một khẳng định được thực hiện bằng cách sử dụng asserttừ khóa.

Cú pháp của nó là:

assert condition;

Đây, conditionlà một biểu thức boolean mà chúng tôi giả sử là đúng khi chương trình thực thi.

Bật xác nhận

Theo mặc định, các xác nhận bị tắt và bỏ qua trong thời gian chạy.

Để bật xác nhận, chúng tôi sử dụng:

java -ea:arguments

HOẶC

java -enableassertions:arguments

Khi các xác nhận được kích hoạt và điều kiện là true, chương trình sẽ thực thi bình thường.

Nhưng nếu điều kiện được đánh giá là falsetrong khi các xác nhận được bật, JVM sẽ ném một dấu AssertionErrorvà chương trình dừng ngay lập tức.

Ví dụ 1: Khẳng định Java

class Main {
  public static void main(String args[]) {
    String[] weekends = {"Friday", "Saturday", "Sunday"};
    assert weekends.length == 2;
    System.out.println("There are " + weekends.length + "  weekends in a week");
  }
}

Đầu ra

There are 3 weekends in a week

Chúng tôi nhận được kết quả ở trên vì chương trình này không có lỗi biên dịch và theo mặc định, các xác nhận bị vô hiệu hóa.

Sau khi bật xác nhận, chúng tôi nhận được kết quả sau:

Exception in thread "main" java.lang.AssertionError

Một dạng tuyên bố khẳng định khác

assert condition : expression;

Trong dạng câu lệnh khẳng định này, một biểu thức được chuyển tới hàm tạo của AssertionErrorđối tượng. Biểu thức này có một giá trị được hiển thị dưới dạng thông báo chi tiết của lỗi nếu điều kiện là false.

Thông báo chi tiết được sử dụng để nắm bắt và truyền thông tin về lỗi xác nhận để giúp gỡ lỗi vấn đề.

Ví dụ 2: Khẳng định Java với ví dụ về biểu thức

class Main {
  public static void main(String args[]) {
    String[] weekends = {"Friday", "Saturday", "Sunday"};
    assert weekends.length==2 : "There are only 2 weekends in a week";
    System.out.println("There are " + weekends.length + "  weekends in a week");
  }
}

Đầu ra

Exception in thread "main" java.lang.AssertionError: There are only 2 weekends in a week

Như chúng ta thấy từ ví dụ trên, biểu thức được chuyển cho hàm tạo của AssertionErrorđối tượng. Nếu giả định của chúng tôi là falsevà xác nhận được kích hoạt, một ngoại lệ sẽ được đưa ra với một thông báo thích hợp.

Thông báo này giúp chẩn đoán và sửa lỗi khiến xác nhận không thành công.

Bật xác nhận cho các lớp và gói cụ thể

Nếu chúng tôi không cung cấp bất kỳ đối số nào cho các công tắc dòng lệnh khẳng định,

java -ea

Điều này cho phép xác nhận trong tất cả các lớp ngoại trừ các lớp hệ thống.

Chúng ta cũng có thể kích hoạt xác nhận cho các lớp và gói cụ thể bằng cách sử dụng các đối số. Các đối số có thể được cung cấp cho các công tắc dòng lệnh này là:

Bật xác nhận trong tên lớp

Để kích hoạt xác nhận cho tất cả các lớp của chương trình Chính của chúng tôi,

java -ea Main

Để chỉ bật một lớp,

java -ea:AnimalClass Main

Điều này cho phép xác nhận chỉ AnimalClasstrong Mainchương trình.

Bật xác nhận trong tên gói

Để chỉ bật xác nhận cho gói com.animalvà các gói con của nó,

java -ea:com.animal... Main

Bật xác nhận trong các gói không có tên

Để kích hoạt xác nhận trong các gói không tên (khi chúng ta không sử dụng câu lệnh gói) trong thư mục làm việc hiện tại.

java -ea:... Main

Bật xác nhận trong các lớp hệ thống

Để bật xác nhận trong các lớp hệ thống, chúng tôi sử dụng một công tắc dòng lệnh khác:

java -esa:arguments 

HOẶC

java -enablesystemassertions:arguments

Các đối số có thể được cung cấp cho các công tắc này là giống nhau.

Tắt xác định

Để tắt xác nhận, chúng tôi sử dụng:

java -da arguments 

HOẶC

java -disableassertions arguments

Để tắt xác nhận trong các lớp hệ thống, chúng tôi sử dụng:

java -dsa:arguments

HOẶC

java -disablesystemassertions:arguments

Các đối số có thể được truyền trong khi tắt các xác nhận cũng giống như khi bật chúng.

Ưu điểm của Khẳng định

  1. Nhanh chóng và hiệu quả để phát hiện và sửa lỗi.
  2. Kiểm tra xác nhận chỉ được thực hiện trong quá trình phát triển và thử nghiệm. Chúng tự động bị xóa trong mã sản xuất trong thời gian chạy để không làm chậm quá trình thực thi chương trình.
  3. Nó giúp loại bỏ mã viết sẵn và làm cho mã dễ đọc hơn.
  4. Cơ cấu lại và tối ưu hóa mã với độ tin cậy cao hơn rằng nó hoạt động chính xác.

Khi nào sử dụng Assertions

1. Mã không thể truy cập

Mã không thể truy cập là mã không thực thi khi chúng tôi cố gắng chạy chương trình. Sử dụng các xác nhận để đảm bảo rằng các mã không thể truy cập thực sự không thể truy cập được.

Hãy lấy một ví dụ.

void unreachableCodeMethod() {
  System.out.println("Reachable code");
  return;
  // Unreachable code
  System.out.println("Unreachable code");
  assert false;
}

Hãy lấy một ví dụ khác về câu lệnh switch không có trường hợp mặc định.

switch (dayOfWeek) {
  case "Sunday":
    System.out.println("It’s Sunday!");
    break;
  case "Monday":
    System.out.println("It’s Monday!");
    break;
  case "Tuesday":
    System.out.println("It’s Tuesday!");
    break;
  case "Wednesday":
    System.out.println("It’s Wednesday!");
    break;
  case "Thursday":
    System.out.println("It’s Thursday!");
    break;
  case "Friday":
    System.out.println("It’s Friday!");
    break;
  case "Saturday":
    System.out.println("It’s Saturday!");
    break;
}

Câu lệnh switch ở trên chỉ ra rằng các ngày trong tuần chỉ có thể là một trong 7 giá trị trên. Không có trường hợp mặc định có nghĩa là lập trình viên tin rằng một trong những trường hợp này sẽ luôn được thực thi.

Tuy nhiên, có thể có một số trường hợp vẫn chưa được xem xét trong đó giả định thực sự là sai.

Giả định này nên được kiểm tra bằng cách sử dụng một xác nhận để đảm bảo rằng không đạt được trường hợp chuyển mạch mặc định.

default:
    assert false: dayofWeek + " is invalid day";

Nếu dayOfWeek có một giá trị khác với những ngày hợp lệ, một AssertionErrorsẽ được ném ra.

2. Lập hồ sơ các giả định

Để ghi lại các giả định cơ bản của họ, nhiều lập trình viên sử dụng các bình luận. Hãy lấy một ví dụ.

if (i % 2 == 0) {
    ...
} else { // We know (i % 2 == 1)
    ...
}

Sử dụng các xác nhận để thay thế.

Các nhận xét có thể lỗi thời và không đồng bộ khi chương trình phát triển. Tuy nhiên, chúng tôi sẽ buộc phải cập nhật các assertbáo cáo; nếu không, chúng cũng có thể thất bại đối với các điều kiện hợp lệ.

if (i % 2 == 0) {
   ...
} else {
    assert i % 2 == 1 : i;
    ...
}

Khi nào không sử dụng Assertions

1. Kiểm tra đối số trong các phương thức công khai

Đối số trong các phương thức công khai có thể được cung cấp bởi người dùng.

Vì vậy, nếu một khẳng định được sử dụng để kiểm tra các đối số này, các điều kiện có thể không thành công và dẫn đến kết quả là AssertionError.

Thay vì sử dụng các xác nhận, hãy để nó dẫn đến các ngoại lệ thời gian chạy thích hợp và xử lý các ngoại lệ này.

2. Để đánh giá các biểu thức ảnh hưởng đến hoạt động của chương trình

Không gọi các phương thức hoặc đánh giá các ngoại lệ mà sau này có thể ảnh hưởng đến hoạt động của chương trình trong các điều kiện khẳng định.

Chúng ta hãy lấy một ví dụ về một danh sách các ngày trong tuần chứa tên của tất cả các ngày trong một tuần.


ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));

ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));

assert weekdays.removeAll(weekends);

Ở đây, chúng tôi đang cố gắng xóa các phần tử Saturdayvà Sundaykhỏi các ngày trong tuần của ArrayList .

Nếu xác nhận được bật, chương trình hoạt động tốt. Tuy nhiên, nếu các xác nhận bị vô hiệu hóa, các phần tử từ danh sách sẽ không bị xóa. Điều này có thể dẫn đến lỗi chương trình.

Thay vào đó, hãy gán kết quả cho một biến và sau đó sử dụng biến đó để khẳng định.

ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));

ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));

boolean weekendsRemoved = weekdays.removeAll(weekends);
assert weekendsRemoved;

Bằng cách này, chúng tôi có thể đảm bảo rằng tất cả các ngày cuối tuần đều bị xóa khỏi các ngày trong tuần bất kể xác nhận được bật hay tắt. Nhờ vậy, nó không ảnh hưởng đến hoạt động của chương trình sau này.









Gõ tìm kiếm nhanh...