Memahami NumberFormatException di Java

1. Perkenalan

Java melontarkan NumberFormatException - pengecualian yang tidak dicentang - jika tidak dapat mengonversi String menjadi tipe angka.

Karena tidak dicentang, Java tidak memaksa kita untuk menangani atau mendeklarasikannya.

Dalam tutorial singkat ini, kami akan menjelaskan dan mendemonstrasikan apa yang menyebabkan NumberFormatException di Java dan cara menghindari atau menanganinya .

2. Penyebab NumberFormatException

Ada berbagai masalah yang menyebabkan NumberFormatException . Misalnya, beberapa konstruktor dan metode di Java menampilkan pengecualian ini.

Kami akan membahas sebagian besar di bagian di bawah ini.

2.1. Data Non-Numerik Diteruskan ke Pembuat

Mari kita lihat upaya untuk membangun objek Integer atau Double dengan data non-numerik.

Kedua pernyataan ini akan menampilkan NumberFormatException :

Integer aIntegerObj = new Integer("one"); Double doubleDecimalObj = new Double("two.2");

Mari kita lihat pelacakan tumpukan yang kita dapatkan ketika kita meneruskan input yang tidak valid "satu" ke konstruktor Integer di baris 1:

Exception in thread "main" java.lang.NumberFormatException: For input string: "one" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.(Integer.java:867) at MainClass.main(MainClass.java:11)

Ini melemparkan NumberFormatException . The Integer konstruktor gagal ketika mencoba untuk memahami masukan menggunakan parseInt () secara internal.

Java Number API tidak mengurai kata menjadi angka, jadi kita bisa mengoreksi kode hanya dengan mengubahnya menjadi nilai yang diharapkan:

Integer aIntegerObj = new Integer("1"); Double doubleDecimalObj = new Double("2.2");

2.2. Parsing Strings Berisi Data Non-Numerik

Mirip dengan dukungan Java untuk parsing dalam konstruktor, kami memiliki metode parse khusus seperti par seInt (), parseDouble (), valueOf () , dan decode () .

Jika kita mencoba dan melakukan jenis konversi yang sama dengan ini:

int aIntPrim = Integer.parseInt("two"); double aDoublePrim = Double.parseDouble("two.two"); Integer aIntObj = Integer.valueOf("three"); Long decodedLong = Long.decode("64403L");

Kemudian kita akan melihat jenis perilaku salah yang sama.

Dan, kami dapat memperbaikinya dengan cara yang serupa:

int aIntPrim = Integer.parseInt("2"); double aDoublePrim = Double.parseDouble("2.2"); Integer aIntObj = Integer.valueOf("3"); Long decodedLong = Long.decode("64403");

2.3. Meneruskan String Dengan Karakter Asing

Atau, jika kami mencoba mengonversi string menjadi angka dengan input data asing, seperti spasi atau karakter khusus:

Short shortInt = new Short("2 "); int bIntPrim = Integer.parseInt("_6000");

Kemudian, kami akan memiliki masalah yang sama seperti sebelumnya.

Kami dapat memperbaikinya dengan sedikit manipulasi string:

Short shortInt = new Short("2 ".trim()); int bIntPrim = Integer.parseInt("_6000".replaceAll("_", "")); int bIntPrim = Integer.parseInt("-6000");

Perhatikan di sini di baris 3 bahwa angka negatif diperbolehkan , menggunakan karakter tanda hubung sebagai tanda minus.

2.4. Format Angka Khusus Lokal

Mari kita lihat kasus khusus nomor khusus lokal. Di kawasan Eropa, koma mungkin mewakili tempat desimal. Misalnya, "4000,1" mungkin mewakili angka desimal "4000.1".

Secara default, kita akan mendapatkan NumberFormatException dengan mencoba mengurai nilai yang mengandung koma:

double aDoublePrim = Double.parseDouble("4000,1");

Kita perlu mengizinkan koma dan menghindari pengecualian dalam kasus ini. Untuk memungkinkan hal ini, Java perlu memahami koma di sini sebagai desimal.

Kami dapat mengizinkan koma untuk wilayah Eropa dan menghindari pengecualian dengan menggunakan NumberFormat .

Mari kita lihat beraksi menggunakan Lokal untuk Prancis sebagai contoh:

NumberFormat numberFormat = NumberFormat.getInstance(Locale.FRANCE); Number parsedNumber = numberFormat.parse("4000,1"); assertEquals(4000.1, parsedNumber.doubleValue()); assertEquals(4000, parsedNumber.intValue()); 

3. Praktik Terbaik

Mari membahas tentang beberapa praktik baik yang dapat membantu kita menangani NumberFormatException :

  1. Jangan mencoba untuk mengubah karakter alfabet atau khusus menjadi angka - Java Number API tidak dapat melakukannya.
  2. Kami mungkin ingin memvalidasi string input menggunakan ekspresi reguler dan membuang pengecualian untuk karakter yang tidak valid .
  3. Kita bisa membersihkan masukan dari masalah umum yang bisa diperkirakan dengan metode seperti trim () dan replaceAll () .
  4. Dalam beberapa kasus, karakter khusus yang dimasukkan mungkin valid. Jadi, kami melakukan pemrosesan khusus untuk itu, menggunakan NumberFormat, misalnya, yang mendukung berbagai format.

4. Kesimpulan

Dalam tutorial ini, kita membahas NumberFormatException di Java dan apa penyebabnya. Memahami pengecualian ini dapat membantu kami membuat aplikasi yang lebih tangguh.

Selanjutnya, kami mempelajari strategi untuk menghindari pengecualian dengan beberapa string input yang tidak valid.

Terakhir, kami melihat beberapa praktik terbaik untuk menangani NumberFormatException .

Seperti biasa, kode sumber yang digunakan dalam contoh dapat ditemukan di GitHub.