Cách gỡ lỗi Java như một chuyên gia

Bài viết gốc: https://niithanoi.edu.vn/cach-go-loi-java.html

Hơn 50% thời gian lập trình viên dùng để gỡ lỗi. Hôm nay, mình sẽ hướng dẫn bạn gỡ lỗi Java như một “Chiên gia” – Khoa học – Hiệu quả và đỡ Đau đầu hơn.

Thông thường chúng ta viết chương trình Java gặp những lỗi về mặt cú pháp, câu lệnh, khá là nhiều hơn là về mặt lỗi logic mà chúng ta không thể thấy khi build project.

Đây là vấn đề gặp phải khi bạn chạy thuật toán, hay đơn giản là chạy phần mềm nhưng kết quả không giống như ý mình, dù không có bất kỳ lỗi cú pháp nào.
Debugging Tool!

Đúng vậy một công cụ mạnh mẽ để debug (gỡ lỗi) chương trình. Vậy bug là gì? Và debug là cái gì?

Bug là ám chỉ các lỗi xảy ra trong logic, hay bất kỳ vấn đề gì gây ra việc làm cho ứng dụng không thực thi được hay thực thi sai.

Bug có thể xuất hiện bất cứ mọi nơi.

Debug là quá tình tìm ra lỗi hay nguyên nhân gây ra lỗi (where is bug) để có hướng sửa lỗi (fix bug).

Có nghĩa là bạn có thể chạy từng dòng code. Xem kỹ càng cách nó hoạt động. Cụ thể như thế nào nhỉ thì sang phần tiếp nhé.

1. Các cách gỡ lỗi Java như một lập trình viên chuyên nghiệp

Công cụ Debugging có thể thực thi từng dòng mã và phân tích mã, các giá trị của các biến được đưa vào và xem biến này có giá trị bao nhiêu tại thời điểm dòng code đó thực thi.

Ở đây mình sẽ giới thiệu các bạn Debugging Tool của Eclipse nhé.

1.1. Làm sao để mở trình Debugger trên Eclipse?

Thật ra thì có nhiều cách để mở trình gỡ lỗi trong Eclipse. Bạn có thể chạy trình gỡ lỗi bằng cách chọn vào Run → Debug (F11)

Mở trình Debug trên Eclipse

Mở trình Debug trên Eclipse
Sau khi mở debug bạn sẽ thấy giao diện như bên dưới:

Giao diện trình gỡ lỗi trên Eclipse

Giao diện trình gỡ lỗi trên Eclipse
Một vài phần mà bạn cần lưu ý:

  • Debug Windows: Bên trái,  class đang mở, trong đó lớp gỡ lỗi được hiển thị.
  • Class: Đây là class mà bạn muốn gỡ lỗi.
  • Variable: Phần này là bạn có thể xem các biến và trạng thái của chúng thay đổi trong quá trình thực thi. Bằng cách nhấp chuột phải vào các biến được hiển thị ở đây, bạn có thể thực hiện nhiều thao tác trên chúng như thay đổi hoặc xem loại dữ liệu của tụi nó,….
  • Breakpoint: Trong phần này, bạn có thể thay đổi điểm dừng (giải thích thêm). Từ đây bạn có thể thực hiện các thao tác nâng cáo trên các điểm dừng như xác định các điều kiện trên chúng.
  • Console: Đây là nơi bạn có thể thấy những gì mà chương trình đang chạy.

Bây giờ chúng ta đã có trình sửa lỗi, hãy bắt đầu gỡ lỗi nào.

Nếu bạn chạy mã thực thi trực tiếp tại thời điểm này, nó sẽ chạy hoàn toàn và dừng lại khi nó xảy ra ngoại lệ.

Tuy nhiên, bạn có muốn dừng lại khi nó vào mảng và từ đó bạn muốn chạy mọi dòng mã bằng cách thủ công không.

1.2. The Breakpoint (Điểm dừng)

Để kiểm soát thủ công chương trình trong thời gian bạn thực thi, bạn cần một cái gọi là Breakpoint (Điểm dừng).

Điểm dừng là một cách để thông báo cho trình gỡ lỗi từ nơi bạn muốn kiểm soát code của mình.

Áp dụng điểm dừng rất đơn giản nhưng nó khá quan trọng đấy.

Trên dòng nơi bạn muốn dừng, nhấp đúp vào lề trái, một vòng tròng màu xanh được tạo cạnh bên dòng như hình dưới đây:

Thiết lập Breakpoint hỗ trợ gỡ lỗi trên Eclipse

Thiết lập Breakpoint hỗ trợ gỡ lỗi trên Eclipse
Nếu bạn click chuột phải vào vòng tròn màu xanh đó, bạn sẽ có tùy chọn chuyển đổi (thêm điểm dừng) hoặc tắt điểm dừng.

Bạn cũng có thể đặt một điểm dừng bằng cách đặt con trỏ chuột vào chỗ bạn muốn và nhấn tổ hợp phím SHIFT + CTRL + B

