Java 递归未按预期工作
我有一个代码,应该得到一个LinearLayout(里面有更多的LinearLayout),并获得其中的所有视图。有一些文本视图有标签,根据这个,它应该构建3个字符串。问题是它在循环后的第一行抛出异常。下面是一个代码示例来解释:Java 递归未按预期工作,java,android,recursion,Java,Android,Recursion,我有一个代码,应该得到一个LinearLayout(里面有更多的LinearLayout),并获得其中的所有视图。有一些文本视图有标签,根据这个,它应该构建3个字符串。问题是它在循环后的第一行抛出异常。下面是一个代码示例来解释: private void insertToDB(final DataBaseHelper db, LinearLayout layout, String subject, String term, Strin
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);
}
循环后的一个String.substring调用显然会导致该问题,因为它们试图从空字符串中提取字符串部分 因此: emptyString.length()-1=-1
这是字符串中的非法索引。请确保在这些行中:
term = term.substring(0, term.length()-1);
meaning = meaning.substring(0, meaning.length()-1);
您正在检查以查看term.Length()>0
和means.Length()>0
否则,您可能试图获取参数为-1的子字符串。引发的异常是什么?您应该发布异常堆栈traceI updated my post。出现异常是因为该方法没有按我预期的方式工作…我认为一个很好的问题是,为什么要使用一个子字符串,而这个子字符串只是整个字符串?每个字符串实际上是由“$”运算的一系列字符串。每次添加一个字符串时,也会添加一个“$”,因此最后还有一个多余的“$”..Ahhh,+1,让我来试试。可能应该在你的帖子中添加他可以使用
if(term.length()>0){…}
检查的内容。现在可以了,但是它重复了db.Insert(c)行几次。。。当整个递归完成时,我如何才能执行它呢?现在可以了,但它重复了db.Insert(c)行好几次。。。当整个递归完成时,我如何使其执行?您必须将插入函数从递归函数中取出,并将“c”添加到全局数组/卡片列表中,然后在递归完成时,使用另一个函数“插入”将所有卡都添加到DataBaseHelper db中,但我希望只添加一次。我希望它检查linearlayout中的所有视图,并获取每个textview的文本。然后,它应该用文本创建一个Card对象……然后,不是将这些卡片添加到列表/数组中,而是在递归函数之外声明主题、术语、含义变量或使其返回这些值。然后,在调用递归函数后,使用生成的主题、术语和含义变量创建一张卡片并将其插入数据库。
term = term.substring(0, term.length()-1);
meaning = meaning.substring(0, meaning.length()-1);