2016-12-24 100 views
0

我想动态地添加项目到列表视图。但是,我得到一个运行时异常。请帮助。全局变量“值”有问题吗?我试图通过打印日志进行调试,并且能够看到存储在变量中的值。当它返回结果(我使用它,因为我从数据库获取信息)时发生问题android从数据库中获取后返回null无法启动活动ComponentInfo:java.lang.NullPointerException:storage == null

它从数据库中获取良好,但是当它返回结果时,尝试块 int在函数结束时跳转到onther返回语句并且然后它崩溃

代码

public class choose_buffet_items extends AppCompatActivity { 
 
    String []categouries; 
 
    ArrayAdapter adapter; 
 
    private static int SPLASH_TIME_OUT=2000; 
 
    AlertDialog alertDialog; 
 
    private boolean loggedIn = false; 
 
    String type; 
 
    String result; 
 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_choose_buffet_items); 
 
     new JSONParse().execute(); 
 
     adapter = new ArrayAdapter<String>(this, 
 
       R.layout.buffet_list_view, categouries); 
 

 
     ListView listView = (ListView) findViewById(R.id.listView_buffetitem); 
 
     listView.setAdapter(adapter); 
 
     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
 
      @Override 
 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
 
       String s =(String)adapter.getItem(i); 
 
       if(s.equals("Drinks")) 
 
       { 
 
        Intent numbersIntent = new Intent(choose_buffet_items.this, buffet_drinks.class); 
 
        startActivity(numbersIntent); 
 
       } 
 
       else if(s.equals("Cakes")) 
 
       { 
 
        Intent numbersIntent = new Intent(choose_buffet_items.this, buffet_cake.class); 
 
        startActivity(numbersIntent); 
 
       } 
 
       else if(s.equals("Appetizers")) 
 
       { 
 
        Intent numbersIntent = new Intent(choose_buffet_items.this,buffet_appetizers.class); 
 
        startActivity(numbersIntent); 
 
       } 
 
       else {Intent numbersIntent = new Intent(choose_buffet_items.this, buffet_lunch.class); 
 
        startActivity(numbersIntent);} 
 

 
      } 
 
     }); 
 

 

 
     listView.setAdapter(adapter); 
 
    } 
 
    private class JSONParse extends AsyncTask<String, String, String> { 
 
     private ProgressDialog pDialog; 
 

 
     @Override 
 
     protected void onPreExecute() { 
 
      super.onPreExecute(); 
 
      alertDialog=new AlertDialog.Builder(choose_buffet_items.this).create(); 
 
      alertDialog.setTitle("Upadting Data"); 
 
      pDialog = new ProgressDialog(choose_buffet_items.this); 
 
      pDialog.setMessage("Getting Data ..."); 
 
      pDialog.setIndeterminate(false); 
 
      pDialog.setCancelable(true); 
 
      pDialog.show(); 
 

 

 
     } 
 

 

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

 

 

 
       String login_URL = "http://2f179dfb.ngrok.io/getcat.php"; 
 
       try { 
 

 
        //Fetching the boolean value form sharedpreferences 
 

 

 
        URL url = new URL(login_URL); 
 
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); 
 
        httpURLConnection.setRequestMethod("POST"); 
 
        httpURLConnection.setDoOutput(true); 
 
        httpURLConnection.setDoInput(true); 
 

 
        InputStream inputStream = httpURLConnection.getInputStream(); 
 
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "iso-8859-1")); 
 
        result = ""; 
 
        String line = ""; 
 
        while ((line = bufferedReader.readLine()) != null) { 
 
         result += line; 
 
        } 
 
        bufferedReader.close(); 
 
        inputStream.close(); 
 
        httpURLConnection.disconnect(); 
 
        Log.e("RESULT", result); 
 
        JSONObject jsonObject = new JSONObject(result); 
 

 
        JSONArray result1 = jsonObject.getJSONArray("result"); 
 
        categouries=new String[result1.length()]; 
 
        for (int i = 0; i < result1.length(); i++) { 
 
         JSONObject c = result1.getJSONObject(i); 
 
         String category = c.getString("buffCategory"); 
 
         categouries[i]=category; 
 
        } 
 

 
        return result; 
 

 

 
       } 
 
       catch (MalformedURLException e) { 
 
        e.printStackTrace(); 
 
       } catch (UnsupportedEncodingException e) { 
 
        e.printStackTrace(); 
 
       } catch (ProtocolException e) { 
 
        e.printStackTrace(); 
 
       } catch (IOException e) { 
 
        e.printStackTrace(); 
 
       } catch (JSONException e) { 
 
        e.printStackTrace(); 
 
       } 
 
       return result; 
 
      } 
 

 

 

 

 
     @Override 
 
     protected void onPostExecute(String r) { 
 
      adapter.notifyDataSetChanged(); 
 
      pDialog.dismiss(); 
 

 

 

 
     } 
 
    } 
 
}
logcat的