Ở đây mình đã đặt điểm dừng ở đầu vòng lặp vì nếu bạn thấy ngoại lệ mà mình nhận được thì nằm bên trong vòng lặp này, do đó bạn cần đặt điểm dừng này ở khối code nơi mà bạn đang gặp lỗi.

Xong rồi.

Chạy Code trong chế độ Debug thôi nào.

Bây giờ, chương trình của mình đã có trình debug và đã đặt ở các điểm cần thiết, mình có thể chạy code ở chế độ gỡ lỗi.

Để chạy code trong chế độ gỡ lỗi, bạn có thể làm như sau:

Click vào Icon được hiển thị như bên dưới:

Chạy code Java trong chế độ gỡ lỗi 1

Chạy code Java trong chế độ gỡ lỗi
Hoặc Click chuột phải vào tên lớp nằm trong Project Explorer và click Debug As → Java Application.

Chạy code Java trong chế độ gỡ lỗi 2

Khi bạn chạy ứng dụng ở chế độ gỡ lỗi, cửa sổ sau sẽ hiển thị.

Cửa sổ hỗ trợ gỡ lỗi Java trên Eclipse

Cửa sổ hỗ trợ gỡ lỗi Java trên Eclipse
Bạn có thể thấy, dòng mà điểm dừng đang được chọn nó được tô màu và thực thi dòng đó và dừng việc thực thi tại dòng đó.

Bạn có thể xác nhận điều này bởi vì câu lệnh trước dòng đó được thực thi ở màn hình console.

Tuy nhiên, câu lệnh bên trong vòng lặp không được in ra.

Bạn có thể thấy các biến có giá trị cho đến khi thực thi dòng này.

Nếu bạn mở rộng biến mảng arr, thì bạn có thể thấy các giá trị trong đó.

Giá trị của các biến trong chế độ gỡ lỗi

Giá trị của các biến trong chế độ gỡ lỗi
Theo cách này, chúng ta có thể thấy giá trị của bất kỳ biến nào trong chế độ gỡ lỗi.

2. Các tùy chọn trong chế độ Debug trên Eclipse

Eclipse cung cấp sẵn một số tùy chọn để giúp bạn gỡ lỗi Java hiệu quả hơn tùy theo nhu cầu.

Tùy chọn #1: Step Into (F5)

Tùy chọn này cũng có sẵn như biểu tượng hiển thị bên dưới.

Tùy chọn hỗ trợ gỡ lỗi Java: F5

Tùy chọn hỗ trợ gỡ lỗi Java: F5
Sử dụng nó, bạn có thể chạy mã ở dòng đang ở và chuyển sang dòng tiếp theo.

Click và nó và code sẽ hiển thị như sau:

Sử dụng tùy chọn gỡ lỗi F5 - 1

Nếu bạn di chuột vào biến i trên dòng code này, thì bạn sẽ thấy giá trị của nó ở hai vị trí:

Sử dụng tùy chọn gỡ lỗi F5 - 2

Vì chúng ta cần điều hướng qua vòng lặp cho đến hết, bạn cần nhấn F5 lần nữa.

Ngay khi bạn làm điều đó, nó thực thi dòng 9 và quay trở lại dòng 7, do đó bạn có thể thấy giá trị đầu tiên của mảng được in trong bảng điều khiển.

Sử dụng tùy chọn gỡ lỗi F5 - 3

Khi bạn tiếp tục nhấn F5, bạn sẽ thấy giá trị của biến i thay đổi và các giá trị mảng được in trên console cho đến khi xảy ra ngoại lệ.

Tại thời điểm ngoại lệ thì code sẽ không lấy bất kỳ dữ liệu nào từ mảng nữa, nó sẽ thông báo nguồn không thể tìm thấy.

Điều này đặc trưng cho lỗi này và đối với các lỗi khác nhau, bạn có thể nhận được các loại thông báo khác nhau, tuy nhiên, bạn sẽ tìm thấy dòng code nào bị break.

Tùy chọn #2: Step over of (F6)

Lựa chọn này cũng có sẵn như biểu tượng bên dưới.

Tùy chọn hỗ trợ gỡ lỗi Java: F6

Tùy chọn hỗ trợ gỡ lỗi Java: F6
Sử dụng lựa chọn này bạn có thể bỏ qua trình gỡ lỗi thực thi code.

Trong trường hợp này, code sẽ được thực thi bình thường cho đến khi bạn tiếp tục nhấn F6 và khi đến dòng cuối cùng, bạn sẽ có ngoại lệ như bạn vẫn gặp khi thực thi bình thường.

Tùy chọn hỗ trợ gỡ lỗi Java F6 - 2

Tùy chọn #3: Step out of Step return (F7)

Lựa chọn này có thể được sử dụng khi code của bạn đang ở trong một phương thức và đang được gọi từ một nơi khác.

Khóa này sẽ kết thúc việc thực thi phương thức được gỡ lỗi và trở về mã từ phương thức này được gọi.

Điều này cũng có thể được thực hiện bằng cách nhấp vào biểu tượng bên dưới.

