【问题标题】:Android Could not execute method of the activityAndroid无法执行活动的方法
【发布时间】:2016-04-28 09:35:59
【问题描述】:

我在尝试执行“诊断”按钮时发现了一个问题 - onclick 确定因素。我不知道我的代码有什么问题。在这个应用程序中,我使用了一种方法(使用确定性公式 - 专家系统)。如果有人知道如何解决这个问题,请帮助我..

04-28 16:10:36.868: E/AndroidRuntime(1064): FATAL EXCEPTION: main
04-28 16:10:36.868: E/AndroidRuntime(1064): java.lang.IllegalStateException: Could not execute method of the activity
04-28 16:10:36.868: E/AndroidRuntime(1064):     at android.view.View$1.onClick(View.java:3607)
04-28 16:10:36.868: E/AndroidRuntime(1064):     at android.view.View.performClick(View.java:4212)
04-28 16:10:36.868: E/AndroidRuntime(1064):     at android.view.View$PerformClick.run(View.java:17476)
04-28 16:10:36.868: E/AndroidRuntime(1064):     at android.os.Handler.handleCallback(Handler.java:800)
04-28 16:10:36.868: E/AndroidRuntime(1064):     at android.os.Handler.dispatchMessage(Handler.java:100)
04-28 16:10:36.868: E/AndroidRuntime(1064):     at android.os.Looper.loop(Looper.java:194)
04-28 16:10:36.868: E/AndroidRuntime(1064):     at android.app.ActivityThread.main(ActivityThread.java:5392)
04-28 16:10:36.868: E/AndroidRuntime(1064):     at java.lang.reflect.Method.invokeNative(Native Method)
04-28 16:10:36.868: E/AndroidRuntime(1064):     at java.lang.reflect.Method.invoke(Method.java:525)
04-28 16:10:36.868: E/AndroidRuntime(1064):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
04-28 16:10:36.868: E/AndroidRuntime(1064):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
04-28 16:10:36.868: E/AndroidRuntime(1064):     at dalvik.system.NativeStart.main(Native Method)
04-28 16:10:36.868: E/AndroidRuntime(1064): Caused by: java.lang.reflect.InvocationTargetException
04-28 16:10:36.868: E/AndroidRuntime(1064):     at java.lang.reflect.Method.invokeNative(Native Method)
04-28 16:10:36.868: E/AndroidRuntime(1064):     at java.lang.reflect.Method.invoke(Method.java:525)
04-28 16:10:36.868: E/AndroidRuntime(1064):     at android.view.View$1.onClick(View.java:3602)
04-28 16:10:36.868: E/AndroidRuntime(1064):     ... 11 more
04-28 16:10:36.868: E/AndroidRuntime(1064): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 78, size is 78
04-28 16:10:36.868: E/AndroidRuntime(1064):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
04-28 16:10:36.868: E/AndroidRuntime(1064):     at java.util.ArrayList.get(ArrayList.java:304)
04-28 16:10:36.868: E/AndroidRuntime(1064):     at com.pakarayam.MulaiDiagnosis.CertaintyFactor(MulaiDiagnosis.java:98)
04-28 16:10:36.868: E/AndroidRuntime(1064):     at com.pakarayam.MulaiDiagnosis.Diagnosa(MulaiDiagnosis.java:85)
04-28 16:10:36.868: E/AndroidRuntime(1064):     ... 14 more

这是我的活动

public class MulaiDiagnosis extends Activity implements TextWatcher,
OnItemClickListener {

     private EditText   search;
     private ListView   list1;
     private DBAdapter  dbHelper;
     private ArrayAdapter<Gejala> adapter;
     private List<Gejala> listGejala;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mulai_diagnosis);
        getActionBar().setHomeButtonEnabled(true);
        getActionBar().setDisplayHomeAsUpEnabled(true);

         list1 = (ListView) findViewById(R.id.listView1);
         search = (EditText) findViewById(R.id.search);


          setData();

          search.addTextChangedListener(this);
          list1.setOnItemClickListener(this);

    }

          private void setData()

          {

              dbHelper = DBAdapter.getInstance(this);
              listGejala = dbHelper.getAllGejala();
              adapter = new ArrayAdapter<Gejala>(this,
                      android.R.layout.simple_list_item_multiple_choice, listGejala);
              list1.setAdapter(adapter);   
              list1.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
              list1.setItemChecked(80, true);

              search.addTextChangedListener(new TextWatcher() {
                  @Override
                  public void onTextChanged(CharSequence cs, int arg1, int arg2,
                      int arg3) {
                    MulaiDiagnosis.this.adapter.getFilter().filter(cs);
                  }
                  @Override
                  public void beforeTextChanged(CharSequence arg0, int arg1,
                      int arg2, int arg3) {
                  }
                  @Override
                  public void afterTextChanged(Editable arg0) {
                    // TODO Auto-generated method stub
                  }
                });

        }

    public void CertaintyFactor(View v) {
            // TODO Auto-generated method stub
            // Mengambil id gejala yang dicentang user
            String temp="";
            List<Gejala> listGejala = dbHelper.getAllGejala();
            int i;
            double MB = 0;
            double MD = 0;
            int JumlahCF = 0;
            for (i=0; i<listGejala.size(); i++);{       
                Gejala gejala = listGejala.get(i);
                if (list1.isSelected()){
                    temp=temp+":"+ gejala.getNama_gejala();
            }
                // Jika user belum mencentang satupun gejala
                if (temp.equals("")){
                    Toast.makeText(MulaiDiagnosis.this,"Pastikan Anda sudah mencentang salah satu gejala!",Toast.LENGTH_LONG).show();
                }
                // Jika user mencentang satu/lebih gejala maka mulai proses perhitungan CF
                else{
                    //split gejala menjadi array id gejala
                    String[] separated=temp.split(":");
                    int[] DataGejala=new int[separated.length];
                    for (i=1; i<separated.length; i++){
                        DataGejala[i]= Integer.parseInt(separated[i]);
                    }
                    // Cek nilai CF tiap penyakit thd gejala yg dipilih
                    dbHelper = DBAdapter.getInstance(this);
                    int[] AIDK = dbHelper.getCF();
                    dbHelper.close();

                    int[] CFTemp = new int[AIDK.length];
                    for (i=0; i<AIDK.length; i++){

                        // Inisialisasi MB dan MD
                        dbHelper = DBAdapter.getInstance(this);
                        MB = dbHelper.getMB(AIDK[i], DataGejala[0]);
                        dbHelper.close();

                        dbHelper = DBAdapter.getInstance(this);
                        MD = dbHelper.getMD(AIDK[i], DataGejala[0]);
                        dbHelper.close();
                    }
                        //Hitung MB dan MD kombinasi jika user mencentang lebih satu gejala
                        if(DataGejala.length>1){
                            for (int j=1; j<DataGejala.length; j++){
                                dbHelper = DBAdapter.getInstance(this);
                                double MBTemp = dbHelper.getMB(AIDK[i], DataGejala[j]);
                                dbHelper.close();

                                dbHelper = DBAdapter.getInstance(this);
                                double MDTemp = dbHelper.getMD(AIDK[i], DataGejala[j]);
                                dbHelper.close();

                                MB= Math.abs(MB + MBTemp * (1-MB));
                                MD= Math.abs(MD + MDTemp * (1-MD));
                            }
                        }
                        //Hitung nilai CF dalam persen (kali 100)
                        CFTemp[i]=(int)((MB-MD)*100);
                        if (CFTemp[i]>10) {
                        JumlahCF = JumlahCF+1;}
                    }
                }

            Intent pindah = new Intent(this, HasilDiagnosis.class);
            pindah.putExtra("Nilai_CF", JumlahCF);
            startActivity(pindah);
            }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.mulai_diagnosis, menu);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                // app icon in action bar clicked; goto parent activity.
                this.finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        // TODO Auto-generated method stub

    }
    @Override
    public void afterTextChanged(Editable arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
            int arg3) {
        // TODO Auto-generated method stub

    }
    @Override
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub

    }

    }

【问题讨论】:

  • IndexOutOfBoundsException: Invalid index 78, size is 78
  • 这段代码是什么意思? @黑带

标签: java android methods


【解决方案1】:

删除此行并检查-

list1.setItemChecked(80, true);

或者如果您想检查最后一项,请尝试

list1.setItemChecked(adapter.getCount() - 1, true);

【讨论】:

  • 我已尝试删除并更改该代码。但不幸的是,我的应用程序仍然无法正常工作。我现在该怎么办? @jimit-patel
  • 同样的错误。我认为错误的原因在于方法确定性因素。但我不知道哪个部分导致错误.. @jimit-patel
  • @PujaPutri,检查使用硬编码位置的数组或数组列表的位置
【解决方案2】:
 double MBTemp = dbHelper.getMB(AIDK[i], DataGejala[j]);
