[Bài 18] Lỗi NullPointerException và cách debug trên Eclipse | GiangTester Blog

Trước khi đi vào phần Debug thì mình sẽ viết nốt cái cách mình fix vấn đề ở bài 16 – Đó là việc sử dụng dụng API selenium trực tiếp từ class Test Case. Nếu bạn nào không đọc bài viết trước của mình thì mình có thể tóm tắt lại nội dung như sau:

Mình có 1 test case: sau khi tạo xong 1 bài viết sẽ so sánh cái title của bài viết mình đã tạo vào title của post đó ngoài Front-end xem có đúng ko. 

Cũng giống như các phần khác, mình sẽ tạo ra 1 class cho post ở site Front-end, gọi là PostDetail.

public class PostDetailPage {
	WebDriver driver;

	public PostDetailPage(WebDriver driver) {
		this.driver = driver;
	}
	
	public String getPostTitle() {
		String titlePost = driver.findElement(By.tagName("h1")).getText();
		return titlePost;
	}
}

Sau đó mình sửa lại class Test Case:

Ok rồi, run thử phát. Và đây là cái mình nhận được.

Mình cá là các bạn mới học Selenium mà lập trình chưa vững thì ít nhất cũng đã một lần mắc cái lỗi này. Vậy thì lỗi nào là gì và cách fix ra sao?

NullPointerException là một exception được định nghĩa trong Java, nó thể hiện rằng ta đang sử dụng 1 Object mà nó ko có vị trí nào trên bộ nhớ (null). Và như các bạn nhìn thấy ở trên, đây ko phải là loại lỗi syntax để mà IDE có thể báo lỗi cho mình. Do đó mình cần phải sử dụng cách khác.

Cách fix: Tìm xem cái Object đang bị null nằm ở đâu và fix cho nó hết null. =))))

Bước 1: Tìm Object bị null.

Theo hình ở trên, thì lỗi xảy ra ở dòng thứ 26, nơi sử dụng dòng lệnh Assert kết quả.

Bắt đầu tiến hành Debug:

  • Đặt 1 Break Point ở dòng thứ 26 bằng cách DoubleClick chuột trái.

  • Ở trong dòng thứ 26 này chỉ có 1 Object được sử dụng là Object của class PostDetailPage và Object chỉ đang sử dụng method getPostTitle().
    —> Tiếp tục đặt Break Point ở dòng lệnh bên trong method.

  • Thực hiện run ở chế độ Debug trên Eclipse:

Run ở chế độ Debug thực ra cũng không khác run ở chế độ Run code bình thường, điểm khác duy nhất là hệ thống sẽ dừng lại ở điểm mà ta đặt Break Point.

Giả sử luồng code: A –> B –> C –> D –> E

Nếu C và D là 2 điểm mà ta đặt Break Point thì C là điểm đầu tiên mà hệ thống sẽ dừng lại. Ở tại vị trí này ta có thể xem được các Object ở tại thời điểm này đang có id là bao nhiêu, các biến thì có giá trị như thế nào.

Khi đến chạy đến điểm Break Point đầu tiên, Eclipse sẽ hiển thị thông báo xem chúng ta có muốn hiển thị Layout ở chế độ Debug hay ko? —> Ấn OK luôn. Bạn nào thích thì check luôn vào box “Remember my decision” để lần sau ko bị hỏi lại.

Ở chế độ Debug có những điểm sau cần chú ý:

  • Bảng điều khiển

  1. Resume: Thực hiện tiếp code cho đến hết.
  2. Suspend: Pause lại và giữ nguyên hiện trạng
  3. Terminate: Chấm dứt hẳn phiên debug.
  4. Step into: Nhảy đến cái dòng code tiếp theo trong luồng run code (step by step)
  5. Step Over: Nhảy đến Break Point tiếp theo. Nếu không có Break Point thì nó sẽ run hết function hiện tại trong 1 lượt rồi dừng lại ở function kế tiếp.
  6. Step Return: Khi ra không còn muốn debug step by step nữa, ta muốn nó run toàn bộ cái function trong 1 lần cho đến thời điểm function đó return kết quả.
  • Khu vực code và xem giá trị của các Object và biến hiện tại:

Nhìn vảo bảng giá trị các Object, ta dễ dàng có thể nhận ra postDetailPg đang null

Bước 2: Cách sửa Object bị null.

Ta có thể có nhiều nguyên nhân của việc null này nhưng ta có thể khoanh vùng lại 2 khả năng:

  • Chưa có hàm khởi tạo (constructor)

Cái này bỏ qua vì ta đã có hàm khởi tạo cho nó rồi. (Nhìn lên đoạn code ở phía đầu bài viết)

  • Chưa khởi tạo Object

Hiện tại đúng là chưa có dòng code khởi tạo Object thật, mới chỉ có khai báo biến. Ta add thêm 1 dòng code khởi tạo Object là xong. Run và thấy xanh lè. 😀

Sau khi fix xong bug, muốn trở lại Layout code như bình thường, ấn vào icon Java ở góc phải của Eclipse.

Tóm tắt lại quy trình Debug nói chung:

  1. Dựa vào Stack Trace / Log –> tìm dòng code lỗi.
  2. Đặt Break Point tại dòng code đó và 1 số dòng code trong các function mà dòng code lỗi có sử dụng.
  3. Sử dụng bảng điều khiển linh hoạt để đến được vị trí mình cần hoặc mình nghĩ là sẽ có lỗi.
  4. Theo dõi giá trị các Object và các biến tại từng thời điểm
  5. Tìm ra nguyên nhân gốc rồi fix.

Đôi khi ta không cần dùng đến chức năng Debug để tìm nguyên nhân do nó quá hiển nhiên. Nhưng ta nên tập debug vì Debug sẽ mô tả luồng code chạy, ta sẽ hiểu hơn về ngôn ngữ và check xem framework đã chạy đúng ý ta chưa.

Trên đây là cách mình Debug Java, bạn nào có cách nào hay hơn hoặc thấy mình sai ở đâu đấy, vui lòng comment xuống phía dưới. Thank you!