2013-08-14 6 views
0

Я исследовал эту ошибку здесь и в других местах, но причины кажутся очень разнообразными. Я новичок и собрал примитивное приложение погоды для практики. Введите город и штат, и он выходит на Weatherunderground, вытягивает XML-канал, анализирует его и отображает несколько точек данных. Он был резьбовым и работал нормально. Сегодня я добавил намерение открыть новый второй экран и отобразить там данные. Краш. Не знаю, почему. Вот журнал ошибок. Я тоже не смог выполнить некоторые условия в журнале.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(); 
    } 
} 
+1

Ну, что код здесь: 'WeatherMainActivity.java: 31'? – kabuko

+0

У вас есть проблема с WeatherMainActivity.java:31, но без кода мы не можем много сделать. – Naroh

+0

В «WeatherMainActivity.java» есть исключение «null pointer». сохраняйте точку останова в классе и отлаживайте ее. Вы найдете причину этой проблемы. –

ответ

0

Вы хотите, чтобы убедиться, что новая деятельность определяется в файле AndroidManifest.xml. В минимальной степени это было бы примерно так:

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

Пожалуйста, отправьте код своей основной деятельности по погоде для получения более подробной информации.

+0

Спасибо - это в манифесте – Glenn

+0

Вы создали экземпляр «i» в качестве переменной-члена? Я бы рекомендовал не делать startActivity (i); но вместо этого создайте экземпляр объекта во время выполнения в коде handleMessage. (Intent i = new Intent (..), затем putExtra(), затем startactivity() ...) – MiStr

+0

OK MiStr - это было сделано. Для перемещения экземпляра требуется изменить контекст из этого метода getApplicationContext(), а затем он запускается в первый раз. – Glenn

0

WeatherMainActivity.java:31

Вы создаете Intent для деятельности, которая не найденный Android.

Это мое первое впечатление при просмотре журнала ошибок.

Вы можете пойти и посмотреть, что вызывает NullPE в ContextWrapper.getPackageName (ContextWrapper.java:135)

Это наиболее вероятно, ошибка конфигурации, как сказал 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) 
Смежные вопросы