首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从url解析android中的JSON天气api时获取运行时异常

从url解析android中的JSON天气api时获取运行时异常
EN

Stack Overflow用户
提问于 2013-10-20 13:40:20
回答 2查看 344关注 0票数 0

我正在从一个url中解析Android中的JSON天气api。我正在成功地获得应用程序中解析的所有值。但是在显示仿真器上的值之后,应用程序崩溃了,我得到了运行时异常。

下面是我得到的logcat错误:

代码语言:javascript
运行
复制
10-20 09:34:26.040: E/AndroidRuntime(748): FATAL EXCEPTION: main
10-20 09:34:26.040: E/AndroidRuntime(748): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.work/com.example.work.SingleItemView}: java.lang.NullPointerException
10-20 09:34:26.040: E/AndroidRuntime(748):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2137)
10-20 09:34:26.040: E/AndroidRuntime(748):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
10-20 09:34:26.040: E/AndroidRuntime(748):  at android.app.ActivityThread.access$600(ActivityThread.java:141)
10-20 09:34:26.040: E/AndroidRuntime(748):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
10-20 09:34:26.040: E/AndroidRuntime(748):  at android.os.Handler.dispatchMessage(Handler.java:99)
10-20 09:34:26.040: E/AndroidRuntime(748):  at android.os.Looper.loop(Looper.java:137)
10-20 09:34:26.040: E/AndroidRuntime(748):  at android.app.ActivityThread.main(ActivityThread.java:5103)
10-20 09:34:26.040: E/AndroidRuntime(748):  at java.lang.reflect.Method.invokeNative(Native Method)
10-20 09:34:26.040: E/AndroidRuntime(748):  at java.lang.reflect.Method.invoke(Method.java:525)
10-20 09:34:26.040: E/AndroidRuntime(748):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-20 09:34:26.040: E/AndroidRuntime(748):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-20 09:34:26.040: E/AndroidRuntime(748):  at dalvik.system.NativeStart.main(Native Method)
10-20 09:34:26.040: E/AndroidRuntime(748): Caused by: java.lang.NullPointerException
10-20 09:34:26.040: E/AndroidRuntime(748):  at com.example.work.SingleItemView.<init>(SingleItemView.java:5)
10-20 09:34:26.040: E/AndroidRuntime(748):  at java.lang.Class.newInstanceImpl(Native Method)
10-20 09:34:26.040: E/AndroidRuntime(748):  at java.lang.Class.newInstance(Class.java:1130)
10-20 09:34:26.040: E/AndroidRuntime(748):  at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
10-20 09:34:26.040: E/AndroidRuntime(748):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2128)
10-20 09:34:26.040: E/AndroidRuntime(748):  ... 11 more

这是我的密码。

MainActivity.java:

代码语言:javascript
运行
复制
public class MainActivity extends Activity {
    // Declare Variables
    JSONObject jsonobject;
    JSONArray jsonarray;
    ListView listview;
    ListViewAdapter adapter;
    ProgressDialog mProgressDialog;
    ArrayList<HashMap<String, String>> arraylist;
    static String NAME = "id";
    static String TYPE = "description";
    static String child = "country";
    static String child1 = "temp";
    static String child2 = "temp_min";
    static String child3 = "temp_max";
    static String child4 = "pressure";
    static String child5 = "humidity";






    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Get the view from listview_main.xml
        setContentView(R.layout.activity_main);
        // Execute DownloadJSON AsyncTask
        new DownloadJSON().execute();
    }

    // DownloadJSON AsyncTask
    private class DownloadJSON extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
          super.onPreExecute();
            // Create a progressdialog
            mProgressDialog = new ProgressDialog(MainActivity.this);

            // Set progressdialog message
            mProgressDialog.setMessage("Loading...");
            mProgressDialog.setIndeterminate(false);
            // Show progressdialog
            mProgressDialog.show();
        }
        @Override
        protected Void doInBackground(Void...arg0) {
            // Create an array
            arraylist = new ArrayList<HashMap<String, String>>();
            // Retrieve JSON Objects from the given URL address
            jsonobject = JSONParser
                    .getJSONfromURL("http://api.openweathermap.org/data/2.5/weather?q=Germany");


            try {

                JSONObject child=jsonobject.getJSONObject("sys");
                HashMap<String, String> map1 = new HashMap<String, String>();

                map1.put(MainActivity.child, "Country - " +child.getString("country"));
                arraylist.add(map1);
                JSONObject child1=jsonobject.getJSONObject("main");

                 HashMap<String, String> map2 = new HashMap<String, String>();

                map1.put(MainActivity.child1, "Temperature - " +child1.getString("temp"));
                map1.put(MainActivity.child2, "Minimum Temperature - " +child1.getString("temp_min"));
                map1.put(MainActivity.child3, "Maximum Temperature - " +child1.getString("temp_max"));
                map1.put(MainActivity.child4, "Pressure - " +child1.getString("pressure"));
                map1.put(MainActivity.child5, "Humidity - " +child1.getString("humidity"));
                arraylist.add(map2);

                // Locate the array name in JSON
                JSONArray jsonarray=jsonobject.getJSONArray("weather");
                for (int i = 0; i < jsonarray.length(); i++) {
                    HashMap<String, String> map = new HashMap<String, String>();
                    jsonobject = jsonarray.getJSONObject(i);

                    // Retrieve JSON Objects

                   map.put(MainActivity.NAME, "Id : "+jsonobject.getString("id"));
                   map.put(MainActivity.TYPE, "Description : "+jsonobject.getString("description"));

                    // Set the JSON Objects into the array
                    arraylist.add(map);
                }

               // }
            } catch (JSONException e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void args) {
            // Locate the listview in listview_main.xml
            listview = (ListView) findViewById(R.id.listview);
            // Pass the results into ListViewAdapter.java
            adapter = new ListViewAdapter(MainActivity.this, arraylist);
            // Set the adapter to the ListView
            listview.setAdapter(adapter);
            // Close the progressdialog
            mProgressDialog.dismiss();
        }
    }
}

