2012-04-02 71 views
0
E/AndroidRuntime(2886): FATAL EXCEPTION: main 
E/AndroidRuntime(2886): java.lang.NullPointerException 
E/AndroidRuntime(2886):  at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394) 
E/AndroidRuntime(2886):  at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362) 
E/AndroidRuntime(2886):  at android.widget.AbsListView.obtainView(AbsListView.java:2033) 
E/AndroidRuntime(2886):  at android.widget.GridView.onMeasure(GridView.java:1026) 
E/AndroidRuntime(2886):  at android.view.View.measure(View.java:12728) 
E/AndroidRuntime(2886):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 
E/AndroidRuntime(2886):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369) 
E/AndroidRuntime(2886):  at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1017) 
E/AndroidRuntime(2886):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:555) 
E/AndroidRuntime(2886):  at android.view.View.measure(View.java:12728) 
E/AndroidRuntime(2886):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 
E/AndroidRuntime(2886):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369) 
E/AndroidRuntime(2886):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:660) 
E/AndroidRuntime(2886):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:553) 
E/AndroidRuntime(2886):  at android.view.View.measure(View.java:12728) 
E/AndroidRuntime(2886):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 
E/AndroidRuntime(2886):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
E/AndroidRuntime(2886):  at android.view.View.measure(View.java:12728) 
E/AndroidRuntime(2886):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:812) 
E/AndroidRuntime(2886):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:553) 
E/AndroidRuntime(2886):  at android.view.View.measure(View.java:12728) 
E/AndroidRuntime(2886):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 
E/AndroidRuntime(2886):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
E/AndroidRuntime(2886):  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2092) 
E/AndroidRuntime(2886):  at android.view.View.measure(View.java:12728) 
E/AndroidRuntime(2886):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1064) 
E/AndroidRuntime(2886):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442) 
E/AndroidRuntime(2886):  at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(2886):  at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime(2886):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
E/AndroidRuntime(2886):  at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(2886):  at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime(2886):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
E/AndroidRuntime(2886):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
E/AndroidRuntime(2886):  at dalvik.system.NativeStart.main(Native Method) 

还有的logcat的保持得到一个空指针异常,找不到源

和这里的(希望)相关的代码。当我认为问题源于

public class Main extends Activity { 
    private static final int REQUEST_CODE = 0; 
    List<String> custom1 = new ArrayList<String>(); 
    List<String> custom2 = new ArrayList<String>(); 
    List<String> custom3 = new ArrayList<String>(); 
    String title = null; 
    ArrayAdapter<String> a1; 
    ArrayAdapter<String> a2; 
    ArrayAdapter<String> a3; 
    Button b_1; 
    Button b_2; 
    Button b_3; 
    NotesDataSource dataSource; 
    MySQLiteHelper dbHelper; 
    SQLiteDatabase db; 
    int id; 
    int position; 
    boolean newNote; 

    static int ADAPTER = 1; 

    GridView gv; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     String savedText = null; 

     Bundle extras = getIntent().getExtras(); 
     id = extras.getInt("id"); 
     position = extras.getInt("pos"); 
     newNote = !extras.getBoolean("load"); 

     dataSource = new NotesDataSource(this); 

     final EditText tv = (EditText)findViewById(R.id.textArea); 
     final EditText title_tv = (EditText)findViewById(R.id.noteTitle); 

     if(!newNote){ 
      savedText = extras.getString("textData"); 
      title = extras.getString("title"); 
      if(savedText.length() != 0){ 
       tv.append(savedText); 
      } 
      if(title.length() != 0){ 
       title_tv.append(title); 
      } 
     } 
     if(dataSource.getArray1() != null){ 
      custom1.addAll(dataSource.getArray1()); 
     } 
     else{ 
      custom1.addAll(Arrays.asList(getResources().getStringArray(R.array.SymbolArray))); 
     } 
     if(dataSource.getArray2() != null){ 
      custom2.addAll(dataSource.getArray2()); 
     } 
     else{ 
      custom2.addAll(Arrays.asList(getResources().getStringArray(R.array.SymbolArray))); 
     } 
     if(dataSource.getArray3() != null){ 
      custom3.addAll(dataSource.getArray3()); 
     } 
     else{ 
      custom3.addAll(Arrays.asList(getResources().getStringArray(R.array.SymbolArray))); 
     } 

     a1 = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,custom1); 
     a2 = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,custom2); 
     a3 = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,custom3); 

     gv = (GridView)findViewById(R.id.gridView); 
     gv.setAdapter(a1); 
     ADAPTER = 1; 
     gv.isFocusable(); 
     gv.isFocusableInTouchMode(); 

     gv.setOnItemClickListener(new OnItemClickListener(){ 
      public void onItemClick(AdapterView<?> parent, View v, int position, long id){ 
       switch(ADAPTER){ 
       case 1: 
        tv.append(custom1.get(position)); 
        break; 
       case 2: 
        tv.append(custom2.get(position)); 
        break; 
       case 3: 
        tv.append(custom3.get(position)); 
       default: 
        break; 
       } 
      } 
     }); 

     b_1 = (Button)findViewById(R.id.button1); 
     b_2 = (Button)findViewById(R.id.button2); 
     b_3 = (Button)findViewById(R.id.button3); 
     Button b_save = (Button)findViewById(R.id.save_button); 

     b_1.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       gv.setAdapter(a1); 
       ADAPTER = 1; 

      } 
     }); 

     b_2.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       gv.setAdapter(a2); 
       ADAPTER = 2; 
      } 
     }); 

     b_3.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       gv.setAdapter(a3); 
       ADAPTER = 3; 

      } 
     }); 

     b_save.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       if(newNote == false){ 
        dataSource.open(); 
        String text = tv.getText().toString(); 
        if(title.length() != 0){ 
         title = title_tv.getText().toString(); 
         dataSource.updateString(text,title,id); 
        } 
        else{ 
         dataSource.updateString(text, "no title", id); 
        } 
        dataSource.close(); 
       } 
       else{ 
        dataSource.open(); 
        String text = tv.getText().toString(); 
        title = title_tv.getText().toString(); 

        dataSource.createString(text, title); 
        newNote = false; 
        dataSource.close(); 
       } 
      } 
     });  

    } 

