2013-06-12 3 views
0

У меня есть этот код. Я включил его большую часть, если я что-то упустил из других методов, которые могли бы привести к моему сбою. Я рассматриваю как переменную экземпляра некоторые строки и некоторые ArrayLists. Пользователь вводит значения в некоторые EditTexts, они входят в ArrayList(allpret,allcant,allprod). Отсюда я беру каждое значение и помещаю его в Strings(pret,prod,cant), поэтому я могу ссылаться на него с cant[1],pret[1][prod1],etc. Я должен иметь что это неправильно, не знаю, как исправить это, потому что он падает, когда я пытаюсь запустить calculeaza().Объявление проблем с String и ArrayList

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; index = 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): at 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)): at android.widget.TextView $ ChangeWatcher.onTextChanged (TextView.java:9213) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): at 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): at android.text.SpannableStringBuilder.replace (SpannableStringBuilder.java:435) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): at 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): at 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): at android.os.Handler.dispatchMessage (Handler.java:99) 06- 13 23: 03: 03.670: E/AndroidRuntime (15089): at android.os.Looper.loop (Looper.java:137) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): at android.app .ActivityThread.main (ActivityThread.java:4921) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): at java.lang.reflect.Method.invokeNative (собственный метод) 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): на 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: Е/AndroidRuntime (15089): в dalvik.system.NativeStart.main (нативный метод)

линии 209 это: prod[m] = allprod.get(m).getText().toString();

ответ

4

Ваши переменные инициализируются перед запуском конструктора, в порядке их появления:

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

Так что, когда prod инициализируется, allprod пуст и его размер равен 0. Таким образом, prod является пустой массив, и вы можете В этом ничего нет.

Возможно, вы имели ввиду (я не смотрел детали вашего кода) вместо ArrayList, который имеет динамический размер.

+0

. Я могу сделать работу calculeaza, я сделал это, объявив 'String [] prod = new String [allprod.size()]; 'внутри calculeaza(). Но тогда, когда я хочу использовать, например, prod [1] вне calculeaza (в моем случае положить его в txt-файл), он не найдет его, потому что он объявлен внутри метода calculeaza. Итак, мой вопрос заключается в том, как я могу объявить его внутри calculeaza (как это то, что мне нужно сделать для его работы), но, возможно, сможет использовать его за пределами calculeaza? –

+0

@SorinGrecu Вы можете объявить его в том же месте, что и в вашем исходном коде: 'String [] prod;', но инициализировать его в 'calculeaza()': 'prod = new String [allprod.size()];'. Или просто используйте 'ArrayList', и если вам нужно' String [] 'на каком-то этапе, вы можете вызвать' String [] prodArray = prod.toArray (новый String [prod.size()]); '. – assylias

+0

Спасибо, я узнал что-то новое через эту ошибку, хе-хе. Начните новичку без фона программирования, но stackoverflow мне очень помогает! –

3

Ваши массивы String равны нулю при инициализации их размерами пустых списков. Инициализировать их после заполнения списков. То есть в начале вашего метода calculeaza.

+0

Но если я инициализирую их внутри метода calculeaza, тогда я не смогу использовать can not [1], например, вне этого метода, правильно? Я сделал это, и когда я попытаюсь положить cant [1] в файл (txt), он сработает. –

+0

@SorinGrecu вы можете объявить его как переменную-член и инициализировать его там (указать значения), после чего вы можете получить к нему доступ из любого места класса – codeMagic

Смежные вопросы