Pertanyaan Integer.parseInt dan NumberFormatException di Android


Saya menjalankan kode berikut di aplikasi Android saya

Integer.parseInt("+91");

Di Android 5.0 (Lollipop), itu tidak buang pengecualian apa pun sebagai +91 adalah bilangan bulat. Tetapi dalam Android 4.4.x (KitKat) dan versi lebih rendah yang dilemparkan:

NumberFormatException: Invalid Int: "+91"

Bagaimana versi Android menyebabkan perbedaan ini?


43
2018-05-06 08:38


asal


Jawaban:


Dukungan untuk eksplisit + telah ditambahkan ini berkomitmen:

Support explicit + in Byte, Short, Integer, Long.

Bug: 5239391
Change-Id: I2b25228815d70d570d537db0ed9b5b759f25b5a3

yang sudah termasuk mulai dengan android-5.0.0_r1. Jika Anda telah mengambil repositori Git, Anda dapat memverifikasi dengan:

git tag --contains 6b40837ee3a023bba698c38fd6d6e46ae0065a55

yang memberi Anda

android-5.0.0_r1
android-5.0.0_r2
android-5.0.0_r3
...

Meskipun dokumentasi dapat memberikan wawasan Mengapa perubahan dilakukan (untuk mencapai perilaku Java 7 seperti yang ditunjukkan oleh jawaban lainnya), menganalisis sejarah kode sumber memberikan jawaban yang paling akurat untuk kapan perilaku berubah, karena dokumentasi tidak selalu sesuai dengan implementasi.


45
2018-05-06 08:48



Perilaku ini sebenarnya bagian dari Java 7, sebagai dokumen negara:

Mengurai argumen string sebagai integer desimal bertanda tangan. Karakter   dalam string semuanya harus berupa digit desimal, kecuali yang pertama   karakter dapat berupa tanda minus ASCII '-' ('\ u002D') untuk menunjukkan a   nilai negatif atau tanda ASCII plus '+' ('\ u002B') untuk menunjukkan a   nilai positif.

Namun, di Java 6 hanya - simbol diterima.

Android SDK 21+ memiliki dependensi JDK7, yang mungkin mengapa Anda mengalami perilaku ini.


23
2018-05-06 08:45



Ia bekerja setelah Java 7.

Android 5 memperkenalkan fitur parseInt baru seperti versi Java 7 - Jawaban Martin Nordholts persis menunjukkan revisi

Jadi ini berarti bahwa Lollipop Anda menggunakan SDK yang lebih baru berdasarkan Java 7 yang memiliki metode parseInt dengan bagian penanganan tanda juga.

KitKat memang memperkenalkan beberapa fitur java 7 ke Android sdk 19, tapi bukan parseInt baru. Versi yang lebih rendah menggunakan implementasi sebelumnya dari parseInt (versi Java 6) sehingga mereka jelas akan gagal juga.


Perbedaan antara implementasi parseInt:   Dokumentasi Java 6 parseInt vs Dokumentasi Java 7 parseInt


10
2018-05-06 08:43



Ini adalah masalah khusus Java. Seperti yang Anda lihat di dokumentasi, Java 6 memungkinkan - dan Java 7 memungkinkan + atau -.

Dengan Android Versi 19 (KitKat) Java 7 didukung, jadi Anda tidak mendapatkan kesalahan ini. Saya sarankan untuk tidak menggunakannya +, karena Anda hanya perlu tanda jika Anda memiliki bilangan bulat negatif.


5
2018-05-06 08:56