不要编写自己的函数,而是使用 try-catch 的内置结构。你的问题在于 jsonarray
或 jsonarray.getJSONObject(i)
或值本身是 null
,并且你调用了空引用上的方法。请尝试以下操作:
int block_id = 0;
try {
block_id = Integer.parseInt(jsonarray.getJSONObject(i).getString("block_id"));
} catch (Exception e) {};
Java中使用异常来标记意外情况。例如,将非数字String
解析为数字(NumberFormatException
),或在null
引用上调用方法(NullPointerException
)。您可以以许多方式捕获它们。
try{
} catch (NumberFormatException e1) {
e.printStackTrace()
} catch (NullPointerException e2) {
e.printStackTrace();
}
或者利用它们都扩展了Exception
的事实:
try {
} catch (Exception e) {
e.printStackTrace;
};
或者从Java 7开始:
try {
} 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();
}
null
,而是空的。 - Tunakiint
而不是Integer
,并将你的方法名更改为convertToInt
(或者parseIntOrNull
)。 - Jon Skeetnull
之后,我还会检查字符串是否仅包含数字:str.matches("[0-9]+");
。或者你可以捕获解析异常。 - CloudPotato