Ohjelmointi

String.valueOf: n arvo

Useimmilla Java-kehittäjillä on todennäköisesti ollut täyte NullPointerExceptionista. Useimmat meistä ovat oppineet tietyn toiminnan arvon vähentämään "mahdollisuuksia" kohdata NullPointerException. Itse asiassa Wiki-sivu on omistettu NullPointerExceptionsin estämiselle tai vähentämiselle.

Useat ihmiset ovat esittäneet kielitukea mahdollisen nollan paremman ja helpomman käsittelyn puolesta. Näitä ovat Java SE 7 -ehdotukset, Optimized Null Check ja Kinga Dobolyin opinnäytetyö Java's Semantics of Null Pointer Excellions.

Niiden monien asioiden joukossa, joita voimme jo tehdä melko helposti vähentääkseen kohtaamisiamme NullPointerExceptionin kanssa, yksi erityisen helppo asia on käyttää String.valueOf (Object) tarvittaessa. String.valueOf (objekti) method, kuten sen Javadoc-luomassa dokumentaatiossa todetaan, palauttaa arvon "null", jos objektin välitys on tyhjä ja palauttaa tulokset välitetylle EsinetoString () -kutsu, jos siirretty Esine ei ole nolla. Toisin sanoen, String.valueOf (merkkijono) tekee tyhjän tarkistuksen puolestasi.

