gpt4 book ai didi

java - OpenWeatherMap API : Encounter NullPointerException

转载 作者:行者123 更新时间:2023-12-01 17:46:45 25 4
gpt4 key购买 nike

我正在 Android Studio 上构建一个应用程序,借助 OpenWeatherMap 及其提供的 API,该应用程序可以实时检索天气信息。

问题是,我使用的两部手机具有不同的 SDK。一个是 SDK 23/Android 6.0,另一个是 SDK 28/Android 9.0。

目前在使用 SDK 23 的手机上没有问题。但是,在使用 SDK 28 的手机上,我遇到 NullPointerException 错误。我的第二个 Activity 允许我显示城市 X 的信息及其天气信息。所以,最后我在使用 SDK 28 的手机上遇到的错误是:

java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference

我研究了很多东西,看看它可能来自哪里,如果它不是我的 AsyncTask 或其他什么,但我真的没有看到它。

知道在具有最旧版本 Android 的手机上,它可以很好地从我的 editText 检索信息,但在最新版本上,它根本无法检索该信息,并且 nullpointerException 必须来自那里。

你知道这可能来自哪里吗?

这是我的 AsyncTask :

public class ExecuteTask extends AsyncTask<String, Void, String> {


@Override
protected String doInBackground(String... strings) {
HttpURLConnection con = null ;
InputStream is = null;

try {
con = (HttpURLConnection) ( new URL(strings[0])).openConnection();
con.setRequestMethod("GET");
con.setDoInput(true);
con.setDoOutput(true);
con.connect();

// Let's read the response
StringBuffer buffer = new StringBuffer();
is = con.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = null;
while ( (line = br.readLine()) != null )
buffer.append(line + "\r\n");

is.close();
con.disconnect();
return buffer.toString();
}
catch(Throwable t) {
t.printStackTrace();
}
finally {
try { is.close(); } catch(Throwable t) {}
try { con.disconnect(); } catch(Throwable t) {}
}

return null;
}

@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
try {
String message = "";
String degre="";
String idMeteo="";

JSONObject jsonObject = new JSONObject(s);


String infoWeatherToday = jsonObject.getString("weather");


JSONObject WeatherTemperature = jsonObject.getJSONObject("main");
Integer deg = WeatherTemperature.getInt("temp");

deg = deg - 273;


JSONArray array = new JSONArray(infoWeatherToday);
int tablongueur=array.length();


for (int i = 0; i < tablongueur; i++) {
JSONObject jsonSecondary = array.getJSONObject(i);


String main = "";
//Integer id;


main = jsonSecondary.getString("main");
// id = jsonSecondary.getInt("id");

switch (main) {
case "Clouds":
main = "Nuageux";
PhotoMeteo.setImageResource(R.drawable.cloud);

break;
case "Clear":
main = "Ensoleillé";
PhotoMeteo.setImageResource(R.drawable.sun);

break;
case "Rain":
main = "Pluie";
PhotoMeteo.setImageResource(R.drawable.rain);

break;
case "Snow":
main = "Neige";
PhotoMeteo.setImageResource(R.drawable.snow);

break;
case "Smoke":
main = "Brouillard";
PhotoMeteo.setImageResource(R.drawable.smoke);

break;
case "Drizzle":
main = "Brumeux";
PhotoMeteo.setImageResource(R.drawable.drizzle);
break;
default:
main = "Météo introuvable !";
PhotoMeteo.setImageResource(R.drawable.ic_warning);
}


if (main != "" /*&& id != null*/) {
message += main + "\r\n";
degre += deg + "°C";
//idMeteo += "L'id de la météo est" + id;
}

}


if (message != "") {
resultWeather.setText(message);
resultDegre.setText(degre);
//resultIdMeteo.setText(idMeteo);
} else {
Toast.makeText(AccueilActivity.this, "Une erreur a eu lieu ", Toast.LENGTH_SHORT).show();
}


} catch (JSONException e) {
e.printStackTrace();
}
}

这是我从第一个名为 RegisterActivity 的 Activity 中保留的 Intent ,将其作为城市“名称”的参数

Intent intent = new Intent(RegisterActivity.this, AccueilActivity.class);
intent.putExtra(EXTRA_TEXT,cityField.getText().toString());
startActivity(intent);

在我的第二个 Activity 中,名为“AccueilActivity”

Intent intent = getIntent();
if(intent!=null)
{
textViewVille.setText(intent.getStringExtra(EXTRA_TEXT));
ville = intent.getStringExtra(EXTRA_TEXT);
FindWeather();

}

我的最终函数名为FindWeather,它执行 AsyncTask

public void FindWeather() {
cityToFind = ville;

try {
ExecuteTask tasky = new ExecuteTask();
tasky.execute("http://api.openweathermap.org/data/2.5/weather?q=" + cityToFind + "&APPID={MYAPKKEY}&LANG=fr&UNITS=metric");
} catch (Exception e) {
e.printStackTrace();
}

}

只是我不会向您提供我的 APK key 的值,因为它不是什么有趣的东西,但该值存在于初始代码中。

如果我还有最后一件事要添加,ville 是一个简单的 TextView,cityToFind 是第一个 Activity 中我的 editText 的值。

如果您需要我的源代码中的任何内容,我可以为您提供更多。

谢谢。

最佳答案

如果您的 HTTP 代码中有任何异常,

doInBackground返回 null

它作为参数传递给onPostExecute

然后,您尝试构造一个 JSONObject(null),这是一个无效参数

<小时/>

总而言之,请选择更高级别的内置容错的 HTTP 库

Comparison of Android networking libraries: OkHTTP, Retrofit, and Volley

<小时/>

我还建议在该类之外编写单元测试,并从 IDE 而不是设备运行它们,以便验证网络调用是否确实有效。

关于java - OpenWeatherMap API : Encounter NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60855220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com