StringBuilder null-ga "null" sifatida qo'shiladi

Qanaqasiga?

    StringBuilder sb = new StringBuilder();

    sb.append("Hello");
    sb.append((String)null);
    sb.append(" World!");
    Log.d("Test", sb.toString());

Ishlab chiqaradi

06-25 18: 24: 24.354: D/viktorina (20740): Hellonull Jahon!

null string qo'shib qo'yish umuman qo'shilmasligini kutmoqdamiz!
BTW, StringBuilder.append() da juda ko'p yuklangan versiyalarga ega bo'lgani uchun String ga o'tish kerak.

Bu erda nuqta qo'yish uchun kodni soddalashtirdim, kodimga bir satrni qaytaradigan usul keldi

public String getString() { ... }
...
sb.append(getString());
...

getString() sometimes returns null; now I have to test it if I want to use a StringBuilder!!!!

Bundan tashqari, bu erda mening savolimga aniqlik kiritaylik: qanday qilib oqilona tarzda null mag'lubiyatni qabul qilish va "null" literal mag'lubiyatga o'tkazmaslik uchun StringBuilder.append() ni qanday qilib olishim mumkin?
Chiroyli qilib aytadigan bo'lsam, stringni olishni xohlamayman, null bo'lsa sinov qiling va faqat uni qo'shing. Men oqlangan onelinerni izlayapman.

5
qo'shib qo'ydi muallif Stephen C, manba

10 javoblar

How come?

Its clearly written in docs

Jarayon argumentining belgilari, ushbu qator uzunligini dalil uzunligi bo'yicha oshirish uchun qo'shiladi. Agar str bo'sh bo'lsa, unda to'rtta "null" belgisi qo'shiladi.

Shuning uchun iltimos, ilova oldin nol nazoratni qo'ying.

5
qo'shib qo'ydi
OK, u hujjatlarda yozilgan. Ammo, bu faqat men uchun juda qarshi. Null mag'lubiyatni mavjud bo'lmagan mag'lubiyat ekanligini bilib oldim. Muhokamani ochmasdan, men nima uchun bunday qilishni bilmayman. Hozir men boshimni stolga urayotgan edim.
qo'shib qo'ydi muallif ilomambo, manba
@LastFreeNickname Bir satr null bo'lsa, men hech narsa ko'rmoqchi emasman/istamayman. Agar nosozlik qilgichni ishlatsam, o'zgarmaydiganni tekshirib, qiymatini null sifatida ko'rishni xohlayman. Ilgari professor algebra kursida bo'sh bir to'siqni, hech qanday element yo'q, null simvolga o'xshash bo'lganini ko'rsatish uchun maxsus ramz mavjudligini aytdi. Null mag'lubiyat uchun biror narsani ko'rsatish null bilan bir xil ta'riflarga mos kelishini buzadi. Lekin bu to'kilgan sutga yig'lab yubordi, bir kun nima sababli o'rganishni umid qilaman.
qo'shib qo'ydi muallif ilomambo, manba
Siz bo'sh va bo'sh Stringni chalg'itayotgan deb o'ylayman. Siz aytganda (String) bo'shlik String domeni "null" bilan ifodalanuvchi mavjud bo'lmagan String. Boshqa tomondan bo'sh satr "" ajablanarli tarzda "" vakili bor. " Siz ba'zi bir String o'zgaruvchisini disk raskadrovka qilsangiz yoki chop qilsangiz, aslida nullga ishora qilayotganini ko'rishni istaysiz, shuning uchun mantiqiy bo'ladi.
qo'shib qo'ydi muallif LastFreeNickname, manba

Bu xuddi shunday. null kodi "null" sifatida qo'shiladi. Xuddi shunday, System.out.println (null) bilan null ni bosganingizda "null" ni bosasiz.

getString() null uchun mag'lubiyatga olib keladigan usuldan qochishning usuli:

public String getString() {
    ...
    if (result == null) {
        return "";
    }
}
4
qo'shib qo'ydi

EDIT
My previous answer was not reflecting the appropriate reason for such behaviour of StringBuilder as asked by OP. Thanks to @Stephen C for pointing out that

Null String qo'shmaslik umuman kutilmaydi!