Käyttö String.valueOf (objekti) on erityisen hyödyllinen toteutettaessa merkkijono menetelmät mukautetuissa luokissa. Koska useimmat merkkijono toteutukset tarjoavat luokan datajäsenille merkkijonomuodon, String.valueOf (objekti) on luonnollinen istuvuus. Kaikki Java-objektit, jotka perustuvat Object-luokkiin, tarjoavat a toString () toteutus, vaikka se olisi vain heidän vanhempiensa (tai jopa Esine's) toString (). Kuitenkin, jos jäsenluokka toteuttaa merkkijono mutta jäsen itse on tyhjä eikä luokan esiintymä, niin toString () ei tee mitään hyvää (ja johtaa todella a NullPointerException soitettaessa).

Tämä osoitetaan seuraavalla esimerkkikoodilla.

StringHandlingExample.java

pakkaus pölyä.esimerkkejä; tuo java.io.IOException; tuo java.io.OutputStream; tuo java.util.logging.Logger; / ** * Esimerkkiluokka, joka osoittaa merkkijonoesitysten käytön * implicit Stringin, toStringin () ja String.valueOf: n () kautta. * / public class StringHandlingExample {private static final String NEW_LINE = System.getProperty ("line.separator"); / ** java.util.logging-sovelluksen käyttäminen. * / private static Logger LOGGER = Logger.getLogger (StringHandlingExample.class.getName ()); / ** * Päätoiminto testien / esittelyjen suorittamiseen. * * @param argumentit Komentoriviargumentit; kukaan ei ennakoinut. * / public static void main (viimeiset String [] -argumentit) {printHeader ("Suorien merkkijonojen merkkijonoesitys", System.out); lopullinen Henkilönimi henkilöNimi = uusi Henkilönimi ("Flintstone", nolla); System.out.println ("Henkilön nimi [SUORA]:" + henkilöNimi); System.out.println ("Henkilön nimi [TOSTRING]:" + henkilöNimi.toString ()); System.out.println ("Henkilön nimi [STRING.VALUEOF]:" + String.valueOf (henkilönNimi)); printBlankLine (System.out); printHeader ("Ei-nollakompleksisen objektin merkkijonoesitys", System.out); lopullinen henkilö henkilöYksi = uusi henkilö (henkilöNimi); System.out.println ("Henkilö Yksi [SUORA]:" + henkilöYksi); System.out.println ("Henkilö Yksi [TOSTRING]:" + personOne.toString ()); System.out.println ("Henkilö Yksi [STRING.VALUEOF]:" + Merkkijono.arvoOf (henkilöOne)); printBlankLine (System.out); printHeader ("Nollakompleksisen objektin merkkijonoesitys", System.out); viimeinen henkilö henkilö Kaksi = uusi henkilö (nolla); System.out.println ("Kaksi henkilöä [SUORA]:" + henkilöKaksi); System.out.println ("Henkilö Kaksi [TOSTRING]:" + henkilöTwo.toString ()); System.out.println ("Henkilö Kaksi [STRING.VALUEOF]:" + String.valueOf (henkilöTwo)); printBlankLine (System.out); } public static void printHeader (viimeinen merkkijonoviesti, lopullinen OutputStream out) {lopullinen merkkijono headerSeparator = "================================ ====================================== "; kokeile {out.write ((headerSeparator + NEW_LINE + viesti + NEW_LINE) .getBytes ()); out.write ((headerSeparator + NEW_LINE) .getBytes ()); } catch (IOException ioEx) {System.out.println (headerSeparator); System.out.println (viesti); System.out.println (headerSeparator); LOGGER.warning ("Otsikkotietoja ei voitu kirjoittaa toimitettuun OutputStreamiin."); }} public static void printBlankLine (final OutputStream out) {try {out.write (NEW_LINE.getBytes ()); } catch (IOException ioEx) {System.out.println (NEW_LINE); LOGGER.warning ("Tyhjää riviä ei voitu kirjoittaa annettuun OutputStreamiin."); }} / ** * luokka, johon soitetaan Stringille. * / staattinen staattinen luokka Henkilönimi {yksityinen merkkijono sukunimi; yksityinen merkkijono etunimi; public PersonName (viimeinen merkkijono newLastName, lopullinen merkkijono newFirstName) {sukunimi = newLastName; etunimi = uusi etunimi; } / ** * Esitä merkkijono. * * @return My String -esitys. * / @Override public String toString () {return firstName + "" + lastName; }} staattinen yksityisluokka Henkilö {yksityisen henkilönNimi; julkinen henkilö (lopullinen Henkilönimi uusiNimi) {nimi = uusiNimi; } / ** * Esitä merkkijono. * * @return My String -esitys. * / public String toString () {// Älä käytä - johtaa kääntäjän aikavirheeseen (yhteensopimattomat tyypit) // return name; // Älä käytä - voi johtaa ajonaikaisiin virheisiin (NullPointerException) // return name.toString (); // Se kaikki on hyvä tuotto String.valueOf (nimi); }}} 

Yllä olevaa koodia voidaan käyttää osoittamaan a merkkijono menetelmä monimutkaiselle objektille ja miten se käyttäytyy, kun sitä omistaa omistettu luokka. Kiinnostavin menetelmä on yllä olevan koodin alaosassa. Kaksi palautusarvoa kommentoidaan niihin liittyvien ongelmien takia. Viimeinen esimerkki String.valueOf (objekti) ei kommentoida, koska se toimii parhaiten joka kerta, kun se suoritetaan riippumatta kompleksista Henkilönimi objekti on tyhjä. Seuraavat kolme kuvaa näyttävät kunkin objektiesityksen Person-esineiden merkkijonoesitykset.

Merkkijonoarvo monimutkaisesta objektista - käännösaika-virhe

Merkkijonoarvo monimutkaisesta objektista toStringiin () - mahdollinen ajonaikainen NullPointerException

Merkkijonoarvo monimutkaisesta objektista String.valueOf () - Nullia käsitellään sulavasti

Käyttämällä String.valueOf (objekti) sisään toString () toteutukset voivat olla erityisen hyödyllisiä, koska käytämme usein toString () menetelmä virheenkorjauksessa ja viimeinen asia, jota tarvitsemme tällaisissa tapauksissa, on toinen poikkeus, joka kohdattiin yritettäessä nähdä tietojemme nykyinen tila. Tietenkin voidaan myös toteuttaa toString () menetelmät omilla tarkistuksilla nollaan, tai mikä vielä parempaa, voidaan käyttää jotain ToStringBuilderia. Kuitenkin saatavuus String.valueOf (objekti) on varmasti jotain, joka kannattaa pitää mielessä ja jota käytän melko usein. Monet meistä ovat huomanneet, että vähemmän koodirivejä on yleensä selkeämpi ja String.valueOf (objekti) voi olla paljon selvempi kuin nimenomaisen objektin nollan tarkistaminen ennen sen käyttämistä toString () toteutus.

Lopuksi String-luokka tarjoaa monia ylikuormitettuja valueOf-menetelmiä. Tämän blogikirjoituksen painopisteen (hyväksyy Object) version lisäksi muut valueOf: n ylikuormitetut versiot hyväksyvät primitiiviset tietotyypit ja primitiivisten tietotyyppien taulukot.

Johtopäätös

Huolimatta siitä, mitä tulevaisuus tuo mukanaan parannettu nollakäsittely Java-tilassa, voimme tänään käyttää monia taktiikoita vähentämään NullPointerExceptionin ei-toivottuja (joskus todella haluamme heitettäviä!) -Tapahtumia. Yksi näistä on käyttää String.valueOf (objekti) tarvittaessa.

Lisäresurssit

  • String.valueOf tai Integer.toString ()?
  • Täsmällinen versus implisiittinen toString-kutsu
  • String.valueOf () -menetelmän sisältävän merkkijonon arvo
  • Muunna numero merkkijonoksi

Tämän tarinan "String.valueOf arvo" julkaisi alun perin JavaWorld.