Преобразование строки в int. Установите для int значение 0, если String равно нулю
У меня есть функция, которая сохраняет данные 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;
}
Как я должен изменить это, чтобы заставить это работать?
12 ответов
Вместо написания своей собственной функции используйте встроенную конструкцию try-catch. Ваша проблема в том, что jsonarray
или же jsonarray.getJSONObject(i)
или само значение является null
и вы вызываете метод по нулевой ссылке. Попробуйте следующее:
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) {};
В 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;
};
Заметка
Поскольку я считаю, что вы внимательно прочитаете ответ, имейте в виду, что для Stackru нам требуется пример Minimal, Complete и Verifiable, который включает 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();
}
Просто используйте встроенный метод JSONObject#getInt(String)
, он автоматически преобразует значение в int
позвонив за кулисы Integer.parseInt(String)
если это 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;
Есть еще один способ сделать это, кроме методов, приведенных в остальных ответах.
String blockId=jsonarray.getJSONObject(i).getString("block_id");
int block_id = blockId==null ? 0 : Integer.parseInt(blockId);
Вы можете проверить на NumberFormatException
, Integer.parseInt()
будет бросать NumberFormatException
для случаев:
String
являетсяnull
String
пустой (""
)String
не может быть преобразован вint
по любой другой причине (скажемString
является"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;
}
Вы можете использовать следующий метод,
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;
}
String toBeParsedStr="1234";
int parsedInt=toBeParsedStr!=null&&toBeParsedStr.matches("[0-9]+")?Integer.parseInt(toBeParsedStr):0;
Попробуй это
int block_id = (jsonarray.getJSONObject(i).has(block_id)) ? jsonarray.getJSONObject(i).getInt("block_id") : 0;
int block_id_0 = jObj.optInt("block_id");
ternary
условие и множественный код могут быть просто заменены optInt
функция в одной строке, которая просто
1.) return
default value
или же 0
если значение отсутствует (зависит от используемого вами варианта).
2.) Попробуйте преобразовать значение, если оно доступно как string
3.) Просто Нет нулевых или NumberFormat исключений вообще в случае отсутствия ключа или значения
Документы для Android
int optInt (String name)
int optInt (String name, int fallback)
Maven-Центральный
int optInt(String key, int defaultValue)
Чтобы получить указанное значение по умолчанию, если нет доступных значений
Получить необязательное значение типа int, связанное с ключом, или значение по умолчанию, если такого ключа нет или если это значение не является числом. Если значение является строкой, будет сделана попытка оценить его как число.
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
ссылка выше.
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;
}
Обратите внимание.. вы также можете написать это так
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) {}
может привести к сбою операции, потому что она будет пытаться посчитать строку, даже если она пуста
Надеюсь, я ответил на все ваши вопросы
Ваша функция должна работать нормально только тогда, когда параметр пуст string
вместо нуля, если параметр пуст string
,Integer.parseInt
бросил бы NumberFormatException
вместо возврата 0