Рекурсия не работает должным образом

1

У меня есть код, который должен получить LinearLayout (с большим количеством LinearLayout внутри) и получить все представления в них. Есть несколько текстовых просмотров, которые имеют теги, и в соответствии с этим он должен построить 3 строки. Проблема заключается в том, что он генерирует исключение в первой строке после цикла. здесь образец кода, чтобы объяснить:

private void insertToDB(final DataBaseHelper db, LinearLayout layout, 
                              String subject, String term, String meaning) 
{
    View v1 = null;
    for(int i=0; i < layout.getChildCount(); i++) {
        try {
            v1 = layout.getChildAt(i);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        if(v1 instanceof LinearLayout)
        {
            insertToDB(db, ((LinearLayout)v1), subject, term, meaning);
        }
        if (v1.getTag() != null) {
            String val = v1.getTag().toString();
            if (val.equals("subject")) {
                subject = ((TextView)v1).getText().toString();
            }
            else if (val.equals("term")) {
                term+=((TextView)v1).getText().toString()+"$";
            }
            else if (val.equals("meaning")) {
                meaning+=((TextView)v1).getText().toString()+"$";
            }

        }
    }
    term = term.substring(0, term.length()-1);
    meaning = meaning.substring(0, meaning.length()-1);
    Card c = new Card(subject, term, meaning);
    db.Insert(c);
} 

Трассировки стека:

06-25 20:27:59.332: D/AndroidRuntime(269): Shutting down VM
06-25 20:27:59.332: W/dalvikvm(269): threadid=1: thread exiting with uncaught exception (group=0x4001d800)

06-25 20:28:01.551: E/AndroidRuntime(269): FATAL EXCEPTION: main
06-25 20:28:01.551: E/AndroidRuntime(269): java.lang.StringIndexOutOfBoundsException
06-25 20:28:01.551: E/AndroidRuntime(269):  at java.lang.String.substring(String.java:1579)
06-25 20:28:01.551: E/AndroidRuntime(269):  at com.ronEven.iCards.AddRemove$1.insertToDB(AddRemove.java:78)
06-25 20:28:01.551: E/AndroidRuntime(269):  at com.ronEven.iCards.AddRemove$1.insertToDB(AddRemove.java:62)
06-25 20:28:01.551: E/AndroidRuntime(269):  at com.ronEven.iCards.AddRemove$1.onClick(AddRemove.java:46)
06-25 20:28:01.551: E/AndroidRuntime(269):  at android.view.View.performClick(View.java:2408)
06-25 20:28:01.551: E/AndroidRuntime(269):  at android.view.View$PerformClick.run(View.java:8816)
06-25 20:28:01.551: E/AndroidRuntime(269):  at android.os.Handler.handleCallback(Handler.java:587)
06-25 20:28:01.551: E/AndroidRuntime(269):  at android.os.Handler.dispatchMessage(Handler.java:92)
06-25 20:28:01.551: E/AndroidRuntime(269):  at android.os.Looper.loop(Looper.java:123)
06-25 20:28:01.551: E/AndroidRuntime(269):  at android.app.ActivityThread.main(ActivityThread.java:4627)
06-25 20:28:01.551: E/AndroidRuntime(269):  at java.lang.reflect.Method.invokeNative(Native Method)
06-25 20:28:01.551: E/AndroidRuntime(269):  at java.lang.reflect.Method.invoke(Method.java:521)
06-25 20:28:01.551: E/AndroidRuntime(269):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-25 20:28:01.551: E/AndroidRuntime(269):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-25 20:28:01.551: E/AndroidRuntime(269):  at dalvik.system.NativeStart.main(Native Method)
  • 2
    Какое исключение выдается?
  • 0
    Вы должны опубликовать трассировку стека исключений
Показать ещё 3 комментария
Теги:
recursion

2 ответа

2
Лучший ответ

Один из ваших вызовов String.substring после цикла, очевидно, вызывает эту проблему, поскольку они пытаются извлечь часть String из пустой строки.

Следовательно:

emptyString.length() - 1 = -1

Который является незаконным индексом внутри String.

  • 0
    Аааа, +1, опереди меня. Вероятно, следует добавить к вашему сообщению, что он может проверить его, используя if (term.length() > 0) { ... } .
  • 0
    Теперь все в порядке, но несколько раз повторяется строка db.Insert (c) ... как я могу заставить ее выполняться, когда вся рекурсия завершена?
0

Убедитесь, что в этих строках:

term = term.substring(0, term.length()-1);
meaning = meaning.substring(0, meaning.length()-1);

То, что вы проверяете, что этот term.Length() > 0 и что meaning.Length() > 0.

В противном случае вы можете попытаться взять подстроку с аргументом -1.

  • 0
    Теперь все в порядке, но несколько раз повторяется строка db.Insert (c) ... как я могу заставить ее выполняться, когда вся рекурсия завершена?
  • 0
    Вам нужно было бы вынуть функцию Insert из рекурсивной функции и вместо этого добавить «c» в глобальный массив / список карт, а затем, когда рекурсия будет завершена, использовать другую функцию, чтобы «вставить» все карты в базу данных DataBaseHelper. ,
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню