我希望通过使用JSON获得当前/历史比特币价格。
但是,代码显示以下错误
Exception in thread "main" java.lang.NullPointerException at RwithJlab.Basic.main(Basic.java:19)
---------------------------------代码------------- --------------------
package RwithJlab;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class Basic
{
public static void main(String[] args) throws MalformedURLException, IOException, JSONException
{
JSONObject data = getJSONfromURL("https://blockchain.info/charts/market-price?format=json");
JSONArray data_array = data.getJSONArray("values");
for (int i = 0; i < ((CharSequence) data_array).length(); i++)
{
JSONObject price_point = (JSONObject) data_array.get(i);
// Unix time
int x = price_point.getInt("1364062505");
// Bitcoin price at that time
double y = price_point.getDouble("y");
// Do something with x and y.
System.out.println(x);
}
}
public static JSONObject getJSONfromURL(String URL) throws JSONException
{
try
{
URLConnection uc;
URL url = new URL(URL);
uc = url.openConnection();
uc.setConnectTimeout(10000);
uc.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
uc.connect();
BufferedReader rd = new BufferedReader(
new InputStreamReader(uc.getInputStream(),
Charset.forName("UTF-8")));
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1)
{
sb.append((char)cp);
}
String jsonText = (sb.toString());
return new JSONObject(jsonText.toString());
} catch (IOException ex)
{
return null;
}
}
}
请帮助
答案 0 :(得分:0)
当你捕获它们时,你至少应该记录异常,否则当发生异常时你就不了解了。
在您的情况下,您正在抓取IOException
并返回null
。这导致NullPointerException
之后,但您无法看到根本原因。
记录IOException
(至少致电ex.printStackTrace()
),您将看到真正的原因。
答案 1 :(得分:0)
您在JSONException
行得到int x = price_point.getInt("1364062505");
首先,查看您要检索的URL的源JSON。
它的结构是:
values: [ {x : timestamp, y : value}, ... ]
其中 时间戳 是用毫秒表示的日期,而 值 是BTC的美元价格
您正在尝试getInt("1364062505")
,而values
JSON数组中的此类键不存在。
JSONException
抛出到getInt(key)
。
您需要写int x = price_point.getInt("x")
,或者甚至更好-将getInt()
替换为optInt()
,将getDouble()
替换为optDouble()
。在这种情况下,如果JSONObject
中的键不存在,则不会有任何例外,只有零。然后,您应该在if (value != 0)
块中检查您的值