Programmēšana

String.valueOf vērtība

Iespējams, ka lielākajai daļai Java izstrādātāju ir bijusi NullPointerException aizpildīšana. Lielākā daļa no mums ir iemācījušies noteiktu darbību veikšanas vērtību, lai samazinātu mūsu "iespējas" sastapties ar NullPointerException. Patiešām, ir Wiki lapa, kas paredzēta NullPointerExceptions novēršanai vai samazināšanai.

Vairāki cilvēki ir iebilduši par papildu valodas atbalstu, lai labāk un vieglāk rīkotos ar potenciālo nulli. Tie ietver Java SE 7 priekšlikumus, Optimized Null Check un Kinga Dobolyi tēzi Java semantikas maiņa, lai rīkotos ar nulles rādītāju izņēmumiem.

Starp daudzajām lietām, ko mēs jau varam darīt diezgan vienkārši, lai samazinātu mūsu tikšanos ar NullPointerException, viena īpaši vienkārša lieta, kas jādara, ir attiecīgā gadījumā lietot String.valueOf (Object). The String.valueOf (objekts) metode, kā norādīts tās Javadoc ģenerētajā dokumentācijā, atgriež "null", ja objektā nodotais ir nulle un atgriež rezultātus par nodoto Objektsizsauc toString (), ja ir ievadīts Objekts nav nulle. Citiem vārdiem sakot, String.valueOf (virkne) veic nulles pārbaudi jūsu vietā.

Pielietojums String.valueOf (objekts) ir īpaši noderīga, īstenojot toString metodes pielāgotajās klasēs. Jo lielākā daļa toString ieviešana nodrošina klases datu dalībniekus virknes formātā, String.valueOf (objekts) ir dabiski piemērots. Visi Java objekti, kuru pamatā ir klases, kas paplašina objektu, nodrošina a toString () ieviešana, pat ja tas ir vienkārši viņu vecāku (vai pat Objektss) programmas ieviešana toString (). Tomēr, ja dalībnieku klase īsteno toString bet pats dalībnieks ir nulle, nevis klases eksemplārs, tad toString () nedod neko labu (un faktiski noved pie NullPointerException kad viņu sauc).

To pierāda šāds koda piemērs.

StringHandlingExample.java

