首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenWeatherMap API :遇到NullPointerException

OpenWeatherMap API :遇到NullPointerException
EN

Stack Overflow用户
提问于 2020-03-25 18:35:36
回答 1查看 118关注 0票数 0

我正在Android上构建一个应用程序,通过OpenWeatherMap和他们提供的API实时检索天气信息。

问题是,我用的是两部带有不同SDK的手机。一个是SDK 23 /Android6.0,另一个是SDK 28 /Android9.0。

目前我正在用SDK 23打电话,我没有问题。但是,在使用SDK 28的电话中,我有一个NullPointerException错误。我的第二个活动允许我显示X城市的信息和它的天气信息。最后,我在使用SDK 28的电话中遇到的错误是:

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'int java.lang.String.length()‘

我已经调查了很多事情,看看如果不是我的AsyncTask或者其他什么的话,它会从哪里来,但是我真的看不到它。

知道在手机上使用最老版本的安卓,它可以很好地从我的editText中检索信息,而在最近的版本中,它根本不检索它,而nullpointerException必须来自那里。

你知道这可能是从哪里来的吗?

这是我的AsyncTask:

代码语言:javascript
复制
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的意图,将其作为城市“名称”的参数

代码语言:javascript
复制
Intent intent = new Intent(RegisterActivity.this, AccueilActivity.class);
                intent.putExtra(EXTRA_TEXT,cityField.getText().toString());
                startActivity(intent);

在我的第二次活动叫做"AccueilActivity"

代码语言:javascript
复制
Intent intent = getIntent();
    if(intent!=null)
    {
        textViewVille.setText(intent.getStringExtra(EXTRA_TEXT));
        ville = intent.getStringExtra(EXTRA_TEXT);
        FindWeather();

    }

最后一个函数叫做FindWeather,它执行AsyncTask

代码语言:javascript
复制
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键的值,因为它不是什么有趣的东西,但它的值存在于初始代码中。

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

如果你需要我的源代码,我可以给你更多。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-03-25 18:40:52

如果您的HTTP代码中有任何异常,doInBackground将转到return null

作为参数传递给onPostExecute

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

总之,请选择一个具有内置于

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60855220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档