Programavimas

String.valueOf vertė

Daugelis „Java“ kūrėjų tikriausiai užpildė „NullPointerException“. Daugelis iš mūsų išmoko atlikti tam tikrus veiksmus, kad sumažintų „galimybes“ susidurti su „NullPointerException“. Iš tikrųjų yra „Wiki“ puslapis, skirtas „NullPointerExceptions“ prevencijai ar mažinimui.

Keli žmonės pasisakė už papildomą kalbų palaikymą, kad būtų galima geriau ir lengviau tvarkyti galimą nulį. Tai apima „Java SE 7“ pasiūlymus, „Optimized Null Check“ ir Kingos Dobolyi disertaciją „Java semantikos keitimas, kad būtų galima tvarkyti„ Null Pointer Excellions “.

Tarp daugelio dalykų, kuriuos jau galime padaryti gana lengvai, kad sumažintume susidūrimus su „NullPointerException“, vienas ypač paprastas dalykas yra prireikus pritaikyti String.valueOf (Object). String.valueOf (objektas) metodas, kaip teigiama jo „Javadoc“ sugeneruotoje dokumentacijoje, grąžina „null“, jei objekte perduota niekinis ir grąžina gautus rezultatus ObjektastoString () iškvietimas, jei perduodamas Objektas nėra niekinis. Kitaip tariant, String.valueOf (eilutė) atlieka tikrinimą už jus.

Panaudojimas String.valueOf (objektas) yra ypač naudinga įgyvendinant toString metodai pagal individualias klases. Nes dauguma toString diegimai pateikia klasės duomenų nariams „String“ formatą, String.valueOf (objektas) yra natūralus tinkamumas. Visi „Java“ objektai, pagrįsti „Objektą“ pratęsiančiomis klasėmis, pateikia a toString () įgyvendinimas, net jei tai yra tiesiog jų tėvų (ar net Objektass) programos įgyvendinimas toString (). Tačiau jei nario klasė įgyvendina toString bet pats narys yra niekinis, o ne klasės egzempliorius, tada toString () nedaro nieko gero (ir iš tikrųjų veda į „NullPointerException“ kai skambina).

Tai parodyta naudojant šį kodo pavyzdį.

StringHandlingExample.java

