意图导致致命错误

时间:2013-08-14 18:20:40

标签: java android nullpointerexception

我在这里和其他地方研究过这个错误,但原因似乎很多样。 我是新手,并将一个原始的天气应用程序放在一起练习。输入一个城市和州,然后转到Weatherunderground,提取XML Feed,解析它并显示一些数据点。它是线程化的,工作正常。今天我添加了一个Intent来打开一个新的第二个屏幕并在那里显示数据。崩溃。不知道为什么。这是错误日志。我在日志中搜索了一些条款也没有成功。

    08-14 14:03:27.314: E/AndroidRuntime(950): FATAL EXCEPTION: main
    08-14 14:03:27.314: E/AndroidRuntime(950): java.lang.RuntimeException: Unable to   instantiate activity ComponentInfo{com.glenngilchrist.weatherapp/com.glenngilchrist.weatherapp.WeatherMainActivity}: java.lang.NullPointerException
    08-14 14:03:27.314: E/AndroidRuntime(950):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2137)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at android.app.ActivityThread.access$600(ActivityThread.java:141)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at android.os.Handler.dispatchMessage(Handler.java:99)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at android.os.Looper.loop(Looper.java:137)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at android.app.ActivityThread.main(ActivityThread.java:5103)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at java.lang.reflect.Method.invokeNative(Native Method)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at java.lang.reflect.Method.invoke(Method.java:525)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at dalvik.system.NativeStart.main(Native Method)
    08-14 14:03:27.314: E/AndroidRuntime(950): Caused by: java.lang.NullPointerException
    08-14 14:03:27.314: E/AndroidRuntime(950):  at android.content.ContextWrapper.getPackageName(ContextWrapper.java:135)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at android.content.ComponentName.<init>(ComponentName.java:75)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at android.content.Intent.<init>(Intent.java:3662)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at com.glenngilchrist.weatherapp.WeatherMainActivity.<init>(WeatherMainActivity.java:31)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at java.lang.Class.newInstanceImpl(Native Method)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at java.lang.Class.newInstance(Class.java:1130)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2128)
    08-14 14:03:27.314: E/AndroidRuntime(950):  ... 11 more

这是一些代码:

 public class WeatherMainActivity extends Activity implements OnClickListener  {

        String WunderURL = "http://api.wunderground.com/api/1d4c3256ea6ea9fa/conditions/q/";
        TextView tv;  // text box for retrieved data
        EditText city, state; // data entered by user
        Intent i = new Intent(this, WeatherDetailDisplay.class);

        //StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        Handler handler = new Handler()  {

            @Override
        public void handleMessage(Message msg) {
        tv = (TextView)findViewById(R.id.results);
        Bundle bundle = msg.getData();
        String string = bundle.getString("myKey");

        if (string.equals("Valid")) {
            // go to detail screen
            String strcity = bundle.getString("myCity");
            String strstate = bundle.getString("myState");
            String strtempF = bundle.getString("myTempF");
            i.putExtra("myCity", strcity);
            i.putExtra("myState", strstate);
            i.putExtra("myTempF", strtempF);
            startActivity(i);
        } else {
            tv.setText(string);
        }   
           }
       }; 

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

            //Button b = (Button)findViewById(R.id.button1);
            tv = (TextView)findViewById(R.id.results);
            city = (EditText)findViewById(R.id.city);
            state = (EditText)findViewById(R.id.state);

            city.setText("Burlington");
            state.setText("VT");

            //StrictMode.setThreadPolicy(policy);
      }

      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.weather_main, menu);
    return true;
      }

      @Override
      public void onClick(View view) {
          // run this is a different thread
          Runnable runnable = new Runnable() {
          public void run() {
              // build a URl and go out to the web for data
              String c = city.getText().toString();
              String s = state.getText().toString();

              StringBuilder url = new StringBuilder(WunderURL);
              url.append(s+"/"+c+".xml");
              String fullUrl = url.toString();

              Message msg = handler.obtainMessage();
              Bundle bundle = new Bundle();


              try{
                  URL weatherURL = new URL(fullUrl);
                  // set up an xmlreader to parse the data
                  SAXParserFactory spf = SAXParserFactory.newInstance();
                  SAXParser sp = spf.newSAXParser();
                  XMLReader xreader = sp.getXMLReader();
                  // tell the reader to user our handler class
                  XMLHandler xh = new XMLHandler();
                  xreader.setContentHandler(xh);

                  // now open the stream
                  xreader.parse(new InputSource(weatherURL.openStream()));
                  //String text = xh.GetInfoString();
                  String city = xh.getCity();
                  String state = xh.getState();
                  String tempF = xh.getTemp();


                  if (city.contains("null")) {
                      //tv.setText("Invalid Location");
                      bundle.putString("myKey", "Invalid Location");
                      bundle.putString("myCity", "");
                      bundle.putString("myState", "");
                      bundle.putString("myTempF", "");
                      msg.setData(bundle);
                      handler.sendMessage(msg);
                  } else {
                      //tv.setText(text);
                      bundle.putString("myKey", "Valid");
                      bundle.putString("myCity", city);
                      bundle.putString("myState", state);
                      bundle.putString("myTempF", tempF);
                      msg.setData(bundle);
                      handler.sendMessage(msg);
                  }

              } catch (Exception e) {
                  //tv.setText("error");
                  bundle.putString("myKey", "error");
                  bundle.putString("myCity", "");
                  bundle.putString("myState", "");
                  bundle.putString("myTempF", "");
                  msg.setData(bundle);
                  handler.sendMessage(msg);
              }
          }
      };
      Thread mythread = new Thread(runnable);
      mythread.start();
  } 
}

2 个答案:

答案 0 :(得分:0)

您需要确保在AndroidManifest.xml文件中定义了新活动。最低限度,它会是这样的:

<activity android:name=".TheNewActivityNameHere"/>

请发布主要天气活动的代码以获取更多详细信息。

答案 1 :(得分:0)

WeatherMainActivity.java:31

您正在为Android找不到的活动创建一个Intent。

这是我看到您的错误日志时的第一印象。

您可能想看看 ContextWrapper.getPackageName(ContextWrapper.java:135)

中导致NullPE的原因

这很可能是像MiStr所说的配置错误。我同意你的看法,比NPE更清楚的错误信息: - )

Caused by: java.lang.NullPointerException
    08-14 14:03:27.314: E/AndroidRuntime(950):  at android.content.ContextWrapper.getPackageName(ContextWrapper.java:135)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at android.content.ComponentName.<init>(ComponentName.java:75)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at android.content.Intent.<init>(Intent.java:3662)
    08-14 14:03:27.314: E/AndroidRuntime(950):  at com.glenngilchrist.weatherapp.WeatherMainActivity.<init>(WeatherMainActivity.java:31)