double MDTemp = dbHelper.getMD(AIDK[i], DataGejala[j]);

在上面两行中,你输入了错误的索引值,所以会出现这种类型的错误。

AIDK[i] 从 listGejala 的数组中获取 i 的值,这是错误的。

请使用以下函数。

public void CertaintyFactor(View v) {
        // TODO Auto-generated method stub
        // Mengambil id gejala yang dicentang user
        String temp="";
        List<Gejala> listGejala = dbHelper.getAllGejala();
        int i;
        double MB = 0;
        double MD = 0;
        int JumlahCF = 0;
        for (i=0; i<listGejala.size(); i++);{       
            Gejala gejala = listGejala.get(i);
            if (list1.isSelected()){
                temp=temp+":"+ gejala.getNama_gejala();
        }
            // Jika user belum mencentang satupun gejala
            if (temp.equals("")){
                Toast.makeText(MulaiDiagnosis.this,"Pastikan Anda sudah mencentang salah satu gejala!",Toast.LENGTH_LONG).show();
            }
            // Jika user mencentang satu/lebih gejala maka mulai proses perhitungan CF
            else{
                //split gejala menjadi array id gejala
                String[] separated=temp.split(":");
                int[] DataGejala=new int[separated.length];
                for (i=1; i<separated.length; i++){
                    DataGejala[i]= Integer.parseInt(separated[i]);
                }
                // Cek nilai CF tiap penyakit thd gejala yg dipilih
                dbHelper = DBAdapter.getInstance(this);
                int[] AIDK = dbHelper.getCF();
                dbHelper.close();

                int[] CFTemp = new int[AIDK.length];
                for (i=0; i<AIDK.length; i++){

                    // Inisialisasi MB dan MD
                    dbHelper = DBAdapter.getInstance(this);
                    MB = dbHelper.getMB(AIDK[i], DataGejala[0]);
                    dbHelper.close();

                    dbHelper = DBAdapter.getInstance(this);
                    MD = dbHelper.getMD(AIDK[i], DataGejala[0]);
                    dbHelper.close();

                    //Hitung MB dan MD kombinasi jika user mencentang lebih satu gejala
                    if(DataGejala.length>1){
                        for (int j=1; j<DataGejala.length; j++){
                            dbHelper = DBAdapter.getInstance(this);
                            double MBTemp = dbHelper.getMB(AIDK[i], DataGejala[j]);
                            dbHelper.close();

                            dbHelper = DBAdapter.getInstance(this);
                            double MDTemp = dbHelper.getMD(AIDK[i], DataGejala[j]);
                            dbHelper.close();

                            MB= Math.abs(MB + MBTemp * (1-MB));
                            MD= Math.abs(MD + MDTemp * (1-MD));
                        }
                    }}
                    //Hitung nilai CF dalam persen (kali 100)
                    CFTemp[i]=(int)((MB-MD)*100);
                    if (CFTemp[i]>10) {
                    JumlahCF = JumlahCF+1;}
                }
            }

        Intent pindah = new Intent(this, HasilDiagnosis.class);
        pindah.putExtra("Nilai_CF", JumlahCF);
        startActivity(pindah);
        }

【讨论】:

  • 什么是正确的,先生?我应该改变什么? @mayur-sakhiya
  • 请不要在父子循环中使用相同的变量名。
  • 我已经按照你说的做了。但我遇到了同样的错误。我很困惑现在怎么了。。@mayur-sakhiya
  • 请在您的代码中找到 logcat 中给出的行号并将该行发送给我
  • 这一行,先生.. for (i=0; i
【解决方案3】:
 (i=1; i<separated.length; i++){
     DataGejala[i]= Integer.parseInt(separated[i]);
    }

 here DataGejala[i] index is starting from 1 and later on, in same code block, you are trying to access data from DataGejala[0] 0th index.

 MB = dbHelper.getMB(AIDK[i], DataGejala[0]);

Maybe this two line is causing problem. Have a look over there.

【讨论】:

  • 对不起,我不明白 :( 我应该改变什么?@techniqez
  • MB = dbHelper.getMB(AIDK[i], DataGejala[1]); MD = dbHelper.getMD(AIDK[i], DataGejala[1]);尝试这样做,如果可行,请告诉我。
  • 它仍然不起作用:(我在 logcat 中找到错误行.. 此代码.. for (i=0; i
  • 从 1 开始 for 循环,即 i = 1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
相关资源
最近更新 更多