Tùy chọn hỗ trợ gỡ lỗi Java F7

Tùy chọn hỗ trợ gỡ lỗi Java F7

Tùy chọn #4: Resume or F8

Lựa chọn này sẽ báo cho trình gỡ lỗi tiếp tục thực hiện chương trình cho đến khi đạt điểm dừng tiếp theo.

Biểu tượng của tính năng này trên Eclipse như sau:

Tùy chọn hỗ trợ gỡ lỗi Java F8

Tùy chọn hỗ trợ gỡ lỗi Java F8
Nắm được tất các tùy chọn này thì bạn đã có thể Debug hiệu quả hơn rất nhiều đấy.

Bonus #1: Mẹo gỡ lỗi Java đơn giản mà nhiều người hay bỏ qua

Có một vấn đề thường gặp của các bạn mới học lập trình là, khi gặp lỗi, việc đầu tiên của bạn là xem lại chương trình ngay lập tức.

Sau đó chạy đi chạy lại cầu mong xem nó có chạy được không.

Tiếp đến là loay hoay Google, hỏi anh em bạn bè.

Nói chung là chưa gì đã loạn cả lên.

Để giải quyết vấn đề này thì cũng không có gì cao siêu cả.

Kinh nghiệm của mình là: Luôn ĐỌC THÔNG BÁO LỖI trước khi thực hiện bất kỳ hành động nào.

Các IDE / trình duyệt hiện nay đều hỗ trợ tính năng thông báo lỗi rất tốt. Vì thế, chỉ cần đọc kỹ thông báo thì cơ hội sửa lỗi thành công của bạn đã thành công hơn 50% rồi.

Còn các lỗi thuộc vấn đề logic, do bạn code sai, dự án lớn, chạy được mà không ra đúng… thì mới cần các bước như mình vừa giới thiệu ở trên.

Bonus #2: Mẹo gỡ lỗi Java sử dụng vịt cao su

Mẹo gỡ lỗi Java sử dụng Vịt cao su

Mẹo gỡ lỗi Java sử dụng Vịt cao su
THẬT ĐẤY!!!!

Để thực hiện cách gỡ lỗi này bạn sử dụng một con vịt cao su, cố gắng trình bày tình huống bạn gặp phải, giải thích từng dòng, từng dòng code cho con vịt cao su hiểu.

Mô tả thật kỹ càng vấn đề và cả các giải pháp bạn đã thử.

Phương pháp này tên tiếng Anh là Rubber Duck Debugging, bạn có thể đọc thêm về nó trên Wiki.

Nghe khá là buồn cười phải không? 😀

Nhưng không.

Sử dụng vịt cao su là phương pháp hỗ trợ gỡ lỗi được rất nhiều lập trình viên trên thế giới áp dụng.

Ý nghĩa sâu xa trong giải pháp này là: Tự trò chuyện với chính bản thân mình.

Bởi vì lỗi sinh ra từ sai lầm của bạn.

Do đó, nói chuyện với một con vịt cao su và cố gắng giải thích cho nó (một con vật vô tri) hiểu đồng nghĩa với việc bạn đang cố gắng hệ thống hóa lại tình huống và đơn giản hóa nó cho chính bạn.

Chúc mừng bạn đã biết cách gỡ lỗi như một lập trình viên chuyên nghiệp

Tuy nhiên chỉ biết cách để gỡ lỗi thì không đủ. Quan trọng nhất là bạn cần phải có phần kiến thức về Java cơ thật vững.

Các công cụ hỗ trợ gỡ lỗi Java chỉ giúp bạn tìm ra chỗ sai, còn tại sao nó sai và sửa sai như thế nào thì đó là việc của bạn.

> Vì thế, mình luôn khuyên các bạn học viên tham gia KHÓA HỌC JAVA bên mình luyện tập căn bản thật tốt, debug thì mở to mắt ra. Không chỉ học trên lớp mà còn phải tự học, tự rèn luyện thật nhiều, tìm cách tạo ra lỗi và hiểu cách chương trình chạy sai.

Bởi vì “BUG EVERY WHERE”.

Phần lớn thời gian làm việc của chúng ta là tìm và gỡ lỗi.

Các công việc khác cũng đa phần là lặp đi lặp lại. Bạn sẽ nhanh chóng chán nếu làm mà chẳng có lỗi nào.

Có lỗi đồng nghĩa với bạn đang sai ở chỗ nào đó, sửa được lỗi đồng nghĩa với việc hoàn thiện thêm. Nó có tính thử thách, và thử thách thì luôn kích thích và cảm thấy thỏa mãn khi sửa thành công.

Trên đây là đôi dòng tâm sự về sự nghiệp “Đì Bấc” hi vọng bạn sẽ có thêm một chút kinh nghiệm để gỡ lỗi Java tốt hơn.

Chúc bạn thành công.

Bài viết gốc: https://niithanoi.edu.vn/cach-go-loi-java.html

Leave a Reply

Your email address will not be published. Required fields are marked *