Android无法执行活动的方法

时间:2016-04-28 09:35:59

标签: java android methods

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

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

    }

    }

3 个答案:

答案 0 :(得分:1)

删除此行并检查 -

list1.setItemChecked(80, true);

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

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

答案 1 :(得分:0)

 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);
        }

答案 2 :(得分:0)

 (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.