声明String和ArrayList问题

时间:2013-06-12 20:12:59

标签: java android

我有这个代码。我包含了更大的一部分,以防我错过了可能导致我崩溃的其他方法。 我将某些字符串和一些ArrayLists作为实例变量进行了声明。用户将值输入到某些EditTexts中,它们进入ArrayList(allpret,allcant,allprod)。从那里我取每个值并将其放在Strings(pret,prod,cant)中,以便我可以参考它与cant[1],pret[1][prod1],etc. 我一定声明错了,不知道如何修复它,因为当我尝试运行calculeaza()时崩溃了。

public class MainActivity extends Activity implements OnClickListener,
    TextWatcher {

public Button paginanoua;
public Button produsnou;
public Button Salveaza;

float totaltest = 0;
public int k;
public int j;
public int l;
public TextView totalc;
private static final String TAG = "MEDIA";

public List<EditText> allprod = new ArrayList<EditText>();
public List<EditText> allpret = new ArrayList<EditText>();
public List<EditText> allcant = new ArrayList<EditText>();

String[] cant=new String[allcant.size()];
String[] pret=new String[allpret.size()];
String[] prod=new String[allprod.size()];

public void produsnou() {
    final LinearLayout l1 = (LinearLayout) findViewById(R.id.layout1);
    EditText et = new EditText(this);
    et.setHint("Produs");
    l1.addView(et);
    allprod.add(et);
    et.addTextChangedListener(this);
    et.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            // TODO Auto-generated method stub
             if (hasFocus && 
                       l1.getChildAt(l1.getChildCount() - 1) == v) {
                    produsnou();}}
    });

    LinearLayout l2 = (LinearLayout) findViewById(R.id.layout2);
    EditText et2 = new EditText(this);
    et2.setHint("Cantitate");
    et2.setInputType(InputType.TYPE_CLASS_NUMBER
            | InputType.TYPE_NUMBER_FLAG_DECIMAL);

    allcant.add(et2);
    l2.addView(et2);
    et2.addTextChangedListener(this);

    LinearLayout l3 = (LinearLayout) findViewById(R.id.layout3);
    EditText et3 = new EditText(this);
    et3.setHint("Pret");
    et3.setInputType(InputType.TYPE_CLASS_NUMBER
            | InputType.TYPE_NUMBER_FLAG_DECIMAL);
    l3.addView(et3);
    allpret.add(et3);
    et3.addTextChangedListener(this);}



public void calculeaza() {

    totaltest = 0;
    for (int m = 0; m < allprod.size(); m++) {

        prod[m] = allprod.get(m).getText().toString();
        if (prod[m].matches("")) {
        prod[m] = Float.toString(0);}}



    for (int j = 0; j < allcant.size(); j++) {

        cant[j] = allcant.get(j).getText().toString();
        if (cant[j].matches("")) {
            cant[j] = Float.toString(0);}}



    for (int k = 0; k < allpret.size(); k++) {
        pret[k] = allpret.get(k).getText().toString();
        if (pret[k].matches("")) {
            pret[k] = Float.toString(0);}}

    for (int l = 0; l < allpret.size(); l++) {

        Float temp = Float.parseFloat(cant[l]) * Float.parseFloat(pret[l]);
        alltotal.add(temp);
        totaltest = totaltest + temp;

        TextView totalf = (TextView) findViewById(R.id.total);
        totalf.setText(String.format("Total: %.2f", totaltest));}}

我得到以下LogCat:

  

06-13 23:03:03.670:E / AndroidRuntime(15089):致命异常:主要   06-13 23:03:03.670:E / AndroidRuntime(15089):java.lang.ArrayIndexOutOfBoundsException:length = 0;索引= 0   06-13 23:03:03.670:E / AndroidRuntime(15089):at com.example.testlayout.MainActivity.calculeaza(MainActivity.java:209)   06-13 23:03:03.670:E / AndroidRuntime(15089):at com.example.testlayout.MainActivity.onTextChanged(MainActivity.java:283)   06-13 23:03:03.670:E / AndroidRuntime(15089):在android.widget.TextView.sendOnTextChanged(TextView.java:7395)   06-13 23:03:03.670:E / AndroidRuntime(15089):在android.widget.TextView.handleTextChanged(TextView.java:7454)   06-13 23:03:03.670:E / AndroidRuntime(15089):在android.widget.TextView $ ChangeWatcher.onTextChanged(TextView.java:9213)   06-13 23:03:03.670:E / AndroidRuntime(15089):在android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:962)   06-13 23:03:03.670:E / AndroidRuntime(15089):在android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:496)   06-13 23:03:03.670:E / AndroidRuntime(15089):在android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:435)   06-13 23:03:03.670:E / AndroidRuntime(15089):在android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:30)   06-13 23:03:03.670:E / AndroidRuntime(15089):在android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:676)   06-13 23:03:03.670:E / AndroidRuntime(15089):在android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:435)   06-13 23:03:03.670:E / AndroidRuntime(15089):at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:333)   06-13 23:03:03.670:E / AndroidRuntime(15089):at com.android.internal.view.IInputConnectionWrapper $ MyHandler.handleMessage(IInputConnectionWrapper.java:77)   06-13 23:03:03.670:E / AndroidRuntime(15089):在android.os.Handler.dispatchMessage(Handler.java:99)   06-13 23:03:03.670:E / AndroidRuntime(15089):在android.os.Looper.loop(Looper.java:137)   06-13 23:03:03.670:E / AndroidRuntime(15089):在android.app.ActivityThread.main(ActivityThread.java:4921)   06-13 23:03:03.670:E / AndroidRuntime(15089):at java.lang.reflect.Method.invokeNative(Native Method)   06-13 23:03:03.670:E / AndroidRuntime(15089):at java.lang.reflect.Method.invoke(Method.java:511)   06-13 23:03:03.670:E / AndroidRuntime(15089):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1038)   06-13 23:03:03.670:E / AndroidRuntime(15089):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)   06-13 23:03:03.670:E / AndroidRuntime(15089):at dalvik.system.NativeStart.main(Native Method)

第209行是:prod[m] = allprod.get(m).getText().toString();

2 个答案:

答案 0 :(得分:4)

您的变量在构造函数启动之前按其出现顺序初始化:

public List<EditText> allprod = new ArrayList<EditText>();
String[] prod=new String[allprod.size()];

因此,当prod初始化时,allprod为空且其大小为0.因此prod是一个空数组,您无法在其中放置任何内容。

你可能意味着(我没有查看你的代码的细节)而是使用一个具有动态大小的ArrayList。

答案 1 :(得分:3)

当您使用空列表的大小初始化String数组时,它们的长度为零。 填写列表后初始化它们。即在calculeaza方法的开头。