并非所有代码路径都返回值C#?

时间:2009-11-08 16:53:15

标签: c# xmlreader

这是我的代码:

public String[] readXML(String filename)  
{  
    XmlReader xmlReader = XmlReader.Create(@filename);  
    List<String> names = new List<string>();
    String[] keywords = null;
    while (xmlReader.Read())  
    {  
        //Keep reading  
        if (xmlReader.Name.Equals("Keyword") && (xmlReader.NodeType == XmlNodeType.Element))  
        {  
            // get attribute from the Xml element here  
            string keywords = xmlReader.GetAttribute("name");  
            names.Add(keywords);  
            String[] keywordsArray = names.ToArray();  
        }  
        else
        {
            MessageBox.show("An Error Occured");
        }
    }  
    return keywordsArray;
}

会这样吗?有人可以测试一下吗?

4 个答案:

答案 0 :(得分:12)

我认为这是因为你的return语句在if循环中。如果循环从不执行,或者if永远不是真的会发生什么?

答案 1 :(得分:6)

你了解自己的代码吗?你想从这个方法返回什么?目前您的代码意味着以下内容:
读取XML文件,直到找不到“关键字”元素。找到“Keyword”元素后,取其值为“name”的属性并将其包装回一个元素数组中。
正如其他人所提到的那样,XML文档可能没有元素。在这种情况下,您将退出循环而不返回任何值。你应该决定在这种情况下该做什么。您可以返回一些特殊值,如“null”或空数组。或者,如果您确定指定的XML文档中至少应存在一个“关键字”元素,那么您可以从方法的末尾抛出一些异常,以指示违反了某些先决条件。
我想你已经尝试用不同的行为编写方法。我相信你的意思是: 读取XML文件并从所有“关键字”元素中收集“name”属性的值,并将收集的值作为字符串数组返回。
这将更有意义,在这种情况下,即使XML文件不包含任何“关键字”元素,您也总会得到一些结果。要实现此类行为,您应该将列表移动到数组转换并将语句返回到方法的结尾。您将拥有以下代码:

public static String[] readXML(String filename)
{
    using(XmlReader xmlReader = XmlReader.Create(@filename))
    {
        List<String> names = new List<string>();
        while(xmlReader.Read())
        {
            //Keep reading  
            if(xmlReader.Name.Equals("Keyword") && (xmlReader.NodeType == XmlNodeType.Element))
            {
                // get attribute from the Xml element here  
                string keywords = xmlReader.GetAttribute("name");
                names.Add(keywords);
            }
        }
        String[] keywordsArray = names.ToArray();
        return keywordsArray;
    }
}

请注意,我还在“使用”块中包含已创建的XmlReader的使用,以确保在我们离开方法之前将其处理。

答案 2 :(得分:3)

在方法结束时,您应该有一个默认的回报。

正如编译器所说,你应该为所有代码路径都有一个return语句。如果while永远不执行,则不返回,if语句也是如此。

答案 3 :(得分:3)

您必须在循环外部放置一个return语句。否则,如果名称永远不是“关键字”,您的代码将永远不会返回!