Lỗi java lang numberformatexception for input string null năm 2024
Hôm trước có ngồi uống nước với anh sếp, anh ý có hỏi mình một câu là “Đã biết cách Handle Exceptions trong java như nào chưa”. Thực sự trước giờ làm mình cũng không để ý cái này cho lắm nên khi bị hỏi thì mình trả lời như này “là xử lý ngoại lệ khi bắt gặp một lỗi phát sinh” “Xử lý như thế nào ?” anh ý hỏi tiếp, nhìn mặt mình chắc biết không trả lời được nên bảo về tìm hiểu. Sau một hồi tra google, tìm hiểu tài liệu thì mình đúc kết được 9 cách sau đây. Có thể không đầy đủ nhưng đây là thành quả mình tìm hiểu được 😀 Xư lý ngoại lệ trong java không phải là 1 vấn đề dễ dàng, nhất là đối với những người còn thiếu kinh nghiệm và mới bước vào nghề như mình. Theo mình tìm hiểu thì đa phần các nhóm phát triển đều có bộ quy tắc riêng và cách sử dụng chúng nên việc bài viết của mình có thể sẽ khác so với các quy tắc của các bạn đã làm trước đây. Tuy nhiên có một quy tắc được hầu hết các đội ngũ sử dụng, và bài viết này sẽ tổng hợp lại những cách mà bản thân mình đã tìm hiểu được. Trước tiên đi sâu vào tìm hiểu thì hãy thử trả lời 2 câu hỏi bên dưới : – Ngoại lệ là gì, và tại sao chúng ta cần xử lý ngoại lệ ? – Tại sao chúng ta lại cần chúng ? Sau khi trả lời thì chúng ta sẽ bắt đầu đi sâu vào việc nghiên cứu, tuy nhiên nếu các bạn không muốn trả lời 2 câu hỏi bên trên hoặc không biết câu trả lời thì các bạn có thể . Ok, Bắt đầu thôi nào 😀 -Giới thiệu và tóm tắt : Ngoại lệ là gì ? và xử lý ngoại lệ là gì ? Trước tiên đi sâu vào tìm hiểu thì chúng ta cần biết nó là gì và tại sao chúng ta cần phải xử lý nó. -Xác định ngoại lê : Cùng trả lời câu hỏi, ngoại lệ là gì ? – Hiểu một cách đơn giản ngoại lệ là tất cả các trường hợp bất thường trong quá trình thực thi chương trình. Một ngoại lệ xảy ra khi có sự cố, ví dụ như bạn mở 1 tệp tin mà nó không tồn tại hay là lấy giá trị từ 1 biến null. Và boommmm, 1 ngoại lệ đã xảy ra. Ngoại lệ là một thứ tồi tệ mà chúng ta phải giả định rằng nó sẽ xảy ra, nhưng trước khi nó xảy ra thì chúng ta cần phải xử lý nó. Xử lý ngoại lệ là một cơ chế xử lý lỗi, khi có lỗi xảy ra, một ngoại lệ sẽ được bắn ra. Và nếu chúng ta không xử lý nó một cách đúng đắn thì rất có thể chương trình của chúng ta sẽ bị lỗi và dẫn đến việc không thể tiếp tục hoạt động được nữa. Hoặc bạn có thể chọn việc xử lý ngoại lệ, thực hiện các bước để ngăn chương trình bị lỗi và tìm cách khôi phục chúng. Hoặc bạn có thể mặc kệ và để chương trình của bạn “chết” một cách nhẹ nhàng 😀 Mình nghĩ đa phần các bạn đã đọc được đến đây rồi thì không ai chọn cách thứ 2 đâu nhỉ. Ok tiếp tục nào… -Xử lý lỗi như trước đây: Như bạn đã đọc, xử lý ngoại lệ là một cơ chế xử lý lỗi, nhưng nó không phải là cơ chế duy nhất. Ngày nay, đại đa số các ngôn ngữ lập trình cung cấp xử lý ngoại lệ như một tính năng, nhưng mọi thứ luôn luôn theo cách này. Vậy làm như thế nào để các ngôn ngữ lập trình có thể đưa ra 1 quy tắc chung khi gặp lỗi. Một cách tiếp cận phổ biến là trả về mã lỗi. Chẳng hạn, giả sử bạn có hàm X chứa mảng số nguyên và một số nguyên duy nhất rồi tìm kiếm và trả về thứ tự của giá trị đầu tiên trong mảng được tìm thấy. Ví dụ: 1 mảng bao gồm 5 số nguyên {1,2,3,4,1} và bạn muốn tìm ra thứ tự của số 1. Trong mảng có 2 số 1 và đương nhiên thứ tự số 1 đầu tiên được tìm thấy sẽ là thự tự đầu tiên. Nhưng nếu bạn muốn tìm số 5 trong mảng trên, bạn sẽ làm gì khi không tìm được giá trị trong mảng trên, bạn sẽ trả về thứ tự là bao nhiều ? Một lựa chọn phổ biến sẽ là trả về -1 Cách tiếp cận này có ưu điểm là giữ cho các mã lỗi được thể hiện 1 cách rõ ràng, với mỗi lỗi sẽ có một mô tả lỗi khác nhau. Ví dụ như khi nhắc tới lỗi 404 là ai cũng sẽ biết là lỗi Not Found. Nhưng một nhược điểm của việc này là sự thiếu rõ ràng, ví dụ như khi trả về mã -5. Điều này có ý nghĩa là một số tập tin đã được tìm thấy. Nhưng tập tin nào ? Một mã lỗi không thể mô tả được điều này. Một cách khác thay cho việc trả về mã lỗi là bạn có thể trả về giá trị, điều này sẽ giúp việc mô tả lỗi được rõ ràng hơn. – Giải quyết các ngoại lệ Các trường hợp ngoại lệ xuất hiện để giải quyết các vấn đề mà bạn vừa đọc. Khi một ngoại lệ được ném ra, luồng điều khiển của chương trình bị gián đoạn. Nếu không ai xử lý ngoại lệ, nó sẽ khiến chương trình bị sập. Người dùng sẽ có thể nhìn thấy các ngoại lệ, và đương nhiên sẽ mang lại trải nghiệm không tốt cho người dùng. Không ai muốn việc đang lướt web mà tự nhiên một thông báo lỗi hiện ra che hết màn hình của họ cả. Vì vậy bạn sẽ muốn xử lý các ngoại lệ đó mặc dù nó chỉ là các lỗi rất nhỏ. Và để xử lý ngoại lệ thì chúng ta xử lý bằng cách bắt nó khi mà trương trình ném cho chúng ta 😀 Chúng ta làm việc này bằng sử dụng exception-handling block. Khi chúng ta bắt được một ngoại lệ, chúng ta sẽ điều khiển luồng xử lý của chương trình đến chỗ xử lý ngoại lệ và xử lý nó. Đọc thì thấy khó hiểu đúng không =)) Hãy đọc tiếp và chúng ta sẽ thấy những ví dụ cụ thể hơn. -Các ngoại lệ Java hoạt động như thế nào ? hãy nhìn vào ví dụ dưới đây
Đoạn mã trên in một số thông điệp vô thưởng vô phạt chỉ nói chúng thuộc dòng nào. Sau khi in dòng thứ ba, mã khởi tạo một mảng với ba số nguyên và truyền nó dưới dạng đối số cho một phương thức riêng. Phương thức này cố gắng in mục thứ tư trong mảng, mục thứ tư này không tồn tại, điều này khiến một ngoại lệ đã xảy ra: ArrayIndexOutOfBoundsException exception to be thrown. Khi điều đó xảy ra, việc thực thi chương trình bị dừng lại và thông báo ngoại lệ được hiển thị và các lệnh in ra sau đó sẽ không bao giờ được thực thi. đây là kết quả đầu ra
Bầy giờ chúng ta sẽ xử lý bằng việc thêm một số xử lý ngoại lệ vào.
Bây giờ, sau khi chạy đoạn code, đây là đầu ra chúng ta nhận được:
Lần này, ngoại lệ vẫn xảy ra, nhưng khác với bên trên. Chúng ta đã xử lý và chương trình không hề bị lỗi. Khi nói đến việc xử lý các trường hợp ngoại lệ trong Java, có nhiều điều hơn thế so với phần giới thiệu ngắn gọn của mình. Vì vậy các bạn có thể lick vào đây để tìm hiểu chi tiết hơn. Và không lan man nữa, dưới đây sẽ là 9 cách xử lý ngoại lệ mà mình sẽ giới thiệu với các bạn. Một vài lưu ý là có những câu mình sẽ để nguyên tiếng anh vì khi nếu dịch qua tiếng việt thì có thể sẽ không thể hiện được chính xác và đẩy đủ nội dung, tiếng anh của mình có hạn nên mình sẽ cố gắng hết sức =))) chỗ nào k đúng mọi người bỏ qua nhé. 1. Clean Up Resources in a Finally Block or Use a Try-With-Resource Statement Thì ý nghĩa câu trên hiểu đơn giản là bạn phải xử lý resource của bạn ở khối cuối cùng hoặc nên dùng với Try-With-Resource Lấy ví dụ cho dễ hiểu nhé, cùng nhìn xuống đoạn code bên dưới.
Đây là cách đơn giản để bạn có thể mở một file với inputStream. Nếu các bạn chưa biết inputStream là gì thì có thể ấn vào đây để đọc. Rồi sau khi mở file, thao tác với file thì điều tiếp theo là bạn phải đóng nó lại, điều này sẽ đúng và thực hiện ok một cách ngon lành nếu như không có bất kì 1 ngoại lệ nào được ném ra ngoài. Nhưng cuộc đời thì không phải lúc nào cũng dễ dàng như vậy. Chuyện gì sẽ xảy ra nếu như bạn mở 1 file mà file đó lại không tồn tại ? Và boom!!!, một ngoại lệ được ném ra và câu lệnh inputStream.close(); sẽ không được thực thi. Điều đó đồng nghĩa với việc luống của bạn sẽ không được đóng lại. Và đó là lý do vì sao bạn nên để câu lệnh inputStream.close(); ở khối cuối cùng và sử dụng try-with-resource để đảm bảo rằng kể cả file của bạn có không tồn tại đi nữa thì luồng của bạn chắc chắn vẫn sẽ được đóng lại. Use a Finally Block
Như đoạn code bên trên, thì cho dù có bất kì ngoại lệ nào được ném ra thì đoạn code thực thi đóng steam sẽ luôn được thực thi. The New Try-With-Resource Statement Một tùy chọn khác là sử dụng try-with-resource, bạn có thể sử dụng chúng khi bạn implements AutoCloseable interface. Đây được coi là một tiêu chuẩn của java. Khi bạn mở resource trong try clause , nó sẽ tự động bị đóng sau khi try block được thực thi hoặc một ngoại lệ được xử lý.
2. Prefer Specific Exceptions -Ở mục này thì mình sẽ nói rõ hơn về tầm quan trọng của việc mô tả ngoại lệ -Việc mô tả ngoại lệ càng chi tiết càng tốt, vì đơn giản là không phải ai cũng biết được code của bạn hoặc có thể là bạn trong vài tháng nữa. Khi ai đó sử dụng hoặc gọi tới hàm của bạn thì việc mô tả chi tiết 1 ngoại lệ mà hàm đó xử lý sẽ giúp tiết kiệm thời gian đọc và tránh những lỗi gặp phải. Do đó hay đảm bảo là bạn đã cung cấp một mô tả chi tiết cho việc này.
3. Document the Exceptions You Specify -Một cách mô tả nữa là sử dụng java doc Khi bạn xác định một ngoại lệ trong hàm của bạn, bạn cũng nên ghi lại nó trong Javadoc. Điều nay cũng có mục đích như bên trên, là cung cấp một mô tả chi tiết nhất cho người dùng sau đó để anh ta có thể tránh hoặc xử lý chúng một cách hợp lý. Vì vậy, hãy đảm bảo thêm một khai báo @throw vào Javadoc của bạn và để mô tả các tình huống có thể gây ra ngoại lệ.
try {
new Long("xyz");
} catch (NumberFormatException e) {
log.error(e);
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at com.company.Main.print4hItemInArray(Main.java:26)
at com.company.Main.main(Main.java:13)
First line
Second line
Third line
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at com.company.Main.print4hItemInArray(Main.java:26)
at com.company.Main.main(Main.java:13)
First line
Second line
Third line
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at com.company.Main.print4hItemInArray(Main.java:26)
at com.company.Main.main(Main.java:13)
First line
Second line
Third line
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at com.company.Main.print4hItemInArray(Main.java:26)
at com.company.Main.main(Main.java:13)
First line
Second line
Third line
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at com.company.Main.print4hItemInArray(Main.java:26)
at com.company.Main.main(Main.java:13)
First line
Second line
Third line
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at com.company.Main.print4hItemInArray(Main.java:26)
at com.company.Main.main(Main.java:13)
First line
Second line
Third line
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at com.company.Main.print4hItemInArray(Main.java:26)
at com.company.Main.main(Main.java:13)
First line
Second line
Third line
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at com.company.Main.print4hItemInArray(Main.java:26)
at com.company.Main.main(Main.java:13)
First line
Second line
Third line
` 7 Tóm Lại -Như bạn đã thấy, có rất nhiều điều khác nhau bạn nên xem xét khi bạn ném hoặc bắt một ngoại lệ. Hầu hết trong số chúng có mục tiêu cải thiện khả năng đọc code của bạn hoặc khả năng sử dụng API của bạn. -Các ngoại lệ thường là một cơ chế xử lý lỗi và một phương tiện truyền thông tại một thời điểm. -Do đó, bạn nên đảm bảo và thảo luận về các quy tắc tốt nhất về xử lý ngoại lệ Java mà bạn muốn áp dụng với đồng nghiệp để mọi người hiểu các khái niệm chung và sử dụng chúng theo cùng một cách. -Khi sử dụng Retrace APM với code profiling bạn có thể thu thập các ngoại lệ trực tiếp từ Java mà không có bất kỳ thay đổi mã nào! Bên trên là 9 cách mà mình đã tìm hiểu và tổng hợp lại, rất có thể nó sẽ không hoàn toàn đúng và đầy đủ. Vì vậy rất mong nhận được những lời đánh giá để các bài tiếp theo được hoàn thiện hơn. Cảm ơn mọi người |