2016-06-03 4 views
1

Я пытаюсь изменить Android приложение, которое вытягивает некоторые JSON от сервера ..Проверка нулевых значений в Java

JSONObject mResult = new JSONObject((String) result); 

Затем с помощью, чтобы построить объект из моего класса спонсор ..

Gson mGson = new Gson(); 
mSponsor = mGson.fromJson(mResult.getJSONObject("data").getJSONObject("sponsor").toString(), Sponsor.class); 

Спонсорский класс - это всего лишь оболочка с сеттерами и геттерами, без логики. Что-то вроде этого:

public class Sponsor { 

    @SerializedName("address1") 
    private String Address1; 
    @SerializedName("address2") 
    private String Address2; 

    public Sponsor(String address1, String address2) { 
     Address1 = address1; 
     Address2 = address2; 
    } 

    public Sponsor() { 
     Address1 = ""; 
     Address2 = ""; 
    } 

    public String getAddress1() { 
     return Address1; 
    } 

    public void setAddress1(String address1) { 
     Address1 = address1; 
    } 

    public String getAddress2() { 
     return Address2; 
    } 

    public void setAddress2(String address2) { 
     Address2 = address2; 
    } 
} 

приложение помещает адрес в TextView так:

txtAddress = (TextView) view.findViewById(R.id.txt_sponsor_address); 
txtAddress.setText(mSponsor.getAddress1() + "\n" + mSponsor.getAddress2()); 

Это все работает, кроме случаев, когда сервер возвращает null для address2, в этом случае дословный текст «нулевой "печатается в TextView, где должен быть адрес2.

Мой вопрос: как я могу избавиться от «нулевого»?

Я пробовал несколько разных вещей, начал с простого тройного заявления и получил все больше и больше подробностей, и ничего не сработало.

Вот последний и самый смешной вид, что я пытался до сих пор:

String addr2 = ((String) mSponsor.getAddress2()).trim(); 
String a2; 
if((addr2 == "null") || (addr2 == "")) a2 = (String) ""; 
else a2 = (String) addr2; 

txtAddress.setText(mSponsor.getAddress1() + "\n" + a2); 

Это вызывает приложение к краху, когда я открываю эту активность.

Я ноб на Java, поэтому, пожалуйста, предоставьте ссылки, если сможете.

+0

Вы пробовали 'addr2.equals (" null ")' или 'addr2 == null'? –

ответ

3

"getAddress2()" не возвращают буквальную строку "нуль". Он возвращает ссылку null, а StringBuilder преобразует ее в «нулевую» строку при ее печати в конкатенации. Вот почему он падает, когда вы пытаетесь урезать слово.

Простой способ исправить это поставить тройной оператор в самом добытчика так:

public String getAddress2() { 
    return (Address2 == null) ? "" : Address2; 
} 

Теперь вы никогда не возвращает пустую ссылку, и вы можете безопасно использовать его без каких-либо проверок.

+0

Может быть, это отдельный вопрос, но не будет 'public ** Строка ** 'part гарантирует возврат строки? –

+1

Он гарантирует, что возвращаемый объект будет реализовывать интерфейс 'String'. Это означает, что если он существует, вы можете выполнять методы String на указанном объекте. Возвращаемый объект может фактически не существовать (следовательно, «null»). Если объект не существует, вы не можете выполнять операции над ним. Java не имеет никакого способа гарантировать возврат ненуля. Вы должны гарантировать это через интерфейс, потому что иногда нуль является подходящим. Например, в этом случае, как вы знаете, сервер вернул «нуль», а не пустую строку? Вы теряете эту информацию. – DeeV

+1

Чаще всего вы возвращаете объект по умолчанию, например пустую строку, поэтому вам не нужно посыпать «if (obj! = Null)» везде в коде (который стареет, действительно, очень быстро). – DeeV

3

Вы можете создать еще один добытчик в вашем Sponsor классе, где бы поставить свою логику, чтобы получить форматированный адрес:

public String getFormattedAddress() { 
    if (!TextUtils.isEmpty(Address1) && !TextUtils.isEmpty(Address2) 
     && !Address1.equalsIgnoreCase("null") && !Address2.equalsIgnoreCase("null")) { 
     return (Address1 + "\n" + Address2); 
    } 
    if (!TextUtils.isEmpty(Address1) && !Address1.equalsIgnoreCase("null")) { 
     return (Address1); 
    } 
    if (!TextUtils.isEmpty(Address2) && !Address2.equalsIgnoreCase("null")) { 
     return (Address2); 
    } 
    return (""); 
} 

, а затем просто SetText с:

txtAddress.setText(mSponsor.getFormattedAddress());

+0

Спасибо за ответ, я получаю большую часть того, что вы делаете, довольно понятный, но можете ли вы кратко рассказать мне, что такое «TextUtils»? Мне нужно импортировать это? –

+0

@PootieTang TextUtils - это класс утилиты, входящий в состав Android SDK, поэтому вам не нужно добавлять его в зависимости. – DeeV

+0

'TextUtils' является частью импорта текста в андроид, который проверяет наличие пустой или пустой строки. Просто импортируйте 'import android.text.TextUtils;' – NSimon

1

Вы не следует использовать:

if((addr2 == "null") 

Для st кольцо использование comparaison:

if (addr2.equalsIgnoreCase("null")) 
1
String addr2 = mSponsor.getAddress2(); 
if(!TextUtils.isEmpty(addr2) || !addr2.equalsIgnoreCase("null") 
    txtAddress.setText(mSponsor.getAddress1() + "\n" + addr2); 
else 
    txtAddress.setText(mSponsor.getAddress1()); 
+0

oh, ваша первая строка может быть NullPointerException ... – tkhm

+1

@tkhm спасибо yea .. отредактировал: D – Uday

1

Как насчет этого?

// if null, addr2="", if not null, addr = getAddress2()'s result 
String addr2 = mSponsor.getAddress2() == null ? "" : ((String) mSponsor.getAddress2()).trim(); 

txtAddress.setText(mSponsor.getAddress1() + "\n" + addr2); 
0

Попробуйте для getter код:

public String getAddress2() { 
    if (Address2.equals("null")) { 
     Address2=""; 
    } 
    return Address2; 
} 

Конечно, вы можете сделать то же самое с другой getter для Address1. Кроме того, если вы хотите проверить пустую строку, используйте Address2.length() == 0, а не Address2 == "".

Смежные вопросы