getResources 中的 NullPointerException

Posted

技术标签:

【中文标题】getResources 中的 NullPointerException【英文标题】:NullPointerException in getResources 【发布时间】:2013-09-21 04:57:37 【问题描述】:

我有活动和课程。在活动中我执行 HTTP GET 请求 (HttpClass.java),然后在 GetMethod.java 中执行 Asynctask。在 onPostExecute 函数中,我想返回活动并使用 JSON 解析数据。它可以工作,但是当我尝试以编程方式为每个数据数组项创建带有 textview 和按钮的布局时,它会抛出 NullPointerException。

代码:

HttpClass.java

@Override
protected void onCreate (Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.httplayout);
    cont = this;
    ll = (LinearLayout) findViewById(R.id.llHttp);
    sv = (ScrollView) findViewById(R.id.svHttp);
    //httptv = (TextView) findViewById(R.id.tvHttp);
    font = Typeface.createFromAsset(getAssets(), "fontawesome-webfont.ttf");
    font2 = Typeface.createFromAsset(getAssets(), "OpenSans-Regular.ttf");
    GetMethod test = new GetMethod();
    test.execute(new String[] "url"); 


public void getResultData(String result) throws Exception 
    // TODO Auto-generated method stub
    resultdata = result;

    JSONObject jObject;
    jObject = new JSONObject(resultdata);

    //JSONObject object = jObject.getJSONObject("pharms");
    JSONArray jArray = jObject.getJSONArray("pharms");

for (int i = 0; i < jArray.length(); i++) 
    name = jArray.getJSONObject(i).getString("name").toString();
    phone = jArray.getJSONObject(i).getString("phone").toString();
    latitude = jArray.getJSONObject(i).getString("latitude").toString();
    longitude = jArray.getJSONObject(i).getString("longitude").toString();
    address = jArray.getJSONObject(i).getString("address").toString();

    RelativeLayout ll2 = new RelativeLayout(cont);
    //ll2.setOrientation(Orientation.ho)

    Button call = new Button(cont);
    call.setId(i+1);
    call.setClickable(true);
    call.setTypeface(font);
    call.setText(R.string.call);
    call.setTextColor(Color.rgb(0, 176, 128));
    call.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
    RelativeLayout.LayoutParams params1 = (RelativeLayout.LayoutParams)call.getLayoutParams();
    params1.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
    params1.setMargins(0, 25, 0, 0);
    call.setLayoutParams(params1);
    call.setOnClickListener(new OnClickListener() 
        @Override
        public void onClick(View v) 
              Intent callIntent = new Intent(Intent.ACTION_CALL);
                callIntent.setData(Uri.parse("tel:123456789"));
                startActivity(callIntent);
        
    );
    ll2.addView(call);
    TextView tv = new TextView(cont);
    tv.setId(i+1);
    tv.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
    RelativeLayout.LayoutParams params3 = (RelativeLayout.LayoutParams)tv.getLayoutParams();
    params3.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
    params3.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
    params3.setMargins(10, 25, 0, 0);
    tv.setLayoutParams(params3);
    tv.setText(name + "\n" + phone);
    tv.setTextSize(20);
    tv.setTypeface(font2);
    tv.setOnClickListener(new OnClickListener() 
        @Override
        public void onClick(View v) 

        
    );
    ll2.addView(tv);

    ll.addView(ll2);


这是 GetMethod.java 类

