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

Ты можешь использовать Integer.getInteger("30").intValue()

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

Другие вопросы по тегам