尝试在空对象引用上调用虚拟方法'int java.lang.String.length()'。无效的API地址崩溃

艾登:

我还是Android编程的新手,我一直在尝试制作一个简单的气象应用程序进行练习。当我输入有效的城市名称时,此代码可以正常工作,但是当名称无效时,我想使用toast向用户显示错误的。但这导致崩溃,我尝试删除了toast,但我的应用仍然崩溃。

这是代码

public class MainActivity extends AppCompatActivity {

EditText cityName;
TextView resultTextView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    cityName = (EditText) findViewById(R.id.cityName);
    resultTextView = (TextView) findViewById(R.id.resultTextView);

}


public void findWeather(View view)
{
    Log.i("Button", "pressed");


    InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    mgr.hideSoftInputFromWindow(cityName.getWindowToken(), 0);



    try {

        String encodedCityName = URLEncoder.encode(cityName.getText().toString(), "UTF-8");
        DownloadTask task = new DownloadTask();
        task.execute("http://api.openweathermap.org/data/2.5/weather?q=" + encodedCityName +"&appid=***");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        Toast.makeText(getApplicationContext(), "Could not find city", Toast.LENGTH_LONG);

    }

}


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

    @Override
    protected String doInBackground(String... strings) {

        String result = "";
        URL url;
        HttpURLConnection urlConnection;

        try {
            url = new URL(strings[0]);
            urlConnection = (HttpURLConnection) url.openConnection();
            InputStream in = urlConnection.getInputStream();
            InputStreamReader reader = new InputStreamReader(in);

            int data = reader.read();
            while(data != -1)
            {
                char current = (char) data;
                result += current;
                data = reader.read();
            }
            return  result;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);

        try{
            String message = "";
            JSONObject jsonObject = new JSONObject(s);
            String weatherInfo = jsonObject.getString("weather");
            Log.i("weather", weatherInfo);

            JSONArray arr = new JSONArray(weatherInfo);

            for(int i = 0; i < arr.length(); i++)
            {
                JSONObject jsonPart = arr.getJSONObject(i);

                String main = "";
                String description = "";

                main = jsonPart.getString("main");
                description = jsonPart.getString("description");

                if (!main.isEmpty() && !description.isEmpty())
                {
                    message += main + ": " + description + "\r\n";

                }
            }

            if(!message.isEmpty())
            {
                resultTextView.setText(message);

            }
            else
            {
                Toast.makeText(getApplicationContext(), "Could not find city", Toast.LENGTH_LONG);
            }

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


    }
}

错误消息

12-22 22:11:51.204 4858-4858 / com.example.aiden.whatstheweather E / Android运行时:致命异常:主进程:com.example.aiden.whatstheweather,PID:4858

java.lang.NullPointerException:尝试在org.json.JSONTokener上的org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)上的null对象引用上调用虚拟方法'int java.lang.String.length()'。 org.json.JSONObject处的nextValue(JSONTokener.java:94).com.example.aiden.whatstheweather.MainActivity $ DownloadTask.onPostExecute处的org.json.JSONObject。(JSONObject.java:176)处的nextValue(JSONTokener.java:94) (MainActivity.java:102),位于com.example.aiden.whatstheweather.MainActivity $ DownloadTask.onPostExecute(MainActivity.java:65),位于android.os.AsyncTask.finish(AsyncTask.java:695),位于android.os.AsyncTask。 android.os.Looper.loop(Looper)处的android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:712)处的-wrap1(未知源:0)android.os.Handler.dispatchMessage(Handler.java:105)处的.java:164),请访问android.app.ActivityThread。com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:240)处java.lang.reflect.Method.invoke(本地方法)处的main(ActivityThread.java:6541) os.ZygoteInit.main(ZygoteInit.java:767)

ADM:

如果发生任何异常,doInBackground()将返回null如下处理。

  @Override
protected void onPostExecute(String s) {
    super.onPostExecute(s);
   if(s!=null){
    // Do you work here on success
  }else{
     // null response or Exception occur 
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

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

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

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

安卓。尝试在空对象引用上调用虚拟方法'int java.lang.String.length()'

JSONArray 异常:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“int java.lang.String.length()”

尝试在执行 Swiperrefresh Android 时在 Volley 上的空对象引用上调用虚拟方法“int java.lang.String.length()”

尝试在空对象引用上调用虚拟方法'android.content.Context.getSharedPreferences(java.lang.String,int)'

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“int com.xxHelper.SharedPref.GetInt(java.lang.String)”

尝试在空对象引用上调用虚拟方法“int java.lang.Integer.intValue()”

尝试在空对象引用上调用虚拟方法“getSystemService(java.lang.String)”

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

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

尝试在空对象引用上调用虚拟方法'java.lang.String java.lang.String.toUpperCase()'

原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'boolean java.lang.String.isEmpty()'

尝试在空对象引用上调用虚拟方法'boolean java.lang.String.contains(java.lang.CharSequence)'

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

com.android.volley.VolleyError:java.lang.NullPointerException:尝试在对象引用上调用虚拟方法“ java.lang.String.length()”

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“int java.io.InputStream.read(byte[])”

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.CardView.setVisibility(int)”

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'int android.view.View.getImportantForAccessibility()'

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'int android.view.ViewGroup.getPaddingLeft()'

NullPointerException:尝试在空对象引用上调用虚拟方法'java.lang.Object android.util.SparseArray.get(int)'

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ void android.widget.ImageView.setImageResource(int)”

尝试在空对象引用上调用虚拟方法“java.lang.String okhttp3.ResponseBody.string()”

尝试在空对象引用上调用虚拟方法'java.lang.String android.content.Context.getPackageName()'

尝试在空对象引用上调用虚拟方法'java.lang.String com.activeandroid.TableInfo.getIdName()'

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ java.lang.String java.lang.String.trim()”

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ java.lang.String java.lang.Object.toString()”

Android:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ java.lang.String java.lang.Object.toString()”