@Override
protected String doInBackground(String... urls)
    BufferedReader in = null;
    String data = null;
      for (String url : urls) 
          HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet(url);
        try 
            HttpResponse response = client.execute(request);
            in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            StringBuffer sb = new StringBuffer("");
            String l = "";
            String nl = System.getProperty("line.separator");
            while ((l = in.readLine()) != null) 
                sb.append(l + nl);
            
            in.close();
            data = sb.toString();               
            return data;
         catch (Exception e) 
          e.printStackTrace();
        
      
      return data;


 @Override
    protected void onPostExecute(String result) 
        HttpClass hc = new HttpClass();
        try 
            hc.getResultData(result);
         catch (Exception e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
    

编辑:LogCat 日志

    09-17 01:35:53.955: W/System.err(18700):          java.lang.NullPointerException 
    09-17 01:35:53.980:    W/System.err(18700):     at    android.view.ViewConfiguration.get(ViewConfiguration.java:332) 
    09-17    01:35:53.980: W/System.err(18700):     at    android.view.View.<init>(View.java:3322) 
    09-17 01:35:53.980:    W/System.err(18700):     at    android.view.ViewGroup.<init>(ViewGroup.java:421) 
    09-17 01:35:53.980:    W/System.err(18700):     at    android.widget.RelativeLayout.<init>(RelativeLayout.java:180) 
    09-17    01:35:53.980: W/System.err(18700):     at    com.example.behealthy.HttpClass.getResultData(HttpClass.java:77)
    09-17 01:35:53.980: W/System.err(18700):    at    com.example.behealthy.GetMethod.onPostExecute(GetMethod.java:44)
    09-17 01:35:53.980: W/System.err(18700):    at    com.example.behealthy.GetMethod.onPostExecute(GetMethod.java:1) 
    09-17    01:35:53.980: W/System.err(18700):     at    android.os.AsyncTask.finish(AsyncTask.java:631) 
    09-17 01:35:53.980:    W/System.err(18700):     at    android.os.AsyncTask.access$600(AsyncTask.java:177) 
    09-17    01:35:53.980: W/System.err(18700):     at    android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
    09-17 01:35:53.980: W/System.err(18700):    at    android.os.Handler.dispatchMessage(Handler.java:99) 
    09-17    01:35:53.980: W/System.err(18700):     at    android.os.Looper.loop(Looper.java:137) 
    09-17 01:35:53.980:    W/System.err(18700):     at    android.app.ActivityThread.main(ActivityThread.java:4898) 
    09-17    01:35:53.985: W/System.err(18700):     at    java.lang.reflect.Method.invokeNative(Native Method) 
    09-17    01:35:53.985: W/System.err(18700):     at    java.lang.reflect.Method.invoke(Method.java:511) 
    09-17 01:35:53.985:    W/System.err(18700):     at    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
    09-17 01:35:53.985: W/System.err(18700):    at    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
    09-17    01:35:53.985: W/System.err(18700):     at    dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

Logcat 说是 NullPointerException in RelativeLayout ll2 = new RelativeLayout(cont); 这不可能是NPE 出现的地方。但是,这可能是它的原因,请发布 logcat,以便我们可以看到它的确切位置。 什么是HttpClass?您的 Activity 在您的方法所在的位置被称为 HttpActivity 对不起,打错了,activity被称为HttpClass。添加logcat日志 我认为可能是这样,它发生了。请参阅我提供的答案。这应该可以满足您的需求。 【参考方案1】:

像这样实例化 Activity 是错误的,这就是你得到 NPE 的原因

  HttpClass hc = new HttpClass();
    try 
        hc.getResultData(result);

这显然是一个单独的类,所以您要做的是创建一个interface,以便在任务完成时进行回调。

This answer 给出了一个使用interfaceAsyncTask 的示例。

如果它是您的 Activity 的内部类,那么您可以直接从 onPostExecute() 调用该函数,但如果您需要它是一个单独的文件,那么您需要按照链接中的示例进行操作。

【讨论】:

它有效,谢谢。但是还有另一个问题。函数 call.onClick 未被调用。你能帮助我吗?还是我应该开始新话题? 嗯...不完全确定副手。你在那里设置了一个断点以确保它不会进入?我不确定您是否可以这样做,或者您是否需要通过执行call.setOnClickListener(this); 来设置onClick(),然后将onClick() 放在方法之外。 这样一个简单的决定)将 onClick() 放在外面是有效的。谢谢! 不客气……很高兴它的工作,我们都学到了一些东西。这就是 SO 的魔力 :)

以上是关于getResources 中的 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

Android内存重启之静态变量被回收导致nullPoint问题

解决报错Failed to start bean ‘documentationPluginsBootstrapper‘; nested exception is java.lang.NullPoint

Android中ViewPager + Fragment使用ButterKnife注解时出现空指针NullPoint的情况

Java中的getResource()方法,及路径相关问题

getResources 中的 NullPointerException

java applicationContext.getResource中的资源路径