Настройка из строки[] — исключение nullpointerexception

#java #android #eclipse #nullpointerexception

#java #Android #затмение #исключение nullpointerexception

Вопрос:

Eclipse, java — я пытаюсь создать setAdapter для создания listview из строки [], которая была сгенерирована в классе AsyncTask для создания sqlconnection. Можете ли вы помочь мне решить эту проблему?

Мой код:

         listaMontanha = (ListView) findViewById(R.id.lstmontanharussa);
    CriarMontanharussa();
    //listaMontanha.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, horariosMontanha));

}

public void CriarMontanharussa(){
    LerMontanha montanha = new LerMontanha();
    montanha.execute();
}

public class LerMontanha extends AsyncTask<String, Void, String> {

    int contador=0;

    @Override
    protected String doInBackground(String... urls) {

      String response = null, codigo = null, hora, estado;
      int qt = 0;

      try {

            Class.forName("com.mysql.jdbc.Driver");  
            System.out.println("driver conectado");
            Connection con = DriverManager.getConnection("jdbc:mysql://10.0.2.2:3306/savetime", "root", "root");
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("select cd_brinquedo from brinquedo where nm_brinquedo = 'montanha russa'");
            if (rs.next()) {
                codigo = rs.getString(1);
            }
            System.out.println("CODIGO= "  codigo );
            ResultSet rs1 = st.executeQuery("select hh_inicio_rodada from rodada where cd_brinquedo = "   codigo);
            while(rs1.next()) {

                hora = rs1.getString(1);
                System.out.println("hora= "   hora);
                Statement stmt = con.createStatement();
                ResultSet rs2 = stmt.executeQuery("select COUNT(*) from solucaoingressorodada where cd_brinquedo = "   codigo   " and hh_inicio_rodada = '"   hora  "'");
                if (rs2.next()) {
                    qt = rs2.getInt(1);
                }
                System.out.println("qt= "   qt);
                if (qt<10){
                    estado="Disponível";
                } else {
                    estado ="Fila lotada";
                }
                horariosMontanha[contador] = hora   "         "   estado;
                contador= contador 1;
            }
            rs1.close();
            st.close();
            con.close();

      }
      catch(Exception e) {
          e.printStackTrace();
          System.out.println("ERRO: "   e.toString());
      }

    return response;
    }

    @Override
    protected void onPostExecute(String resultado) {
        for (int i = 0; i < contador; i  ){
            System.out.println(horariosMontanha[i]);
        }
    }
}
  

logcat:

 06-22 00:03:06.462: I/System.out(1196): driver conectado
06-22 00:03:07.261: I/System.out(1196): CODIGO= 1
06-22 00:03:07.371: I/System.out(1196): hora= 12:00:00
06-22 00:03:07.381: I/System.out(1196): qt= 1
06-22 00:03:07.391: I/System.out(1196): hora= 12:30:00
06-22 00:03:07.412: I/System.out(1196): qt= 0
06-22 00:03:07.431: I/System.out(1196): 12:00:00         Disponível
06-22 00:03:07.431: I/System.out(1196): 12:30:00         Disponível
06-22 00:03:07.511: D/AndroidRuntime(1196): Shutting down VM
    06-22 00:03:07.511: W/dalvikvm(1196): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
    06-22 00:03:07.651: E/AndroidRuntime(1196): FATAL EXCEPTION: main
    06-22 00:03:07.651: E/AndroidRuntime(1196): java.lang.NullPointerException
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.widget.AbsListView.obtainView(AbsListView.java:2255)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.widget.ListView.measureHeightOfChildren(ListView.java:1244)
06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.widget.ListView.onMeasure(ListView.java:1156)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.view.View.measure(View.java:15172)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.widget.RelativeLayout.measureChild(RelativeLayout.java:602)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:415)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.view.View.measure(View.java:15172)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4816)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.view.View.measure(View.java:15172)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:833)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.view.View.measure(View.java:15172)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4816)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2148)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.view.View.measure(View.java:15172)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1850)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1102)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1275)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4214)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.view.Choreographer.doCallbacks(Choreographer.java:555)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.view.Choreographer.doFrame(Choreographer.java:525)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.os.Handler.handleCallback(Handler.java:615)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.os.Handler.dispatchMessage(Handler.java:92)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.os.Looper.loop(Looper.java:137)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at android.app.ActivityThread.main(ActivityThread.java:4745)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at java.lang.reflect.Method.invokeNative(Native Method)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at java.lang.reflect.Method.invoke(Method.java:511)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    06-22 00:03:07.651: E/AndroidRuntime(1196):     at dalvik.system.NativeStart.main(Native Method)
  

Комментарии:

1. Не устанавливайте адаптер, пока не убедитесь, что он находится в допустимом состоянии (и остается в допустимом состоянии). Кажется, вы хотите создать представление для элемента, который имеет значение null.

Ответ №1:

Ваша проблема в том, что вы не принимаете во внимание асинхронный характер AsyncTask . Вы вызываете свой execute метод LerMontanha montanha объекта и сразу устанавливаете адаптер. Исключение NullPointerException возникает из-за того, что вы пытаетесь использовать массив horariosMontanha , но когда вы пытаетесь его использовать, он все равно ссылается null . Т.е. у целого фрагмента кода в LerMontanha doInBackground не было возможности обновить эту переменную.

Кроме того, поскольку вы обновляете horariosMontanha из двух потоков (потока пользовательского интерфейса и потока, в котором doInBackground выполняется), вы рискуете столкнуться с множеством проблем.

Эффекты AsyncTask ‘s должны произойти, onPostExecute и как только массив будет готов, установите адаптер.

Комментарии:

1. О, я понимаю. Так должен ли я выполнять все действия в onPostExecute из AsyncTask, включая setAdapter ? Или как я мог бы сначала выполнить все AsyncTask, а затем setAdapter?

2. Одним из вариантов было бы изменить вашу AsyncTask таким образом, чтобы она возвращала массив из doInBackground (и этот массив передается в onPostExecute) и onPostExecute использовать этот массив для настройки адаптера. Необходимо соблюдать осторожность, чтобы при запуске onPostExecute действие все еще находилось в допустимом состоянии (т. Е. Не устанавливайте адаптер, если действие было уничтожено и т.д.)

3. Большое вам спасибо, я сделал то, что вы сказали, и работал!