iepakojums dustin.piemēri; importēt java.io.IOException; importēt java.io.OutputStream; importēt java.util.logging.Logger; / ** * klases piemērs, kas parāda virkņu atveidojumu izmantošanu, kas pieejami, izmantojot * implicit String, toString () un String.valueOf (). * / public class StringHandlingExample {private static final String NEW_LINE = System.getProperty ("line.separator"); / ** Java.util.logging izmantošana. * / private static Logger LOGGER = Logger.getLogger (StringHandlingExample.class.getName ()); / ** * Galvenā funkcija testu / demonstrējumu veikšanai. * * @param argumenti Komandrindas argumenti; neviens nav paredzējis. * / public static void main (pēdējie String [] argumenti) {printHeader ("Tiešo virkņu virknes attēlojums", System.out); galīgais PersonName personName = jauns PersonName ("Flintstone", null); System.out.println ("Personas vārds [DIRECT]:" + personas vārds); System.out.println ("Personas vārds [TOSTRING]:" + personas Vārds.toString ()); System.out.println ("Personas vārds [STRING.VALUEOF]:" + String.valueOf (personas nosaukums)); printBlankLine (System.out); printHeader ("Nulles kompleksa objekta virknes attēlojums", System.out); galīgā Persona personaViens = jauna Persona (personasVārds); 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 ("Nulles kompleksa objekta virknes attēlojums", System.out); galīgā persona persona Divas = jauna persona (nulle); System.out.println ("Otrā persona [TIESAIS]:" + personaDivi); System.out.println ("Otrā persona [TOSTRING]:" + personTwo.toString ()); System.out.println ("Otrā persona [STRING.VALUEOF]:" + String.valueOf (personTwo)); printBlankLine (System.out); } public static void printHeader (pēdējais virknes ziņojums, galīgā OutputStream out) {galīgā virknes galveneSeparator = "================================ ===================================== ""; mēģiniet {out.write ((headerSeparator + NEW_LINE + ziņojums + NEW_LINE) .getBytes ()); out.write ((headerSeparator + NEW_LINE) .getBytes ()); } catch (IOException ioEx) {System.out.println (headerSeparator); System.out.println (ziņojums); System.out.println (headerSeparator); LOGGER.warning ("Nevarēja rakstīt galvenes informāciju sniegtajam OutputStream."); }} public static void printBlankLine (final OutputStream out) {try {out.write (NEW_LINE.getBytes ()); } catch (IOException ioEx) {System.out.println (NEW_LINE); LOGGER.warning ("Nevarēja ierakstīt tukšu rindu paredzētajā OutputStream."); }} / ** * Klase, uz kuru izsaukt toString. * / privāta statiskā klase PersonName {private String lastName; privāta virkne firstName; public PersonName (galīgā virkne newLastName, galīgā virkne newFirstName) {uzvārds = newLastName; firstName = newFirstName; } / ** * Norādiet man virkni. * * @return My String attēlojums. * / @ Pārvarēt publisko virkni toString () {return firstName + "" + lastName; }} privāta statiskā klase Persona {privātpersonasVārds; publiska persona (galīgais PersonName newName) {name = newName; } / ** * Norādiet man virkni. * * @return My String attēlojums. * / public String toString () {// Nelietot - noved pie kompilatora laika kļūdas (nesaderīgi veidi) // atgriešanās nosaukums; // Nelietot - var izraisīt izpildlaika kļūdu (NullPointerException) // return name.toString (); // Tas viss ir labs atgriešanās String.valueOf (nosaukums); }}} 

Iepriekš minēto kodu var izmantot, lai parādītu a toString metode sarežģītam objektam un kā tas izturas, kad to izsauc īpašnieka klase. Visinteresantākā metode ir iepriekš parādītā koda apakšdaļā. Divas atgriešanās vērtības tiek komentētas ar tām saistīto problēmu dēļ. Pēdējais piemērs, izmantojot String.valueOf (objekts) netiek komentēts, jo tas darbojas vislabāk katru reizi, kad tas tiek palaists neatkarīgi no tā, vai komplekss ir vai nav PersonName objekts nav derīgs. Nākamajos trīs attēlos ir parādīta katras šīs Person objektu virknes attēlojuma prezentācijas izeja.

Virknes vērtība no kompleksa objekta - sastādīšanas laika kļūda

Virknes vērtība no kompleksa objekta toString () - potenciāls izpildlaika NullPointerException

Virknes vērtība no kompleksa objekta String.valueOf () - Nulls tiek apstrādāts graciozi

Izmantojot String.valueOf (objekts) iekšā toString () ieviešana var būt īpaši izdevīga, jo mēs bieži izmantojam toString () atkļūdošanas metode, un pēdējais, kas mums šādos gadījumos vajadzīgs, ir vēl viens izņēmums, ar kuru mēs saskārāmies, mēģinot redzēt pašreizējo mūsu datu stāvokli. Protams, var arī īstenot toString () metodes ar savām pārbaudēm par nulli vai, vēl labāk, var izmantot kaut ko līdzīgu ToStringBuilder. Tomēr pieejamība String.valueOf (objekts) noteikti ir vērts paturēt prātā, un to es diezgan bieži izmantoju. Daudzi no mums ir atraduši mazāk koda rindiņu, lai tie būtu skaidrāki un String.valueOf (objekts) var būt daudz skaidrāks nekā skaidri pārbaudīt objekta nulli pirms tā izsaukšanas toString () ieviešana.

Visbeidzot, String klase nodrošina daudzas pārslogotas valueOf metodes. Papildus versijai, kas bija šī emuāra ziņojuma uzmanības centrā (pieņem objektu), pārējās pārslogotās ValueOf versijas pieņem primitīvu datu tipus un primitīvu datu tipu masīvus.

Secinājums

Neatkarīgi no nākotnes uzlabotās nulles apstrādes ziņā Java, šodien mēs varam izmantot daudzas taktikas, lai samazinātu NullPointerException nevēlamos gadījumus (dažreiz mēs patiešām vēlamies, lai tie tiktu izmesti!). Viens no tiem ir izmantot String.valueOf (objekts) attiecīgā gadījumā.

Papildu resursi

  • String.valueOf vai Integer.toString ()?
  • Nepārprotams pret netiešo toString izsaukumu
  • Metodes virknes vērtība ar virkni String.valueOf ()
  • Konvertēt skaitli uz virkni

Šo stāstu “String.valueOf vērtība” sākotnēji publicēja JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found