Android - 找不到在第 106 行抛出 NullPointerException 的内容
Android - Can't find what's throwing NullPointerException at line 106
正在尝试找出是什么在我的应用程序中引发了 NullPointerException
。有人可以帮助我吗?
错误行
listener.onWeatherResponse(result);
主要代码:
public class YahooClient {
public static List<CityResult> getCityList(String cityName) {
List<CityResult> result = new ArrayList<CityResult>();
HttpURLConnection yahooHttpConn = null;
try {
String query =makeQueryCityURL(cityName);
Log.d("Swa", "URL [" + query + "]");
yahooHttpConn= (HttpURLConnection) (new URL(query)).openConnection();
yahooHttpConn.connect();
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setInput(new InputStreamReader(yahooHttpConn.getInputStream()));
Log.d("Swa", "XML Parser ok");
int event = parser.getEventType();
CityResult cty = null;
String tagName = null;
String currentTag = null;
// We start parsing the XML
while (event != XmlPullParser.END_DOCUMENT) {
tagName = parser.getName();
if (event == XmlPullParser.START_TAG) {
if (tagName.equals("place")) {
// place Tag Found so we create a new CityResult
cty = new CityResult();
Log.d("Swa", "New City found");
}
currentTag = tagName;
Log.d("Swa", "Tag ["+tagName+"]");
}
else if (event == XmlPullParser.TEXT) {
// We found some text. let's see the tagName to know the tag related to the text
if ("woeid".equals(currentTag))
cty.setWoeid(parser.getText());
else if ("name".equals(currentTag))
cty.setCityName(parser.getText());
else if ("country".equals(currentTag))
cty.setCountry(parser.getText());
// We don't want to analyze other tag at the moment
}
else if (event == XmlPullParser.END_TAG) {
if ("place".equals(tagName))
result.add(cty);
}
event = parser.next();
}
}
catch(Throwable t) {
t.printStackTrace();
Log.e("Error in getCityList", t.getMessage());
}
finally {
try {
yahooHttpConn.disconnect();
}
catch(Throwable ignore) {}
}
return result;
}
public static void getWeather(String woeid, String unit, RequestQueue rq, final WeatherClientListener listener) {
String url2Call = makeWeatherURL(woeid, unit);
Log.d("SwA", "Weather URL ["+url2Call+"]");
final Weather result = new Weather();
StringRequest req = new StringRequest(Request.Method.GET, url2Call, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
parseResponse(s, result);
listener.onWeatherResponse(result);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
rq.add(req);
}
private static Weather parseResponse (String resp, Weather result) {
Log.d("SwA", "Response ["+resp+"]");
try {
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setInput(new StringReader(resp));
String tagName = null;
String currentTag = null;
int event = parser.getEventType();
boolean isFirstDayForecast = true;
while (event != XmlPullParser.END_DOCUMENT) {
tagName = parser.getName();
if (event == XmlPullParser.START_TAG) {
if (tagName.equals("yweather:wind")) {
// Log.d("SwA", "Tag [Wind]");
result.wind.chill = Integer.parseInt(parser.getAttributeValue(null, "chill"));
result.wind.direction = Integer.parseInt(parser.getAttributeValue(null, "direction"));
result.wind.speed = (int) Float.parseFloat(parser.getAttributeValue(null, "speed"));
}
else if (tagName.equals("yweather:atmosphere")) {
// Log.d("SwA", "Tag [Atmos]");
result.atmosphere.humidity = Integer.parseInt(parser.getAttributeValue(null, "humidity"));
result.atmosphere.visibility = Float.parseFloat(parser.getAttributeValue(null, "visibility"));
result.atmosphere.pressure = Float.parseFloat(parser.getAttributeValue(null, "pressure"));
result.atmosphere.rising = Integer.parseInt(parser.getAttributeValue(null, "rising"));
}
else if (tagName.equals("yweather:forecast")) {
// Log.d("SwA", "Tag [Fore]");
if (isFirstDayForecast) {
result.forecast.code = Integer.parseInt(parser.getAttributeValue(null, "code"));
result.forecast.tempMin = Integer.parseInt(parser.getAttributeValue(null, "low"));
result.forecast.tempMax = Integer.parseInt(parser.getAttributeValue(null, "high"));
isFirstDayForecast = false;
}
}
else if (tagName.equals("yweather:condition")) {
// Log.d("SwA", "Tag [Condition]");
result.condition.code = Integer.parseInt(parser.getAttributeValue(null, "code"));
result.condition.description = parser.getAttributeValue(null, "text");
result.condition.temp = Integer.parseInt(parser.getAttributeValue(null, "temp"));
result.condition.date = parser.getAttributeValue(null, "date");
}
else if (tagName.equals("yweather:units")) {
// Log.d("SwA", "Tag [units]");
result.units.temperature = "°" + parser.getAttributeValue(null, "temperature");
result.units.pressure = parser.getAttributeValue(null, "pressure");
result.units.distance = parser.getAttributeValue(null, "distance");
result.units.speed = parser.getAttributeValue(null, "speed");
}
else if (tagName.equals("yweather:location")) {
result.location.name = parser.getAttributeValue(null, "city");
result.location.region = parser.getAttributeValue(null, "region");
result.location.country = parser.getAttributeValue(null, "country");
}
else if (tagName.equals("image"))
currentTag = "image";
else if (tagName.equals("url")) {
if (currentTag == null) {
result.imageUrl = parser.getAttributeValue(null, "src");
}
}
else if (tagName.equals("lastBuildDate")) {
currentTag="update";
}
else if (tagName.equals("yweather:astronomy")) {
result.astronomy.sunRise = parser.getAttributeValue(null, "sunrise");
result.astronomy.sunSet = parser.getAttributeValue(null, "sunset");
}
}
else if (event == XmlPullParser.END_TAG) {
if ("image".equals(currentTag)) {
currentTag = null;
}
}
else if (event == XmlPullParser.TEXT) {
if ("update".equals(currentTag))
result.lastUpdate = parser.getText();
}
event = parser.next();
}
}
catch(Throwable t) {
t.printStackTrace();
}
return result;
}
private static String makeQueryCityURL(String cityName) {
// We remove spaces in cityName
cityName = cityName.replaceAll(" ", "%20");
return YAHOO_GEO_URL + "/places.q(" + cityName + "%2A);count=" + Config.MAX_CITY_RESULT + "?appid=" + APPID;
}
private static String makeWeatherURL(String woeid, String unit) {
return YAHOO_WEATHER_URL + "?w=" + woeid + "&u=" + unit;
}
/* Pubblic listener interface */
public static interface WeatherClientListener {
public void onWeatherResponse(Weather weather);
}
}
我的日志文件
E/AndroidRuntime(14436): java.lang.NullPointerException
01 E/AndroidRuntime(14436): 在 com.ocs76584.cityinfo.Activity.WeatherActivity$2.onWeatherResponse(WeatherActivity.java:135)
01-10 18:20:01.346: E/AndroidRuntime(14436): 在 com.ocs76584.cityinfo.Provider.YahooClient$1.onResponse(YahooClient.java:106)
01-10 18:20:01.346: E/AndroidRuntime(14436): 在 com.ocs76584.cityinfo.Provider.YahooClient$1.onResponse(YahooClient.java:1)
01-10 18:20:01.346: E/AndroidRuntime(14436): 在 com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60)
01-10 18:20:01.346: E/AndroidRuntime(14436): 在 com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30)
01-10 18:20:01.346: E/AndroidRuntime(14436): 在 com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
01-10 18:20:01.346: E/AndroidRuntime(14436): 在 android.os.Handler.handleCallback(Handler.java:615)
01-10 18:20:01.346: E/AndroidRuntime(14436): 在 android.os.Handler.dispatchMessage(Handler.java:92)
01-10 18:20:01.346: E/AndroidRuntime(14436): 在 android.os.Looper.loop(Looper.java:137)
01-10 18:20:01.346: E/AndroidRuntime(14436): 在 android.app.ActivityThread.main(ActivityThread.java:4895)
01-10 18:20:01.346:E/AndroidRuntime(14436):在 java.lang.reflect.Method.invokeNative(本机方法)
01-10 18:20:01.346: E/AndroidRuntime(14436): 在 java.lang.reflect.Method.invoke(Method.java:511)
01-10 18:20:01.346: E/AndroidRuntime(14436): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
01-10 18:20:01.346: E/AndroidRuntime(14436): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
01-10 18:20:01.346:E/AndroidRuntime(14436):在 dalvik.system.NativeStart.main(本机方法)
某处,不在您显示的代码中,您正在调用 getWeather(String, String, RequestQueue, Listener)
并为 Listener
设置 null
值.
正在尝试找出是什么在我的应用程序中引发了 NullPointerException
。有人可以帮助我吗?
错误行
listener.onWeatherResponse(result);
主要代码:
public class YahooClient {
public static List<CityResult> getCityList(String cityName) {
List<CityResult> result = new ArrayList<CityResult>();
HttpURLConnection yahooHttpConn = null;
try {
String query =makeQueryCityURL(cityName);
Log.d("Swa", "URL [" + query + "]");
yahooHttpConn= (HttpURLConnection) (new URL(query)).openConnection();
yahooHttpConn.connect();
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setInput(new InputStreamReader(yahooHttpConn.getInputStream()));
Log.d("Swa", "XML Parser ok");
int event = parser.getEventType();
CityResult cty = null;
String tagName = null;
String currentTag = null;
// We start parsing the XML
while (event != XmlPullParser.END_DOCUMENT) {
tagName = parser.getName();
if (event == XmlPullParser.START_TAG) {
if (tagName.equals("place")) {
// place Tag Found so we create a new CityResult
cty = new CityResult();
Log.d("Swa", "New City found");
}
currentTag = tagName;
Log.d("Swa", "Tag ["+tagName+"]");
}
else if (event == XmlPullParser.TEXT) {
// We found some text. let's see the tagName to know the tag related to the text
if ("woeid".equals(currentTag))
cty.setWoeid(parser.getText());
else if ("name".equals(currentTag))
cty.setCityName(parser.getText());
else if ("country".equals(currentTag))
cty.setCountry(parser.getText());
// We don't want to analyze other tag at the moment
}
else if (event == XmlPullParser.END_TAG) {
if ("place".equals(tagName))
result.add(cty);
}
event = parser.next();
}
}
catch(Throwable t) {
t.printStackTrace();
Log.e("Error in getCityList", t.getMessage());
}
finally {
try {
yahooHttpConn.disconnect();
}
catch(Throwable ignore) {}
}
return result;
}
public static void getWeather(String woeid, String unit, RequestQueue rq, final WeatherClientListener listener) {
String url2Call = makeWeatherURL(woeid, unit);
Log.d("SwA", "Weather URL ["+url2Call+"]");
final Weather result = new Weather();
StringRequest req = new StringRequest(Request.Method.GET, url2Call, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
parseResponse(s, result);
listener.onWeatherResponse(result);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
rq.add(req);
}
private static Weather parseResponse (String resp, Weather result) {
Log.d("SwA", "Response ["+resp+"]");
try {
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setInput(new StringReader(resp));
String tagName = null;
String currentTag = null;
int event = parser.getEventType();
boolean isFirstDayForecast = true;
while (event != XmlPullParser.END_DOCUMENT) {
tagName = parser.getName();
if (event == XmlPullParser.START_TAG) {
if (tagName.equals("yweather:wind")) {
// Log.d("SwA", "Tag [Wind]");
result.wind.chill = Integer.parseInt(parser.getAttributeValue(null, "chill"));
result.wind.direction = Integer.parseInt(parser.getAttributeValue(null, "direction"));
result.wind.speed = (int) Float.parseFloat(parser.getAttributeValue(null, "speed"));
}
else if (tagName.equals("yweather:atmosphere")) {
// Log.d("SwA", "Tag [Atmos]");
result.atmosphere.humidity = Integer.parseInt(parser.getAttributeValue(null, "humidity"));
result.atmosphere.visibility = Float.parseFloat(parser.getAttributeValue(null, "visibility"));
result.atmosphere.pressure = Float.parseFloat(parser.getAttributeValue(null, "pressure"));
result.atmosphere.rising = Integer.parseInt(parser.getAttributeValue(null, "rising"));
}
else if (tagName.equals("yweather:forecast")) {
// Log.d("SwA", "Tag [Fore]");
if (isFirstDayForecast) {
result.forecast.code = Integer.parseInt(parser.getAttributeValue(null, "code"));
result.forecast.tempMin = Integer.parseInt(parser.getAttributeValue(null, "low"));
result.forecast.tempMax = Integer.parseInt(parser.getAttributeValue(null, "high"));
isFirstDayForecast = false;
}
}
else if (tagName.equals("yweather:condition")) {
// Log.d("SwA", "Tag [Condition]");
result.condition.code = Integer.parseInt(parser.getAttributeValue(null, "code"));
result.condition.description = parser.getAttributeValue(null, "text");
result.condition.temp = Integer.parseInt(parser.getAttributeValue(null, "temp"));
result.condition.date = parser.getAttributeValue(null, "date");
}
else if (tagName.equals("yweather:units")) {
// Log.d("SwA", "Tag [units]");
result.units.temperature = "°" + parser.getAttributeValue(null, "temperature");
result.units.pressure = parser.getAttributeValue(null, "pressure");
result.units.distance = parser.getAttributeValue(null, "distance");
result.units.speed = parser.getAttributeValue(null, "speed");
}
else if (tagName.equals("yweather:location")) {
result.location.name = parser.getAttributeValue(null, "city");
result.location.region = parser.getAttributeValue(null, "region");
result.location.country = parser.getAttributeValue(null, "country");
}
else if (tagName.equals("image"))
currentTag = "image";
else if (tagName.equals("url")) {
if (currentTag == null) {
result.imageUrl = parser.getAttributeValue(null, "src");
}
}
else if (tagName.equals("lastBuildDate")) {
currentTag="update";
}
else if (tagName.equals("yweather:astronomy")) {
result.astronomy.sunRise = parser.getAttributeValue(null, "sunrise");
result.astronomy.sunSet = parser.getAttributeValue(null, "sunset");
}
}
else if (event == XmlPullParser.END_TAG) {
if ("image".equals(currentTag)) {
currentTag = null;
}
}
else if (event == XmlPullParser.TEXT) {
if ("update".equals(currentTag))
result.lastUpdate = parser.getText();
}
event = parser.next();
}
}
catch(Throwable t) {
t.printStackTrace();
}
return result;
}
private static String makeQueryCityURL(String cityName) {
// We remove spaces in cityName
cityName = cityName.replaceAll(" ", "%20");
return YAHOO_GEO_URL + "/places.q(" + cityName + "%2A);count=" + Config.MAX_CITY_RESULT + "?appid=" + APPID;
}
private static String makeWeatherURL(String woeid, String unit) {
return YAHOO_WEATHER_URL + "?w=" + woeid + "&u=" + unit;
}
/* Pubblic listener interface */
public static interface WeatherClientListener {
public void onWeatherResponse(Weather weather);
}
}
我的日志文件
E/AndroidRuntime(14436): java.lang.NullPointerException
01 E/AndroidRuntime(14436): 在 com.ocs76584.cityinfo.Activity.WeatherActivity$2.onWeatherResponse(WeatherActivity.java:135) 01-10 18:20:01.346: E/AndroidRuntime(14436): 在 com.ocs76584.cityinfo.Provider.YahooClient$1.onResponse(YahooClient.java:106) 01-10 18:20:01.346: E/AndroidRuntime(14436): 在 com.ocs76584.cityinfo.Provider.YahooClient$1.onResponse(YahooClient.java:1) 01-10 18:20:01.346: E/AndroidRuntime(14436): 在 com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60) 01-10 18:20:01.346: E/AndroidRuntime(14436): 在 com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30) 01-10 18:20:01.346: E/AndroidRuntime(14436): 在 com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 01-10 18:20:01.346: E/AndroidRuntime(14436): 在 android.os.Handler.handleCallback(Handler.java:615) 01-10 18:20:01.346: E/AndroidRuntime(14436): 在 android.os.Handler.dispatchMessage(Handler.java:92) 01-10 18:20:01.346: E/AndroidRuntime(14436): 在 android.os.Looper.loop(Looper.java:137) 01-10 18:20:01.346: E/AndroidRuntime(14436): 在 android.app.ActivityThread.main(ActivityThread.java:4895) 01-10 18:20:01.346:E/AndroidRuntime(14436):在 java.lang.reflect.Method.invokeNative(本机方法) 01-10 18:20:01.346: E/AndroidRuntime(14436): 在 java.lang.reflect.Method.invoke(Method.java:511) 01-10 18:20:01.346: E/AndroidRuntime(14436): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 01-10 18:20:01.346: E/AndroidRuntime(14436): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) 01-10 18:20:01.346:E/AndroidRuntime(14436):在 dalvik.system.NativeStart.main(本机方法)
某处,不在您显示的代码中,您正在调用 getWeather(String, String, RequestQueue, Listener)
并为 Listener
设置 null
值.