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

Moh*_*nde 0 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Fru*_*ner 12

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


oku*_*ane 6

你了解自己的代码吗?你想从这个方法返回什么?目前您的代码意味着:
读取XML文件,直到找不到"Keyword"元素.找到"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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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