У меня есть код, который должен получить 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)
Один из ваших вызовов String.substring после цикла, очевидно, вызывает эту проблему, поскольку они пытаются извлечь часть String из пустой строки.
Следовательно:
emptyString.length() - 1 = -1
Который является незаконным индексом внутри String.
if (term.length() > 0) { ... }
.
Убедитесь, что в этих строках:
term = term.substring(0, term.length()-1);
meaning = meaning.substring(0, meaning.length()-1);
То, что вы проверяете, что этот term.Length() > 0
и что meaning.Length() > 0
.
В противном случае вы можете попытаться взять подстроку с аргументом -1.