将字符串转换为整数。如果字符串为空,则将整数设置为0。

24

我有一个函数,用于在sqlite中保存Android数据,但我必须将String数据转换为Integer

每当Stringnull时,我希望将其保存为0

以下是我的代码,在值为null时会失败

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

block_id以上的内容被转换为Integer类型。

这是我决定要做的事情,但仍无法将字符串值转换为null时的0

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;
}

我该如何修改它,以使其正常工作?


4
请提供一个 [mcve]。我怀疑你的字符串不是 null,而是空的。 - Tunaki
4
这段代码看起来应该是可行的,虽然我会返回int而不是Integer,并将你的方法名更改为convertToInt(或者parseIntOrNull)。 - Jon Skeet
在你检查字符串不为null之后,我还会检查字符串是否仅包含数字:str.matches("[0-9]+");。或者你可以捕获解析异常。 - CloudPotato
JSONObject jObj = jsonarray.getJSONObject(i); int block_id = TextUtils.isEmpty(jObj.getString("block_id"))?0:jObj.getInt("block_id") ; 请尝试这个。 - Zala Janaksinh
12个回答

24

只需使用内置方法JSONObject#getInt(String),如果它是一个String类型的值,则自动通过调用背后的Integer.parseInt(String)将其转换为int,或通过调用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;

15

不要编写自己的函数,而是使用 try-catch 的内置结构。你的问题在于 jsonarrayjsonarray.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;
};

注意

我相信你会仔细阅读答案,请记住,在StackOverflow上,我们要求提供包含异常堆栈跟踪的最小、完整和可验证示例(MCVE)。在您的情况下,它可能从以下内容开始:

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();
}

9

除了其他答案中提供的方法,还有一种方法可以实现此操作。

String blockId=jsonarray.getJSONObject(i).getString("block_id");
int block_id = blockId==null ? 0 :  Integer.parseInt(blockId);

8
您可以检查是否存在NumberFormatException。对于以下情况,Integer.parseInt()将抛出NumberFormatException:
  • 字符串为null
  • 字符串为空(“”)
  • 字符串由于任何其他原因无法转换为int(例如,字符串为“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;
}

7
你可以使用以下方法:
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;

6

试一下这个

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

3

you can use Integer.getInteger("30").intValue()


2
int block_id_0 = jObj.optInt("block_id"); 
optInt函数可以在一行代码中简单地替换ternary条件和多个代码,它会:

1.) 如果没有值,则返回默认值或0(取决于您使用的变量)。

2.) 尝试将值转换为string,如果该值可用

3.) 在缺少键或值的情况下,完全没有空值或NumberFormat异常

Android文档

int optInt (String name)

int optInt (String name, int fallback)

Maven-Central

int optInt(String key, int defaultValue)

如果没有值可用,则获取指定的默认值

获取与键相关联的可选int值,如果没有此类键或值不是数字,则返回默认值。如果该值是一个字符串,则将尝试将其评估为数字。

jObj.optInt("block_id",defaultvalue);

如果没有可用值,则将默认值设置为0

获取与键关联的可选整数值,如果不存在此类键或该值不是数字,则返回零。 如果该值是一个字符串,则将尝试将其作为数字进行评估。

jObj.optInt("block_id");

e.g

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

block_id如果没有可用的键/值,将会是5。

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

如果没有可用的键/值,block_id_0将为0。
此函数还有其他数据类型的变体,可以尝试上面的docs链接。

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接