当我尝试执行'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
}
}
答案 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.