我有一个功能可以在String
中保存Android数据,但我必须将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}}
我应该如何改变它,让它发挥作用?
答案 0 :(得分:24)
只需使用内置方法JSONObject#getInt(String)
,如果它是 mInterstitialAd = new InterstitialAd(adContext);
mInterstitialAd.setAdUnitId("xxxxxxxxxxx");
AdRequest adRequest = new AdRequest.Builder()
.setGender(AdRequest.GENDER_MALE)
.setBirthday(new GregorianCalendar(1993, 1, 1).getTime())
.build();
mInterstitialAd.loadAd(adRequest);
或通过int
,它会自动将值转换为Integer.parseInt(String)
如果是String
则调用Number#intValue()
。为避免在您的密钥不可用时出现异常,只需先检查Number
实例是否包含使用JSONObject#has(String)
的密钥,这足以确保安全,因为密钥不能具有JSONObject
值,它存在一个非null
值,或者它不存在。
null
答案 1 :(得分:15)
使用try-catch的inbuild构造而不是编写自己的函数。您的问题是,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;
};
注意的
我相信,你会仔细阅读答案,请记住,在StackOverflow上我们需要包含你的异常的StackTrace的Minimal, Complete, and Verifiable example。在您的情况下,它可能从以下开始:
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 :(得分:9)
除了其他答案中给出的方法之外,还有一种方法可以做到这一点。
String blockId=jsonarray.getJSONObject(i).getString("block_id");
int block_id = blockId==null ? 0 : Integer.parseInt(blockId);
答案 3 :(得分:8)
您可以查看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;
}
答案 4 :(得分: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;
}
答案 5 :(得分:6)
String toBeParsedStr="1234";
int parsedInt=toBeParsedStr!=null&&toBeParsedStr.matches("[0-9]+")?Integer.parseInt(toBeParsedStr):0;
答案 6 :(得分:6)
试试这个
int block_id = (jsonarray.getJSONObject(i).has(block_id)) ? jsonarray.getJSONObject(i).getInt("block_id") : 0;
答案 7 :(得分:3)
您可以使用Integer.getInteger("30").intValue()
答案 8 :(得分:2)
optInt
return
条件和多个代码可以简单地用default value
函数替换为一行,只需
1。)0
string
或jObj.optInt("block_id",defaultvalue);
如果没有值(取决于您使用的变体)。
2。)如果值为jObj.optInt("block_id");
3。)如果缺少键或值,只需没有null或NumberFormat例外
Android文档
int optInt (String name, int fallback)
Maven的中央
int optInt(String key, int defaultValue)
如果没有可用值,则获取指定的默认值
获取与键关联的可选int值,或默认值if 没有这样的密钥,或者该值不是数字。如果值是 一个字符串,将尝试将其评估为数字。
int block_id = jObj.optInt("block_id",5);
或
如果没有可用值,则将默认值设为0
获取与键关联的可选int值,如果存在则为零 没有这样的键或者值不是数字。如果值是一个字符串, 将尝试将其评估为数字。
block_id
e.g
int block_id_0 = jObj.optInt("block_id");
如果没有可用的键/值, block_id_0
将为5
docs
如果没有可用的键/值, $scope.$on
将为0
此函数的其他变体也可用于其他数据类型,请尝试上面的$scope.$emit
链接。
答案 9 :(得分: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;
}
答案 10 :(得分:1)
注意..你也可以这样写
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,即使它是null
希望我回答你的所有问题
答案 11 :(得分:-1)
只有当param为空string
而不是null时,您的函数才能正常工作
如果参数为空Integer.parseInt
,则NumberFormatException
会抛出//profilePic is the button
//friend is a coredata object received from another view. picIndex is stored as int16 in the coredata
profilePic.setImage(UIImage(named: imgArray[friend.picIndex]), forState: UIControlState.Normal);
而不是返回0