Преобразование строки в int. Установите int в 0, если String имеет значение null
У меня есть функция, которая сохраняет данные Android в sqlite
, но мне нужно преобразовать данные String
в Integer
.
Всякий раз, когда String
есть null
, я хотел бы сохранить как 0
Ниже мой код, который терпит неудачу, когда значение null
int block_id = Integer.parseInt(jsonarray.getJSONObject(i).getString("block_id"));
block_id
выше преобразуется в Integer
.
Это то, что я решил сделать, но все равно не удается преобразовать строковое значение в 0
всякий раз, когда его null
.
int block_id = Converttoint(jsonarray.getJSONObject(i).getString("block_id"));
Тогда функция convertToInt
public static Integer convertToInt(String str) {
int n=0;
if(str != null) {
n = Integer.parseInt(str);
}
return n;
}
Как мне изменить его, чтобы он работал?
Ответы
Ответ 1
Вместо того, чтобы писать свою собственную функцию, используйте конструкцию inbuild try-catch. Ваша проблема в том, что jsonarray
или jsonarray.getJSONObject(i)
или само значение является null
, и вы вызываете метод с нулевой ссылкой. Попробуйте следующее:
int block_id = 0; //this set 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 not convertable, will leave it 0.
} catch (Exception e) {};
В Java Исключения используются для обозначения непредвиденных ситуаций. Например, разбор нецифрового String
на число (NumberFormatException
) или вызов метода на null
ссылке (NullPointerException
). Вы можете их поймать разными способами.
try{
//some code
} catch (NumberFormatException e1) {
e.printStackTrace() //very important - handles the Exception but prints the information!
} catch (NullPointerException e2) {
e.printStackTrace();
}
или используя тот факт, что все они расширяются Exception
:
try {
//somecode
} catch (Exception e) {
e.printStackTrace;
};
или, поскольку Java 7:
try {
//somecode
} catch (NullPointerException | NumberFormatException e) {
e.printStackTrace;
};
Примечание
Как я считаю, вы внимательно прочитаете ответ, пожалуйста, имейте в виду, что в StackOverflow нам нужен Минимальный, полный и проверенный пример, которые включают StackTrace вашего исключения. В вашем случае это, вероятно, начинается со следующего:
Exception in thread "main" java.lang.NullPointerException
Тогда отладка намного проще. Без него это просто догадывается.
Изменить: В соответствии с принятым ответом
Принятый ответ хорош и будет работать так долго, как значение, хранящееся с ключом: block_id
будет числовым. Если это не числовое значение, ваше приложение выйдет из строя.
Вместо:
JSONObject jObj = jsonarray.getJSONObject(i);
int block_id = jObj.has("block_id") ? jObj.getInt("block_id") : 0;
Следует использовать:
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();
}
Ответ 2
Просто используйте встроенный метод JSONObject#getInt(String)
, он автоматически преобразует значение в int
, вызывая за сценой Integer.parseInt(String)
, если это a String
или вызовом Number#intValue()
, если это Number
. Чтобы избежать исключения, когда ваш ключ недоступен, просто проверьте сначала, если ваш экземпляр JSONObject
имеет ваш ключ, используя JSONObject#has(String)
, этого достаточно, чтобы быть в безопасности, поскольку ключ не может иметь значение null
, либо он существует с значением не null
, либо не существует.
JSONObject jObj = jsonarray.getJSONObject(i);
int block_id = jObj.has("block_id") ? jObj.getInt("block_id") : 0;
Ответ 3
Есть еще один способ сделать это отдельно от методов, приведенных в остальных ответах.
String blockId=jsonarray.getJSONObject(i).getString("block_id");
int block_id = blockId==null ? 0 : Integer.parseInt(blockId);
Ответ 4
Вы можете проверить NumberFormatException
. Integer.parseInt()
будет бросать NumberFormatException
для случаев:
-
String
null
-
String
пуст (""
)
-
String
не может быть преобразован в int
по любой другой причине (скажем String
is "aff"
или "1.25"
)
В принципе, он будет обрабатывать все возможные нецелые случаи.
Пример кода:
private static int convertStringToInt(String str){
int x = 0;
try{
x = Integer.parseInt(str);
}catch(NumberFormatException ex){
//TODO: LOG or HANDLE
}
return x;
}
Ответ 5
Вы можете использовать следующий метод,
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;
Ответ 7
Попробуйте это
int block_id = (jsonarray.getJSONObject(i).has(block_id)) ? jsonarray.getJSONObject(i).getInt("block_id") : 0;
Ответ 8
вы можете использовать Integer.getInteger("30").intValue()
Ответ 9
int block_id_0 = jObj.optInt("block_id");
Условие ternary
и множественный код можно просто заменить функцией optInt
в одной строке, что просто
1.) return
default value
или 0
, если нет значения (зависит от варианта, который вы используете).
2.) Попробуйте преобразовать значение, если значение доступно как string
3.) Просто Нет исключений null или NumberFormat вообще в случае отсутствия ключа или значения
Android docs
int optInt (String name)
int optInt (String name, int fallback)
Maven-Центральная
int optInt(String key, int defaultValue)
Чтобы получить заданное значение по умолчанию, если значение отсутствует
Получить необязательное значение int, связанное с ключом, или значение по умолчанию if нет такого ключа или если значение не является числом. Если значение равно строка, будет предпринята попытка оценить ее как число.
jObj.optInt("block_id",defaultvalue);
или
Чтобы получить значение по умолчанию как 0, если значение не доступно
Получить необязательное значение int, связанное с ключом, или ноль, если есть нет такого ключа или если значение не является числом. Если значение представляет собой строку, будет предпринята попытка оценить его как число.
jObj.optInt("block_id");
например
int block_id = jObj.optInt("block_id",5);
block_id
будет равно 5, если не доступно ключ/значение
int block_id_0 = jObj.optInt("block_id");
block_id_0
будет 0, если нет доступных ключей/значений
Существует и другой вариант этой функции для других типов данных, попробуйте ссылку docs
выше.
Ответ 10
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;
}
Ответ 11
Обратите внимание, что вы также могли бы написать это как
public static Integer convertToInt(String str) {
int n=0;
if(str != null && str.length()>0) {
n = Integer.parseInt(str);
}
return n;
}
но метод try/catch более эффективен и прост и не приведет к выходу системы, если письмо попадет внутрь строки (просто стоит упомянуть)
также важно заметить, что такое же уравнение записывается так:
if(str != null & str.length()>0) {}
или так:
if(str.length()>0 && str != null) {}
может привести к сбою операции, поскольку она попытается подсчитать строку, даже если она равна null
Надеюсь, я ответил на все ваши вопросы.
Ответ 12
Ваша функция должна работать нормально только тогда, когда параметр является пустым string
вместо нулевого
Если параметр пуст string
, Integer.parseInt
будет вызывать NumberFormatException
вместо возврата 0