Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归未按预期工作_Java_Android_Recursion - Fatal编程技术网

Java 递归未按预期工作

Java 递归未按预期工作,java,android,recursion,Java,Android,Recursion,我有一个代码,应该得到一个LinearLayout(里面有更多的LinearLayout),并获得其中的所有视图。有一些文本视图有标签,根据这个,它应该构建3个字符串。问题是它在循环后的第一行抛出异常。下面是一个代码示例来解释: private void insertToDB(final DataBaseHelper db, LinearLayout layout, String subject, String term, Strin

我有一个代码,应该得到一个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);
} 

循环后的一个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);