pakuotė dustin.pavyzdžiai; importuoti java.io.IOException; importuoti java.io.OutputStream; importuoti java.util.logging.Logger; / ** * Klasės pavyzdys, rodantis, kaip naudojami eilutės atvaizdai, pasiekiami naudojant * implicitinę eilutę, toString () ir String.valueOf (). * / public class StringHandlingExample {private static final String NEW_LINE = System.getProperty ("line.separator"); / ** Naudojant java.util.logging. * / private static Logger LOGGER = Logger.getLogger (StringHandlingExample.class.getName ()); / ** * Pagrindinė bandymų / demonstracijų vykdymo funkcija. * * @param argumentai Komandinės eilutės argumentai; niekas nenumatė. * / public static void main (final String [] argumentai) {printHeader ("Tiesioginių eilučių eilutė", System.out); galutinis asmenvardis asmenvardis = naujas asmenvardis ("Flintstone", nulis); System.out.println ("Asmens vardas [TIESIOGINIS]:" + asmens vardas); System.out.println ("Asmens vardas [TOSTRING]:" + asmens Vardas.toString ()); System.out.println ("Asmens vardas [STRING.VALUEOF]:" + String.valueOf (asmens vardas)); printBlankLine (System.out); printHeader ("Nulinio kompleksinio objekto eilutė", System.out); galutinis asmuo asmuo vienas = naujas asmuo (asmens vardas); System.out.println ("Pirmasis asmuo [TIESIOGINIS]:" + asmuoVienas); System.out.println ("Pirmasis asmuo [TOSTRING]:" + personOne.toString ()); System.out.println ("Pirmasis asmuo [STRING.VALUEOF]:" + String.valueOf (personOne)); printBlankLine (System.out); printHeader ("Nulinio kompleksinio objekto eilutė", System.out); galutinis asmuo asmuoDvi = naujas asmuo (nulis); System.out.println ("Antras asmuo [TIESIOGINIS]:" + asmuoDvi); System.out.println ("Antras asmuo [TOSTRING]:" + asmuoTwo.toString ()); System.out.println ("Antras asmuo [STRING.VALUEOF]:" + String.valueOf (personTwo)); printBlankLine (System.out); } public static void printHeader (final String message, final OutputStream out) {final String headerSeparator = "================================ ===================================== ""; pabandykite {out.write ((headerSeparator + NEW_LINE + message + NEW_LINE) .getBytes ()); out.write ((headerSeparator + NEW_LINE) .getBytes ()); } gaudyti (IOException ioEx) {System.out.println (headerSeparator); System.out.println (pranešimas); System.out.println (headerSeparator); LOGGER.warning ("Nepavyko užrašyti antraštės informacijos į pateiktą OutputStream."); }} public static void printBlankLine (final OutputStream out) {try {out.write (NEW_LINE.getBytes ()); } gaudyti (IOException ioEx) {System.out.println (NEW_LINE); LOGGER.warning ("Nepavyko parašyti tuščios eilutės į pateiktą OutputStream."); }} / ** * klasė, kuriai paskambinti į „Strings“. * / privati ​​statinė klasė PersonName {private String lastName; privati ​​eilutė firstName; public PersonName (final String newLastName, final String newFirstName) {pavardė = newLastName; firstName = newFirstName; } / ** * Pateikite eilutę man. * * @return Mano eilutė. * / @Paisyti viešąją eilutę toString () {return firstName + "" + lastName; }} privati ​​statinė klasė Asmuo {privataus asmensVardas; viešas asmuo (galutinis asmens vardas newName) {vardas = naujasName; } / ** * Pateikite eilutę man. * * @return Mano eilutė. * / public String toString () {// Nenaudoti - veda į kompiliatoriaus laiko klaidą (nesuderinami tipai) // grąžina vardą; // Nenaudoti - gali sukelti vykdymo laiko klaidą (NullPointerException) // return name.toString (); // Visa tai gera String.valueOf (vardas); }}} 

Aukščiau pateiktą kodą galima naudoti norint parodyti a toString metodas sudėtingam objektui ir kaip jis elgiasi, kai jį iškviečia turinti klasė. Labiausiai dominantis metodas yra aukščiau nurodyto kodo apačioje. Dvi grąžinimo vertės yra komentuojamos dėl su jomis susijusių problemų. Paskutinis pavyzdys, naudojant String.valueOf (objektas) NĖRA komentuojamas, nes jis veikia geriausiai kiekvieną kartą jį paleidus, nepaisant komplekso Asmens vardas objektas yra niekinis. Kituose trijuose paveikslėliuose rodoma kiekvieno iš šių objektų „String“ vaizdų pateikimo asmeniui išvestis.

Eilučių vertė iš sudėtingo objekto - kompiliavimo laiko klaida

Stygos vertė nuo sudėtingo objekto iki „Strings“ () - potencialus vykdymo laikas „NullPointerException“

Stygos vertė iš sudėtingo objekto String.valueOf () - Nullai tvarkomi grakščiai

Naudojant String.valueOf (objektas) į toString () diegimas gali būti ypač naudingas, nes dažnai naudojame toString () derinimo būdas ir paskutinis dalykas, kurio mums reikia tokiais atvejais, yra dar viena išimtis, su kuria susiduriama bandant pamatyti esamą mūsų duomenų būklę. Žinoma, galima ir įgyvendinti toString () metodus su savo pačių patikrinimais, ar nėra niekinių, arba, dar geriau, galima naudoti kažką panašaus į „ToStringBuilder“. Tačiau prieinamumas String.valueOf (objektas) tikrai verta nepamiršti ir tai, ką aš naudoju gana dažnai. Daugelis iš mūsų nustatė, kad mažiau kodo eilučių būtų aiškesnės ir aiškesnės String.valueOf (objektas) gali būti daug aiškiau, nei aiškiai prieš patikrinant, ar objekte nėra nulinės reikšmės, prieš pradedant jį naudoti toString () įgyvendinimas.

Galiausiai „String“ klasė pateikia daug perkrautų „valueOf“ metodų. Be versijos, kuri buvo šio tinklaraščio įrašo dėmesio dalis (priima objektą), kitos perkrautos „valueOf“ versijos priima primityvius duomenų tipus ir primityvių duomenų tipų masyvus.

Išvada

Nepaisant to, ką ateitis atneša tobulinto „Java“ valdymo požiūriu, šiandien galime naudoti daugybę taktikų, kad sumažintume „NullPointerException“ nepageidaujamus (kartais iš tikrųjų norime, kad jie būtų išmesti!) Atvejus. Vienas iš jų yra naudojimas String.valueOf (objektas) kai tinka.

Papildomi resursai

  • String.valueOf arba Integer.toString ()?
  • Aiškus ir netiesioginis „toString“ iškvietimas
  • Stringo su String.valueOf () metodo reikšmė
  • Konvertuoti skaičių į eilutę

Šią istoriją „String.valueOf vertė“ iš pradžių paskelbė „JavaWorld“.

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