Biroq, bu qo'shilmoqda. StringBuilder kabi xatti-harakatlarning sababi AbstractStringBuilder # append (string str) bizni olib boruvchi append (Object obj) > Quyidagi tarzda aniqlangan usul:

public AbstractStringBuilder append(String str) {
    if (str == null) str = "null"; -->(1)
    //.......
    return this;
}

Agar String kiritmalari bo'sh bo'lsa, unda "String" literal "null" deb o'zgartirilsa va keyinchalik ishlov berilsa, aniq aniqlanadi.

Qanday StringBuilder.append() ni oqilona tarzda null mag'lubiyatga qabul qilish va uni "null" literal mag'lubiyatga aylantirmaslik uchun olsam bo'ladi.

String kodini null uchun ochiq tekshiring va keyin davom eting. Misol uchun:

String s = getString();
StringBuffer buf = new StringBuffer();
//Suppose you want "Hello "" world"
buf.append("Hello ");
buf.append(s==null?" world" : s+" world");
2
qo'shib qo'ydi
Ayniqsa, JLS bu uchun aniq emas. JLS aslida "+" operatorining semantikasini aniqlaydi. StringBuilder.append (null) kerakli xatti-harakatni amalga oshiradigan qulay tasodif ekanligini ta'kidlashingiz mumkin. (Bu tasodif emasligiga aminman, lekin siz mening fikrimcha ...)
qo'shib qo'ydi muallif Stephen C, manba
@StephenC: Ha, sen haqsan ... Men xato qilaman
qo'shib qo'ydi muallif Vishal K, manba

Buning sababi shundaki, null siz buni tushunganingizdek bo'sh String emas. Bo'sh string yangi string (""); bo'lishi mumkin. Odatda append() usuli null parametr sifatida null qiymatini qo'shsa "null" ga qo'shiladi.

2
qo'shib qo'ydi
"Men mavjud bo'lmagan mag'lubiyat" deb aytdim "bo'sh mag'lubiyat"
qo'shib qo'ydi muallif ilomambo, manba

Bu siz uchun ishlaydi

public static String getString(StringBuilder sb, String str) {
    return sb.append(str == null ? "" : str).toString();
}
1
qo'shib qo'ydi

AbstractStringBuilder class appends an object through String.valueOf(obj) method which in turn converts NULL into string literal "null". Therefor there is no inbuilt method to help you here. You have to either use ternary operator within append method or write a utility method to handle it, as others suggested.

1
qo'shib qo'ydi

Xuddi shunday foydali usul yozish kabi

public static void appendString(StringBuilder sb, String st) {
    sb.append(st == null ? "" : st);
}

yoki bu uch tomonlama operator juda qulay.

0
qo'shib qo'ydi

StringBuilder uchun dekorativni ham yozishingiz mumkin, u siz xohlagan narsani tekshiradi:

class NotNullStringBuilderDecorator {

    private StringBuilder builder;

    public NotNullStringBuilderDecorator() {
        this.builder = new StringBuilder();
    }

    public NotNullStringBuilderDecorator append(CharSequence charSequence) {
        if (charSequence != null) {
            builder.append(charSequence);
        }

        return this;
    }

    public NotNullStringBuilderDecorator append(char c) {
        builder.append(c);

        return this;
    }

    //Other methods if you want

    @Override
    public String toString() {
        return builder.toString();
    }
}

Foydalanish namunasi:

NotNullStringBuilderDecorator sb = new NotNullStringBuilderDecorator();
sb.append("Hello");
sb.append((String) null);
sb.append(" World!");

System.out.println(sb.toString());

Ushbu echim bilan siz POJO sinflarini o'zgartirmaysiz.

0
qo'shib qo'ydi
String nullString = null;
StringBuilder sb = new StringBuilder();
sb.append("Hello");
if (nullString != null) sb.append(nullString);
sb.append(" World!");
Log.d("Test", sb.toString());

Mana! Bir satrda qildim :)

0
qo'shib qo'ydi
:-) Hech qanday savol juda oqlangan :-)
qo'shib qo'ydi muallif ilomambo, manba

Bir qatormi?

sb.append((getString()!=null)?getString():"");

bajarildi. Lekin getString() deb ikki marta qo'ng'iroq qilish kerak, deb bejiz emas

Taklif etilganidek, getString() usulini tekshiring

0
qo'shib qo'ydi