Подтвердить что ты не робот

Преобразование строки в 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;
}

Как мне изменить его, чтобы он работал?

4b9b3361

Ответ 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