Nilai String.valueOf

Sebagian besar pengembang Java mungkin sudah puas dengan NullPointerException. Sebagian besar dari kita telah mempelajari nilai melakukan hal-hal tertentu untuk mengurangi "peluang" kita menghadapi NullPointerException. Memang, ada halaman Wiki yang didedikasikan untuk mencegah atau mengurangi NullPointerExceptions.

Beberapa orang berpendapat untuk dukungan bahasa tambahan untuk meningkatkan dan lebih mudah menangani potensi null. Ini termasuk proposal Java SE 7, Optimized Null Check, dan tesis Kinga Dobolyi Mengubah Semantik Java untuk Menangani Pengecualian Pointer Null.

Di antara banyak hal yang sudah bisa kita lakukan dengan cukup mudah untuk mengurangi pertemuan kita dengan NullPointerException, satu hal yang mudah dilakukan adalah menerapkan String.valueOf (Object) bila perlu. The String.valueOf(Object)metode, sebagai negara dokumentasi Javadoc dihasilkan nya, kembali "nol" jika disahkan pada objek adalah nulldan kembali hasil pada-in berlalu Object's toString () panggilan jika berlalu-in Objecttidak null. Dengan kata lain, String.valueOf(String)apakah nol memeriksa untuk Anda.

Penggunaannya String.valueOf(Object)sangat berguna saat mengimplementasikan toStringmetode pada kelas kustom. Karena sebagian besar toStringimplementasi menyediakan anggota data kelas dalam format String, String.valueOf(Object)secara alami cocok. Semua objek Java berdasarkan kelas yang memperluas Object menyediakan toString()implementasi meskipun itu hanya implementasi induknya (atau bahkan Object) toString(). Namun, jika kelas anggota mengimplementasikan toStringtetapi anggota itu sendiri adalah null daripada sebuah instance kelas, maka toString()tidak ada gunanya (dan sebenarnya mengarah ke NullPointerExceptionsaat dipanggil).

Ini ditunjukkan dengan kode contoh berikut.

StringHandlingExample.java

