NullPointerException при вызове открытого метода из другого действия - PullRequest
0 голосов
/ 21 августа 2011

У меня есть Activity SaveData.class с открытым методом addEvent (), который используется для добавления некоторой информации в таблицу базы данных следующим образом:

открытый класс SaveData расширяет Activity реализует OnClickListener {

public SoftCopyDatabase dB ;
public static String FILE_NAME;
String _subject, _topic,_lecturenumber,_date;


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.save);
    View add = findViewById(R.id.saveSave);
    add.setOnClickListener(this);
    View home = findViewById(R.id.saveBack);
    home.setOnClickListener(this);

}public void onStart() {
    super.onStart();
    dB = new SoftCopyDatabase(this);
}

public void onStop() {
    super.onStop();
    if (dB.getReadableDatabase().isOpen()) {
        //dB.close();
    }
}
public void onDestroy() {
    super.onDestroy();
    if (dB.getReadableDatabase().isOpen()) {
        dB.close();
    }
}

public void onClick(View v) {
    switch (v.getId()) {
    case R.id.saveBack:
        Intent i = new Intent(this, OpenScreen.class);
        startActivity(i);
        break;
    case R.id.saveSave:

        EditText subject = (EditText) findViewById(R.id.subjectid);
        EditText topic = (EditText) findViewById(R.id.topicid);
        EditText lecturenumber = (EditText) findViewById(R.id.lecturenumberid);
        EditText date = (EditText) findViewById(R.id.dateid);
         _subject = ((TextView) subject).getText().toString();
         _topic = ((TextView) topic).getText().toString();
         _lecturenumber = ((TextView) lecturenumber).getText()
                .toString();
         _date = ((TextView) date).getText().toString();
        FILE_NAME = _subject + _topic + _lecturenumber;
        //addEvent();

        Intent j = new Intent(this, LectureNoting.class);
        startActivity(j);

        break;

    }
}

public void addEvent() {


    ContentValues values = new ContentValues();
    values.put(SUBJECT, _subject);
    values.put(TOPIC, _topic);
    values.put(LECTURENUMBER, _lecturenumber);
    values.put(DATE, _date);
    values.put(_DATA, FILE_NAME + ".png");
    dB.getWritableDatabase().insertOrThrow(TABLE_NAME, null, values);
}

}

Другое занятие LectureNoting.class используется для сохранения чертежей на диске и обновления записи в таблице базы данных следующим образом:

открытый класс LectureNoting расширяет Activity, реализует View.OnTouchListener {

private SaveData sD=new SaveData();
private File directory = new File("/sdcard/SoftCopy"); 
//...remaining code
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.drawing_activity);
    }
//...remaining code
public void onClick(View view){
    switch (view.getId()){
case R.id.saveBtn:
addEvent();
            final Activity currentActivity  = this;
    Handler saveHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {

            Toast.makeText(currentActivity, "Lecture Saved",   Toast.LENGTH_SHORT).show();

        }
    } ;
   new ExportBitmapToFile(this,saveHandler, softCopyInterface.getBitmap()).execute();
        break;
//...remaining code
}
private class ExportBitmapToFile extends AsyncTask<Intent,Void,Boolean> {
    private Context mContext;
    private Handler mHandler;
    private Bitmap nBitmap;

    public ExportBitmapToFile(Context context,Handler handler,Bitmap bitmap) {
        mContext = context;
        nBitmap = bitmap;
        mHandler = handler;
    }

    @Override
    protected Boolean doInBackground(Intent... arg0) {

        try {
            if (!directory.exists()) {
                directory.mkdirs();
            }

            final FileOutputStream out = new FileOutputStream(new File(directory + "/"+SaveData.FILE_NAME+".png"));

            nBitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.flush();
            out.close();

            return true;
        }

        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return false;
    }


    @Override
    protected void onPostExecute(Boolean bool) {
        super.onPostExecute(bool);
        if ( bool ){
            mHandler.sendEmptyMessage(1);
        }
    }
 }
}

И я получаю следующую ошибку:

       Unable to start activity componentInfo(com.ned.LectureNoting):NullPointerException

В addEvent (), используемом в методе onClick LectureNoting.

Пожалуйста, скажите мне, где я иду не так. Я хотел бы упомянуть одну вещь: если addEvent () вызывается из того же действия, в котором он был определен, эта ошибка не появляется.

1 Ответ

1 голос
/ 21 августа 2011

Пара вещей:

  1. Logcat должен давать больше информации об ошибке.Возможно, вам придется немного прокрутить вниз, чтобы увидеть источник проблемы в вашем коде, но там должно быть больше информации.
  2. вы не должны определять публичные методы внутри классов, которые расширяют Activity для использованиядругие классы.Если вы хотите представить какой-либо метод базы данных для нескольких действий, то создайте для этого отдельный класс и затем вызовите этот метод внутри своей деятельности.Вы сказали, что LectureNoting расширяет Activity.Вы уверены в этом?Вы должны иметь расширение SaveData, если вы просто так звоните addEvent().

В любом случае, НЕ ВЫЗЫВАЙТЕ МЕТОДОВ ОТ ОДНОГО ACTIVITY ВНУТРИ ДРУГОГО.Если вы хотите предоставить метод нескольким действиям, создайте его в своем собственном классе с разумным именем, связанным с группой представляемых вами функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...