2016-09-27 15 views
22

Mam funkcję, która zapisuje dane Androida w sqlite, ale muszę przekonwertować dane String na Integer.Konwersja ciągu na int. Ustaw wartość równą 0, jeśli String ma wartość null

Ilekroć String jest null chciałbym zapisać jako 0

Poniżej jest mój kod, który nie powiedzie się, gdy wartość jest null

int block_id = Integer.parseInt(jsonarray.getJSONObject(i).getString("block_id")); 

block_id powyżej przekształca się w Integer.

To jest to, co postanowiłem zrobić, ale nadal nie można przekonwertować wartość ciągu na 0, gdy jego null.

int block_id = Converttoint(jsonarray.getJSONObject(i).getString("block_id")); 

Następnie funkcja convertToInt

public static Integer convertToInt(String str) { 
    int n=0; 
    if(str != null) { 
     n = Integer.parseInt(str); 
    } 
    return n; 
} 

Jak należy zmienić, aby to działało?

+4

Proszę wysłać wiadomość [mcve]. Podejrzewam, że Twój String nie ma wartości "null", ale jest pusty. – Tunaki

+4

Ten kod wygląda na to, że powinien działać, chociaż zwróciłbym 'int' zamiast' Integer', i zmień nazwę twojej metody na 'convertToInt' (lub' parseIntOrNull') –

+0

Po sprawdzeniu, czy ciąg znaków nie jest równy null 'Chciałbym również sprawdzić, czy ciąg zawiera tylko liczby:' str.matches ("[0-9] +"); '. Lub po prostu wychwycisz wyjątek parsowania. – Blobonat

Odpowiedz

15

Zamiast pisać własną funkcję, użyj wbudowanej konstrukcji try-catch. Twoim problemem jest, że jsonarray lub jsonarray.getJSONObject(i) lub sama wartość jest null i wywołujesz metodę na odwołanie zerowe. Spróbuj wykonać następujące czynności:

int block_id = 0;  //this set's the block_id to 0 as a default. 
try { 
    block_id = Integer.parseInt(jsonarray.getJSONObject(i).getString("block_id")); //this will set block_id to the String value, but if it's not convertable, will leave it 0. 
} catch (Exception e) {}; 

W języku Java Wyjątki służą do oznaczania nieoczekiwanych sytuacji. Na przykład parsowanie nieliczbowego numeru String na numer (NumberFormatException) lub wywołanie metody na odwołaniu (null)(). Możesz je złapać na wiele sposobów.

try{ 
    //some code 
} catch (NumberFormatException e1) { 
    e.printStackTrace()  //very important - handles the Exception but prints the information! 
} catch (NullPointerException e2) { 
    e.printStackTrace(); 
} 

lub wykorzystując fakt, że wszystkie one przedłużyć Exception:

try { 
    //somecode 
} catch (Exception e) { 
    e.printStackTrace; 
}; 

lub od Java 7:

try { 
    //somecode 
} catch (NullPointerException | NumberFormatException e) { 
    e.printStackTrace; 
}; 

Uwaga

Jak wierzę, że ciebie "Przeczytam odpowiedź dokładnie, proszę, miej to na uwadze na StackOverflow wymagamy Minimal, Complete, and Verifiable example, które zawierają StackTrace twojego wyjątku. W twoim przypadku prawdopodobnie zaczyna się od:

Exception in thread "main" java.lang.NullPointerException 

Wówczas debugowanie jest znacznie łatwiejsze. Bez tego, to tylko zgadywanie.

Edit:Zgodnie z przyjętą odpowiedzi

Zaakceptowanych odpowiedź jest dobra i będzie działać tak długo, jak wartości przechowywanej z kluczem: block_id będzie numeryczny. Jeśli nie jest to numeryczne, aplikacja ulegnie awarii.

Zamiast:

JSONObject jObj = jsonarray.getJSONObject(i); 
int block_id = jObj.has("block_id") ? jObj.getInt("block_id") : 0; 

Trzeba użyć:

int block_id; 
try{ 
    JSONObject jObj = jsonarray.getJSONObject(i); 
    block_id = jObj.has("block_id") ? jObj.getInt("block_id") : 0; 
} catch (JSONException | NullPointerException e) { 
    e.printStackTrace(); 
} 
23

Wystarczy użyć wbudowanej metody JSONObject#getInt(String), zostanie ona automatycznie konwertować wartości do int dzwoniąc za sceną Integer.parseInt(String) jeżeli jest to String lub przez wywołanie Number#intValue(), jeśli jest to Number. Aby uniknąć wyjątku, gdy klucz nie jest dostępny, po prostu sprawdź najpierw, czy instancja JSONObject ma klucz używający JSONObject#has(String), to wystarczy, aby być bezpiecznym, ponieważ klucz nie może mieć wartości null, albo istnieje z wartością inną niż null, albo nie ma wartości istnieje.