package dustin.examples; import java.io.IOException; import java.io.OutputStream; import java.util.logging.Logger; /** * Example class demonstrating use of String representations available through * implicit String, toString(), and String.valueOf(). */ public class StringHandlingExample { private static final String NEW_LINE = System.getProperty("line.separator"); /** Using java.util.logging. */ private static Logger LOGGER = Logger.getLogger( StringHandlingExample.class.getName()); /** * Main function for running tests/demonstrations. * * @param arguments Command-line arguments; none anticipated. */ public static void main(final String[] arguments) { printHeader("String representation of direct Strings", System.out); final PersonName personName = new PersonName("Flintstone", null); System.out.println("Person's Name [DIRECT]: " + personName); System.out.println("Person's Name [TOSTRING]: " + personName.toString()); System.out.println("Person's Name [STRING.VALUEOF]: " + String.valueOf(personName)); printBlankLine(System.out); printHeader("String representation of non-null complex object", System.out); final Person personOne = new Person(personName); System.out.println("Person One [DIRECT]: " + personOne); System.out.println("Person One [TOSTRING]: " + personOne.toString()); System.out.println("Person One [STRING.VALUEOF]: " + String.valueOf(personOne)); printBlankLine(System.out); printHeader("String representation of null complex object", System.out); final Person personTwo = new Person(null); System.out.println("Person Two [DIRECT]: " + personTwo); System.out.println("Person Two [TOSTRING]: " + personTwo.toString()); System.out.println("Person Two [STRING.VALUEOF]: " + String.valueOf(personTwo)); printBlankLine(System.out); } public static void printHeader(final String message, final OutputStream out) { final String headerSeparator = "===================================================================="; try { out.write((headerSeparator + NEW_LINE + message + NEW_LINE).getBytes()); out.write((headerSeparator + NEW_LINE).getBytes()); } catch (IOException ioEx) { System.out.println(headerSeparator); System.out.println(message); System.out.println(headerSeparator); LOGGER.warning("Could not write header information to provided OutputStream."); } } public static void printBlankLine(final OutputStream out) { try { out.write(NEW_LINE.getBytes()); } catch (IOException ioEx) { System.out.println(NEW_LINE); LOGGER.warning("Could not write blank line to provided OutputStream."); } } /** * Class upon which to call toString. */ private static class PersonName { private String lastName; private String firstName; public PersonName(final String newLastName, final String newFirstName) { lastName = newLastName; firstName = newFirstName; } /** * Provide String representation of me. * * @return My String representation. */ @Override public String toString() { return firstName + " " + lastName; } } private static class Person { private PersonName name; public Person(final PersonName newName) { name = newName; } /** * Provide String representation of me. * * @return My String representation. */ public String toString() { // Don't use -- leads to compiler time error (incompatible types) //return name; // Don't use -- can lead to runtime error (NullPointerException) //return name.toString(); // It's all good return String.valueOf(name); } } } 

Kode di atas dapat digunakan untuk mendemonstrasikan pembangunan toStringmetode pada objek kompleks dan bagaimana perilakunya ketika dipanggil oleh kelas pemilik. Metode yang paling menarik ada di bagian bawah kode yang ditunjukkan di atas. Dua nilai kembali dikomentari karena masalah yang terkait dengannya. Contoh terakhir, menggunakan String.valueOf(Object)TIDAK dikomentari karena ia bekerja paling baik setiap kali dijalankan terlepas dari apakah PersonNameobjek kompleks tersebut null atau tidak . Tiga gambar berikutnya menunjukkan output untuk masing-masing presentasi representasi String objek Person ini.

Nilai String dari Objek Kompleks - Kesalahan Waktu Kompilasi

Nilai String dari Objek Kompleks toString () - Potensi Waktu Proses NullPointerException

Nilai String dari Objek Kompleks String.valueOf () - Null Ditangani Dengan Baik

Menggunakan String.valueOf(Object)dalam toString()implementasi bisa sangat bermanfaat karena kita sering menggunakan toString()metode saat debugging dan hal terakhir yang kita perlukan dalam kasus seperti itu adalah pengecualian lain yang ditemui saat mencoba melihat status data kita saat ini. Tentu saja, seseorang juga dapat mengimplementasikan toString()metode dengan pemeriksaan sendiri untuk null atau, bahkan lebih baik, menggunakan sesuatu seperti ToStringBuilder. Namun, ketersediaannya String.valueOf(Object)tentu saja merupakan sesuatu yang perlu diingat dan merupakan sesuatu yang sering saya gunakan. Banyak dari kita telah menemukan lebih sedikit baris kode agar lebih jelas dan String.valueOf(Object)bisa jauh lebih jelas daripada secara eksplisit memeriksa suatu objek untuk null sebelum menjalankan toString()implementasinya.

Terakhir, kelas String menyediakan banyak metode valueOf yang kelebihan beban. Selain versi yang menjadi fokus postingan blog ini (menerima Objek), versi valueOf yang kelebihan beban lainnya menerima tipe data primitif dan array tipe data primitif.

Kesimpulan

Terlepas dari apa yang dibawa masa depan dalam hal penanganan null yang lebih baik di Java, ada banyak taktik yang dapat kita lakukan hari ini untuk mengurangi kejadian NullPointerException yang tidak diinginkan (terkadang kita benar-benar ingin mereka dilempar!). Salah satunya adalah untuk digunakan pada String.valueOf(Object)saat yang tepat.

Sumber daya tambahan

  • String.valueOf atau Integer.toString ()?
  • Panggilan toString secara eksplisit versus implisit
  • Nilai String dengan Metode String.valueOf ()
  • Ubah Angka menjadi String

Artikel ini, "Nilai String.valueOf" awalnya diterbitkan oleh JavaWorld.