12-25 02:45:27.532 7109-7109/com.rematchka.weddinghall E/AndroidRuntime: FATAL EXCEPTION: main 
 
                     Process: com.rematchka.weddinghall, PID: 7109 
 
                     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rematchka.weddinghall/com.rematchka.weddinghall.choose_buffet_items}: java.lang.NullPointerException: storage == null 
 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
 
                      at android.app.ActivityThread.-wrap11(ActivityThread.java) 
 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
 
                      at android.os.Looper.loop(Looper.java:148) 
 
                      at android.app.ActivityThread.main(ActivityThread.java:5417) 
 
                      at java.lang.reflect.Method.invoke(Native Method) 
 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
 
                      Caused by: java.lang.NullPointerException: storage == null 
 
                      at java.util.Arrays$ArrayList.<init>(Arrays.java:38) 
 
                      at java.util.Arrays.asList(Arrays.java:155) 
 
                      at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:137) 
 
                      at com.rematchka.weddinghall.choose_buffet_items.onCreate(choose_buffet_items.java:49) 
 
                      at android.app.Activity.performCreate(Activity.java:6237) 
 
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
 
                      at android.app.ActivityThread.-wrap11(ActivityThread.java)  
 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
 
                      at android.os.Handler.dispatchMessage(Handler.java:102)  
 
                      at android.os.Looper.loop(Looper.java:148)  
 
                      at android.app.ActivityThread.main(ActivityThread.java:5417)  
 
                      at java.lang.reflect.Method.invoke(Native Method)  
 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
 
12-25 02:45:27.962 7109-7473/com.rematchka.weddinghall E/RESULT: {"result":[{"buffCategory":"Drinks"},{"buffCategory":"Cakes"},{"buffCategory":"Appetizers"},{"buffCategory":"Lunch"}]}

+2

添加logcat的,这样的人能看到飞机坠毁 – yanivtwin

+0

它崩溃,当它在doInBackground功能 –

+0

你想在后台做什么返回,因为你的结果变量是持有Json字符串,如果它直接传递给onPostExecute(),那么为什么你在doInBackground中解析JSON –

回答

1

此特定的异常( “存储== NULL”)当传递给ArrayAdapter数组参数(上下文,INT,T [])为空,则抛出。

在此行中onCreate方法:

adapter = new ArrayAdapter<String>(this, 
      R.layout.buffet_list_view, categouries); 

Categouries为空,你需要对它进行初始化,然后才做这一行。

1

你可以使用List<String>而不是String[],你知道吗?

无论如何,你假设一个AsyncTask立即完成。它不是。

将数组放入适配器时,您的数组为null。

相反,调用的AsyncTask,但直到它准备

public class choose_buffet_items extends AppCompatActivity { 
    String []categouries; 
    ArrayAdapter adapter; 
    ListView listView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_choose_buffet_items); 
     new JSONParse().execute(); // Let this work in the background... 

     // adapter = new ArrayAdapter<String>(this, 
     //  R.layout.buffet_list_view, categouries); 

设置适配器不使用数据时,该名单是不是在onPostExecute

@Override 
    protected void onPostExecute(String r) { 
     adapter = new ArrayAdapter<String>(choose_buffet_items.this, 
      R.layout.buffet_list_view, categouries); 
     listView.setAdapter(adapter); 

     pDialog.dismiss(); 
    } 

注意空:如果您使您的AsyncTask使用<Void, Void, String[]>,(Void因为您没有任何参数或进度进行监控),那么您可以将return的字符串排列为return。现在,你回到原始JSON字符串,但从来没有使用它onPostExecute

相关问题