java.lang.RuntimeException:无法启动活动ComponentInfo

时间:2011-12-01 18:17:01

标签: android

我正在尝试编写一个高音扬声器,但编译时出错。

我不会忘记将我的活动添加到清单中。

以下是活动代码:

package fr.enstb.tp2;

import java.net.URL;
import java.util.ArrayList;

import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class TweetsActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ArrayList<Tweet> tweets = getTweets("android", 1);

        ListView listView = (ListView) findViewById(R.id.ListViewId);
        listView.setAdapter(new UserItemAdapter(this, R.layout.tweets_layout, tweets));
    }

    public class UserItemAdapter extends ArrayAdapter<Tweet> {
        private ArrayList<Tweet> tweets;

        public UserItemAdapter(Context context, int textViewResourceId, ArrayList<Tweet> tweets) {
            super(context, textViewResourceId, tweets);
            this.tweets = tweets;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;
            if (v == null) {
                LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.tweets_layout, null);
            }

            Tweet tweet = tweets.get(position);
            if (tweet != null) {
                TextView username = (TextView) v.findViewById(R.id.username);
                TextView message = (TextView) v.findViewById(R.id.message);
                ImageView image = (ImageView) v.findViewById(R.id.avatar);

                if (username != null) {
                    username.setText(tweet.username);
                }

                if(message != null) {
                    message.setText(tweet.message);
                }

                if(image != null) {
                    image.setImageBitmap(getBitmap(tweet.image_url));
                }
            }
            return v;
        }
    }

    public Bitmap getBitmap(String bitmapUrl) {
        try {
            URL url = new URL(bitmapUrl);
            return BitmapFactory.decodeStream(url.openConnection() .getInputStream()); 
        }
        catch(Exception ex) {return null;}
    }

    public ArrayList<Tweet> getTweets(String searchTerm, int page) {
        String searchUrl = "http://search.twitter.com/search.json?q=@" 
                            + searchTerm + "&rpp=100&page=" + page;

        ArrayList<Tweet> tweets = new ArrayList<Tweet>();

        HttpClient client = new  DefaultHttpClient();
        HttpGet get = new HttpGet(searchUrl);

        ResponseHandler<String> responseHandler = new BasicResponseHandler();

        String responseBody = null;
        try{
            responseBody = client.execute(get, responseHandler);
        }catch(Exception ex) {
            ex.printStackTrace();
        }

        JSONObject jsonObject = null;
        JSONParser parser=new JSONParser();

        try {
            Object obj = parser.parse(responseBody);
            jsonObject=(JSONObject)obj;

        }catch(Exception ex){
            Log.v("TEST","Exception: " + ex.getMessage());
        }

        JSONArray arr = null;

        try {
            Object j = jsonObject.get("results");
            arr = (JSONArray)j;
        }catch(Exception ex){
            Log.v("TEST","Exception: " + ex.getMessage());
        }

        for(Object t : arr) {
            Tweet tweet = new Tweet(
                    ((JSONObject)t).get("from_user").toString(),
                    ((JSONObject)t).get("text").toString(),
                    ((JSONObject)t).get("profile_image_url").toString()
                    );
            tweets.add(tweet);
        }

        return tweets;
    }

    public class Tweet {
        public String username;
        public String message;
        public String image_url;

        public Tweet(String username, String message, String url) {
            this.username = username;
            this.message = message;
            this.image_url = url;
        }
    }
}

这是日志痕迹:

: E/AndroidRuntime(884): FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{fr.enstb.tp2/fr.enstb.tp2.TweetsActivity}: java.lang.NullPointerException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
    at android.app.ActivityThread.startActivityNow(ActivityThread.java:1796)
    at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)
    at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347)
    at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:682)
    at android.widget.TabHost.setCurrentTab(TabHost.java:346)
    at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:150)
    at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:540)
    at android.view.View.performClick(View.java:3460)
    at android.view.View$PerformClick.run(View.java:13955)
    at android.os.Handler.handleCallback(Handler.java:605)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4340)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.NullPointerException
    at fr.enstb.tp2.TweetsActivity.getTweets(TweetsActivity.java:126)
    at fr.enstb.tp2.TweetsActivity.onCreate(TweetsActivity.java:36)
    at android.app.Activity.performCreate(Activity.java:4465)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
    ... 18 more

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

根据堆栈跟踪,getTweets()中的arr变量必须为null,因为此行中出现NullPointerException:for(Object t : arr)

使用调试器逐步执行代码,并查看从服务调用中获得的内容。