SingleItemView.java:

代码语言:javascript
运行
复制
package com.example.work;
import android.content.Intent;
public class SingleItemView {
    Intent intent = getIntent();
    String id = intent.getStringExtra("name");
    String name = intent.getStringExtra("type");
    String child = intent.getStringExtra("child");
    String child1 = intent.getStringExtra("child1");
    String child2 = intent.getStringExtra("child2");
    String child3 = intent.getStringExtra("child3");
    String child4 = intent.getStringExtra("child4");
    String child5 = intent.getStringExtra("child5");

    private Intent getIntent() {
        // TODO Auto-generated method stub
        return null;
    }

}

ListViewAdapter.java:

代码语言:javascript
运行
复制
public class ListViewAdapter extends BaseAdapter {

    // Declare Variables
    Context context;
    LayoutInflater inflater;
    ArrayList<HashMap<String, String>> data;
    HashMap<String, String> resultp = new HashMap<String, String>();

    public ListViewAdapter(Context context,
            ArrayList<HashMap<String, String>> arraylist) {
        this.context = context;
        data = arraylist;

    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    public View getView(final int position, View convertView, ViewGroup parent) {
        // Declare Variables
        TextView id;
        TextView description;
        TextView country;
        TextView temp;
        TextView temp_min;
        TextView temp_max;
        TextView pressure;
        TextView humidity;
        //ImageView flag;

        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View itemView = inflater.inflate(R.layout.listview_item, parent, false);
        // Get the position
        resultp = data.get(position);

        // Locate the TextViews in listview_item.xml
        id = (TextView) itemView.findViewById(R.id.id);
        description = (TextView) itemView.findViewById(R.id.description);
        country = (TextView) itemView.findViewById(R.id.country);
        temp = (TextView) itemView.findViewById(R.id.temp);
        temp_min = (TextView) itemView.findViewById(R.id.temp_min);
        temp_max = (TextView) itemView.findViewById(R.id.temp_max);
        pressure = (TextView) itemView.findViewById(R.id.pressure);
        humidity = (TextView) itemView.findViewById(R.id.humidity);

        // Capture position and set results to the TextViews
        id.setText(resultp.get(MainActivity.NAME));
        description.setText(resultp.get(MainActivity.TYPE));
        country.setText(resultp.get(MainActivity.child));
        temp.setText(resultp.get(MainActivity.child1));
        temp_min.setText(resultp.get(MainActivity.child2));
        temp_max.setText(resultp.get(MainActivity.child3));
        pressure.setText(resultp.get(MainActivity.child4));
        humidity.setText(resultp.get(MainActivity.child5));
        // Capture ListView item click
        itemView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // Get the position
                resultp = data.get(position);
                Intent intent = new Intent(context, SingleItemView.class);
                // Pass all id data
                intent.putExtra("name", resultp.get(MainActivity.NAME));
                // Pass all main data
                intent.putExtra("type", resultp.get(MainActivity.TYPE));

                intent.putExtra("child", resultp.get(MainActivity.child));

                // Start SingleItemView Class
                context.startActivity(intent);

            }
        });
        return itemView;
    }
}

AndroidManifest.xml:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.work"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.work.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.example.work.SingleItemView"
            android:label="@string/app_name" >
        </activity>
    </application>

</manifest>

我得到了在我的应用程序中解析的所有值,但我不明白为什么它会崩溃。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-20 14:14:31

来自正式文件

要在Context.startActivity()中使用,所有活动类都必须在其包的AndroidManifest.xml中有相应的声明。

你有些地方是对的:

代码语言:javascript
运行
复制
<activity
    android:name="com.example.work.SingleItemView"
    android:label="@string/app_name" >
</activity>

但是这里有一个捕获点(Es):

  • SingleItemView而不是,是Activity类的子类/内部类;
  • 您定义了返回一个getIntentnull方法。这就是为什么你会得到一个NullPointerException
  • 来自SingleItemView的所有属性都是使用以下模式进行实例的:property = intent.getStringExtra("keyName");Intent intent = getIntent();将确保intentnull。因此,在调用空对象上的方法时,会有更多的NullPointerException
  • 您的所有String对象都将是null,因为您没有在intent上加载一些额外的内容。首先,您必须在intent.putExtra("key", stringObject)之前执行intent.getStringExtra("key")。因此,还有一些NullPointerException

首先,SingleItemView类:

代码语言:javascript
运行
复制
public class SingleItemView extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_activity_layout);

        Intent intent = getIntent();
        String id = intent.getStringExtra("name");
        String name = intent.getStringExtra("type");
        String child = intent.getStringExtra("child");
        String child1 = intent.getStringExtra("child1");
        String child2 = intent.getStringExtra("child2");
        String child3 = intent.getStringExtra("child3");
        String child4 = intent.getStringExtra("child4");
        String child5 = intent.getStringExtra("child5");
   }
}

我绝对肯定,您的代码需要更多的修补程序才能正常工作。

票数 1
EN

Stack Overflow用户

发布于 2013-10-20 14:03:43

它显然会崩溃,因为你在下面写了一行

代码语言:javascript
运行
复制
Intent intent = getIntent();

您还可以说getIntent()返回null。你想达到什么目的?

不管怎样,撞车的原因是我上面解释的。

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

https://stackoverflow.com/questions/19478040

复制
相关文章

相似问题

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