java.lang.NullPointerException 正在从 EditText 获取值

java.lang.NullPointerException while fetching value from EditText

我正在尝试将患者登记表中的值导入我的数据库。但每次当我点击 提交 按钮时,应用程序停止并显示以下消息:
不幸的是。应用程序已停止。

Logcat 详情为:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference

我的代码如下:

import java.util.Calendar;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TimePicker;

public class indoor_patient extends Activity{

public EditText sr_no, patient_name, consultant_name, ref_dr, department,
        rel_name, rel_no, arr_date, arr_time;
Button submit;
ImageButton datepicker, timepicker;
Calendar cal;
int day, month, year;
int hour, min;

static final int TIME_DIALOG_ID = 1;

static final int DATE_DIALOG_ID = 0;

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.indoor_patient_tbl);

    sr_no = (EditText) findViewById(R.id.etSrNo);
    patient_name = (EditText) findViewById(R.id.etPatientName);
    consultant_name = (EditText) findViewById(R.id.etConsultantDr);
    ref_dr = (EditText) findViewById(R.id.etRefDr);
    department = (EditText) findViewById(R.id.etDepartment);
    rel_name = (EditText) findViewById(R.id.etRelativeName);
    rel_no = (EditText) findViewById(R.id.etRelContact);
    arr_date = (EditText) findViewById(R.id.etArrDate);
    arr_time = (EditText) findViewById(R.id.etArrTime);

    submit = (Button) findViewById(R.id.btnIndoorSubmit);

    cal = Calendar.getInstance();

    day = cal.get(Calendar.DAY_OF_MONTH);
    month = cal.get(Calendar.MONTH);
    year = cal.get(Calendar.YEAR);
    datepicker = (ImageButton) findViewById(R.id.imgBtnDate);

    datepicker.setOnClickListener(new View.OnClickListener() {
        @SuppressWarnings("deprecation")
        @Override
        public void onClick(View v) {

            showDialog(DATE_DIALOG_ID);
        }
    });


    hour = cal.get(Calendar.HOUR_OF_DAY);
    min = cal.get(Calendar.MINUTE);
    timepicker = (ImageButton) findViewById(R.id.imgBtnTime);

    timepicker.setOnClickListener(new View.OnClickListener() {
        @SuppressWarnings("deprecation")
        @Override
        public void onClick(View v) {
            showDialog(TIME_DIALOG_ID);
        }
    });

    submit.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            new dbwork().execute();
        }
    });
}

@Override
protected Dialog onCreateDialog(int id) {
    // TODO Auto-generated method stub
    switch (id) {
    case DATE_DIALOG_ID:
        return new DatePickerDialog(this, datePickerListener, year, month,
                day);
    case TIME_DIALOG_ID:    
        return new TimePickerDialog(this, timePickerListener, hour, min,
                false);
    }
    return null;
}

private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() {
    public void onDateSet(DatePicker view, int selectedYear,
            int selectedMonth, int selectedDay) {
        arr_date.setText(selectedDay + "/" + (selectedMonth + 1) + "/"
                + selectedYear);
    }
};

private TimePickerDialog.OnTimeSetListener timePickerListener = new TimePickerDialog.OnTimeSetListener() {
    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        int hour;
        String am_pm;
        if (hourOfDay > 12) {
            hour = hourOfDay - 12;
            am_pm = "PM";
        } else {
            hour = hourOfDay;
            am_pm = "AM";
        }
        arr_time.setText(hour + ":" + min + " " + am_pm);
    }
};  
}

而我的数据库连接文件如下:

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import android.os.AsyncTask;

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

indoor_patient ins=new indoor_patient();    
String webUrl = "http://10.0.3.2:8084/data_web/indoorPatient.jsp?sr_no="
        + ins.sr_no.getText().toString()
        + ""
        + ins.patient_name.getText().toString()
        + ""
        + ins.consultant_name.getText().toString()
        + ""
        + ins.ref_dr.getText().toString()
        + ""
        + ins.department.getText().toString()
        + ""
        + ins.rel_name.getText().toString()
        + ""
        + ins.rel_no.getText().toString()
        + ""
        + ins.arr_date.getText().toString()
        + ""
        + ins.arr_time.getText().toString() + "&submit=Submit";

@Override
protected String doInBackground(Void... params) {
    // TODO Auto-generated method stub
    StringBuffer strbuffer=new StringBuffer("");
    String line="";

    try {

       URL url=new URL(webUrl);

        HttpURLConnection hurl;
        hurl=(HttpURLConnection)url.openConnection();

        BufferedInputStream bis;
        bis=new BufferedInputStream(hurl.getInputStream());

        InputStream is;
        is=bis;//implicit casting  // from downward to upward

        InputStreamReader isr;
        isr=new InputStreamReader(is);

        BufferedReader br;
        br=new BufferedReader(isr);

        //reading html form
        while ((line = br.readLine()) != null) {

            strbuffer.append(line);
        }

        bis.close();
        is.close();
        isr.close();
        br.close();

        hurl.disconnect();
    }
    catch(Exception ex)
    {
        ex.printStackTrace();
    }
    return strbuffer.toString();
}

@Override
protected void onPostExecute(String result) {

    super.onPostExecute(result);
   }
}

当你执行indoor_patient ins=new indoor_patient();时,并不意味着你调用了onCreate()。所以所有 EditText 个组件都是空的。

您不能只实例化 Activity 并访问其中的 TextView 成员。这没有任何意义:

indoor_patient ins=new indoor_patient();    
String webUrl = "http://10.0.3.2:8084/data_web/indoorPatient.jsp?sr_no="
        + ins.sr_no.getText().toString()

相反,您可以在 onClick() 方法中弄清楚 webUrl 是什么,并将完整的 URL 作为参数传递给 AsyncTask:

submit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String webUrl = "http://10.0.3.2:8084/data_web/indoorPatient.jsp?sr_no="
                + ins.sr_no.getText().toString()
                + ""
                + ins.patient_name.getText().toString()
                + ""
                + ins.consultant_name.getText().toString()
                + ""
                + ins.ref_dr.getText().toString()
                + ""
                + ins.department.getText().toString()
                + ""
                + ins.rel_name.getText().toString()
                + ""
                + ins.rel_no.getText().toString()
                + ""
                + ins.arr_date.getText().toString()
                + ""
                + ins.arr_time.getText().toString() + "&submit=Submit";
        new dbwork().execute(webUrl);
    }
});

然后将您的 AsyncTask 更改为如下内容:

public class dbwork extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... params) {
        String webUrl = params[0];
        // TODO Auto-generated method stub
        StringBuffer strbuffer=new StringBuffer("");
        // ...