这里有三个阵列方法

public List<String> getArray1(){ 
      ArrayList<String> array1 = new ArrayList<String>(); 

      open(); 
      Cursor cursor = db.query(MySQLiteHelper.TABLE_ARRAY, new String[]{MySQLiteHelper.COLUMN_ARRAY_1}, null, null, null, null, null); 
      cursor.moveToFirst(); 
      while(!cursor.isAfterLast()){ 
       String data = cursorToArrayString(cursor); 
       array1.add(data); 
       cursor.moveToNext(); 
      } 
      //make sure to close the cursor 
      close(); 
      return array1; 
     } 

     public List<String> getArray2(){ 
      ArrayList<String> array2 = new ArrayList<String>(); 

      open(); 
      Cursor cursor = db.query(MySQLiteHelper.TABLE_ARRAY, new String[]{MySQLiteHelper.COLUMN_ARRAY_2}, null,null,null,null,null); 
      cursor.moveToFirst(); 
      while(!cursor.isAfterLast()){ 
       String data = cursorToArrayString(cursor); 
       array2.add(data); 
       cursor.moveToNext(); 
      } 
      //make sure to close the cursor 
      close(); 
      return array2; 
     } 

     public List<String> getArray3(){ 
      ArrayList<String> array3 = new ArrayList<String>(); 

      open(); 
      Cursor cursor = db.query(MySQLiteHelper.TABLE_ARRAY, new String[]{MySQLiteHelper.COLUMN_ARRAY_3}, null,null,null,null,null); 
      cursor.moveToFirst(); 
      while(!cursor.isAfterLast()){ 
       String data = cursorToArrayString(cursor); 
       array3.add(data); 
       cursor.moveToNext(); 
      } 
      //make sure to close the cursor 
      close(); 
      return array3; 
     } 


and finally how they're updated 


public void updateArray(String[] array1, String[] array2, String[] array3){ 

     db.delete(MySQLiteHelper.TABLE_ARRAY, null, null); 

     ContentValues values1 = new ContentValues(); 
     for(int i = 0; i < array1.length; i++){ 
      values1.put(MySQLiteHelper.COLUMN_ARRAY_1, array1[i]); 
      int rows = db.update(MySQLiteHelper.TABLE_ARRAY, values1, MySQLiteHelper.COLUMN_ID + " = " + i, null); 
      if(rows == 0){ 
       db.insert(MySQLiteHelper.TABLE_ARRAY, null, values1); 
      } 
     } 


     ContentValues values2 = new ContentValues(); 
     for(int i = 0; i < array2.length; i++){ 
      values2.put(MySQLiteHelper.COLUMN_ARRAY_2, array2[i]); 
      int rows = db.update(MySQLiteHelper.TABLE_ARRAY, values2, MySQLiteHelper.COLUMN_ID + " = " + i, null); 
      if(rows == 0){ 
       db.insert(MySQLiteHelper.TABLE_ARRAY, null, values2); 
      } 
     } 

     ContentValues values3 = new ContentValues(); 
     for(int i = 0; i < array3.length; i++){ 
      values3.put(MySQLiteHelper.COLUMN_ARRAY_3, array3[i]); 
      int rows = db.update(MySQLiteHelper.TABLE_ARRAY, values3, MySQLiteHelper.COLUMN_ID + " = " + i, null); 
      if(rows == 0){ 
       db.insert(MySQLiteHelper.TABLE_ARRAY, null, values3); 
      } 
     } 
    } 

去容易对我来说,这是我第一次与数据库的工作,但我很想知道问题是什么,我一直在这个问题上工作几天

+0

在处理数据库时,总是使用'if(cursor!= null)'执行其他操作,如cursor.moveToFirst(); – 2012-04-02 05:25:48

+0

只是猜测..你可能会使用任何视图编号'布局'..这是宣布somewher,但不是在你设置为activity..check这样的xml – MKJParekh 2012-04-02 05:40:50

+0

从看你的堆栈跟踪,它似乎并不是一个数据库问题,但它是试图发送消息时的布局问题。从可读性的角度来看,你应该考虑使用更好的变量名称('a1'和'b_1',真的吗?),并将大量方法分解成易消化的块,以使其他人不太愿意仔细观察;-) – 2012-04-02 05:42:23

回答

0

什么时候发生异常?在屏幕上加载?点击一下?

我会在创建Adapter实例之前运行一个调试器并放置一个断点。确保数组中的字符串都不为空。这将是我的猜测。

+0

当我从主屏幕转到包含我添加的第一组代码的文件并且数组正在动态删除空值时,会发生异常。 – Zacharias3960 2012-04-02 15:11:08

+0

请指出“数组正在动态删除空值”。我没有看到。 – 2012-04-02 16:44:10

+0

刚刚意识到我拿出来了,在值1和for语句之间添加了if(array1 [i]!= null)更新数组 – Zacharias3960 2012-04-05 22:22:04