JSONObject jObj = jsonarray.getJSONObject(i); 
int block_id = jObj.has("block_id") ? jObj.getInt("block_id") : 0; 
9

Jest jeszcze jeden sposób, aby to zrobić poza metodami podanymi w pozostałych odpowiedziach.

8

Możesz sprawdzić na NumberFormatException. Integer.parseInt() rzuci NumberFormatException przypadków:

  • String jest null
  • String jest pusta ("")
  • String nie może być przekształcony w int z jakiegokolwiek innego powodu (powiedzmy String jest "aff" lub "1.25")

Zasadniczo obsłuży wszystkie możliwe, nie Przypadki n-integer.

Kod Przykład:

private static int convertStringToInt(String str){ 
    int x = 0; 
    try{ 
     x = Integer.parseInt(str); 
    }catch(NumberFormatException ex){ 
     //TODO: LOG or HANDLE 
    } 
    return x; 
} 
7

można użyć następującej metody,

String id = jsonarray.getJSONObject(i).getString("block_id") 
int blockId = getBlockId(id); 

@NonNull 
private Integer getBlockId(String id) { 
    Integer blockId= 0; 
    try { 
     blockId= Integer.parseInt(id); 
    } catch (NumberFormatException e) { 
     e.printStackTrace(); 
    } 
    return blockId; 
} 
6
String toBeParsedStr="1234"; 
int parsedInt=toBeParsedStr!=null&&toBeParsedStr.matches("[0-9]+")?Integer.parseInt(toBeParsedStr):0; 
-1

Twoja funkcja powinna działać poprawnie tylko wtedy, gdy param jest pusty string zamiast null If parametr jest pusty string, Integer.parseInt rzuciłby NumberFormatException zamiast powrotu 0

6

Spróbuj

int block_id = (jsonarray.getJSONObject(i).has(block_id)) ? jsonarray.getJSONObject(i).getInt("block_id") : 0; 
3

można użyć Integer.getInteger("30").intValue()

1
String str = "..."; 
// suppose str becomes null after some operation(s). 
int number = 0; 
try 
{ 
    if(str != null) 
     number = Integer.parseInt(str); 
} 
catch (NumberFormatException e) 
{ 
    number = 0; 
} 
1

Zawiadomienie ..można również napisać to tak

public static Integer convertToInt(String str) { 
    int n=0; 
    if(str != null && str.length()>0) { 
     n = Integer.parseInt(str); 
    } 
    return n; 
} 

ale metoda try/catch jest bardziej efektywne i proste i nie spowoduje wyjście systemu, jeśli list dostał się do wnętrza String (tylko wspomnieć)

także , ważne jest, aby zauważyć, że pisanie tego samego równania tak:

if(str != null & str.length()>0) {} 

lub tak:

if(str.length()>0 && str != null) {} 

może spowodować, że operacja się nie powiedzie, ponieważ będzie spróbować policzyć String nawet jeśli jest zerowa

nadzieję, że odpowiedzi na wszystkie pytania

2
int block_id_0 = jObj.optInt("block_id"); 

ternary stan i wielokrotny kod może być po prostu zastąpione optInt funkcja w jednej linii, która po prostu

1.) returndefault value lub 0 jeśli wartość nie jest tam (w zależności od wariantu używasz).

2.) Spróbuj przekonwertować wartość, jeżeli wartość jest dostępna jako string

3.), po prostu Brak null lub numberFormat wyjątków w ogóle w przypadku braku klucza lub wartości

Android docs

int optInt (String name)

int optInt (String name, int fallback)

Maven-Central

int optInt(String key, int defaultValue)

Aby uzyskać określoną wartość domyślną, jeśli wartość nie dostępny

Get opcjonalną wartość int skojarzony z kluczem, lub domyślnie, jeśli nie ma takiego klawisza lub jeśli wartość nie jest liczbą. Jeśli wartość to ciąg znaków, zostanie podjęta próba oceny go jako liczby.

jObj.optInt("block_id",defaultvalue); 

lub

Aby uzyskać wartość domyślną wartość 0, jeśli nie dostępny wartość

Get opcjonalną wartość int skojarzony z kluczem, lub zero, jeśli istnieje ma takiego klawisza lub jeśli wartość nie jest liczbą. Jeśli wartością jest ciąg znaków, , zostanie podjęta próba oceny go jako liczby.

jObj.optInt("block_id"); 

e.g

int block_id = jObj.optInt("block_id",5); 

block_id będzie 5 jeśli nie klucz/wartość dostępny

int block_id_0 = jObj.optInt("block_id"); 

block_id_0 będzie 0, jeśli nie klucz/wartość dostępny

Istnieje inny wariant tej funkcji dostępne dla innych typów danych również spróbuj powyższego linku docs.

Powiązane problemy