【问题标题】:Error: Not all code paths return a value [duplicate]错误:并非所有代码路径都返回值[重复]
【发布时间】:2014-06-05 20:09:08
【问题描述】:

为什么会这样?这是我从 bin 文件中读取字典的代码

public static object LoadObject()
{
    try
    {
        if (File.Exists("D://my.bin"))
        {
            FileStream stream = File.OpenRead("D://my.bin");
            BinaryFormatter formatter = new BinaryFormatter();

            Dictionary<int, Question> deserializedObject = (Dictionary<int, Question>)formatter.Deserialize(stream);
            stream.Close();
            return deserializedObject;
        }
    }
    catch
    {

    }
}

【问题讨论】:

  • 如果发生异常,您的方法将不返回任何内容。它必须始终返回 object
  • catch 块的目的是什么?你希望它能做什么?

标签: c#


【解决方案1】:

假设您的方法返回object 类型的对象,但您只在try 块内返回,并且也从if 语句内返回。因此,如果您的条件失败,您的方法将不会返回任何内容。此外,如果 try 块中存在异常,则在返回对象之前,您的方法将无法返回任何内容。这就是您收到错误的原因。您可以通过从 try / catch 块外部返回 null 来解决此问题。

public static object LoadObject()
{
    try
    {
        if (File.Exists("D://my.bin"))
        {
            FileStream stream = File.OpenRead("D://my.bin");
            BinaryFormatter formatter = new BinaryFormatter();

            Dictionary<int, Question> deserializedObject = (Dictionary<int, Question>)formatter.Deserialize(stream);
            stream.Close();
            return deserializedObject;
        }
    }
    catch(Exception ex)
    {

        //log exception
        return null;
    }
    return null;
}

虽然这将修复您的错误,但您应该寻找其他选项,例如在找不到文件时抛出异常或返回错误对象。

【讨论】:

    【解决方案2】:

    如果您的代码引发异常或条件 File.Exists 不满足,您也需要返回 但是,照原样捕获异常是没有意义的。如果你不做任何事情,让它在上层冒泡

    public static object LoadObject()
    {
        if (File.Exists("D://my.bin"))
        {
            FileStream stream = File.OpenRead("D://my.bin");
            BinaryFormatter formatter = new BinaryFormatter();
    
            Dictionary<int, Question> deserializedObject = (Dictionary<int, Question>)formatter.Deserialize(stream);
            stream.Close();
            return deserializedObject;
        }
        else
            throw FileNotFoundException("There is no file named", "D:\\my.bin");
    }
    

    【讨论】:

    • 错误依旧
    • 我不会仅仅因为“缺少更好的选择”而盲目地返回null。当我想返回 null 时,我会返回 null。如果我“缺乏更好的选择”,我会寻找我的方法设计中的根本缺陷。
    • @AntP 我不同意。当然,最好的方法总是找到设计中的缺陷,但不禁止从方法中返回 null。在这种情况下,您还可以设计此方法以在文件不存在时返回 null。不过我更喜欢抛出异常,让调用者处理情况
    • 我并没有说禁止 - 甚至暗示这是不好的 - 从方法返回 null;然而,仅仅因为你不确定还能做什么而返回任何值是不好的。如果没有有效的执行路径,那么抛出异常 - 正如你所说 - 是正确的做法;不只是返回 null 并希望最好。
    【解决方案3】:

    你可以试试这个

    public static object LoadObject()
     {
       try
         {
           if (File.Exists("D://my.bin"))
             {
                FileStream stream = File.OpenRead("D://my.bin");
                BinaryFormatter formatter = new BinaryFormatter();
    
                Dictionary<int, Question> deserializedObject = (Dictionary<int, Question>)formatter.Deserialize(stream);
                stream.Close();
                return deserializedObject;
             }
         }
        catch
           {
             return null;
           }
         return null;
     }
    

    【讨论】:

      【解决方案4】:

      正如错误消息所示,所有代码路径都必须返回一个值。您有两个没有返回值的情况:

      1. 如果文件不存在。
      2. 如果抛出异常。

      将代码改为:

      try
      {
          if (File.Exists("D://my.bin"))
          {
             ...
             return deserializedObject;
          }
      }
      catch
      {
      
      }
      return null; // Or return an empty dictionary with:
                   // return new Dictionary<int, Question>();
      

      【讨论】:

        猜你喜欢
        • 2019-09-15
        • 2013-07-01
        • 2014-04-16
        • 2015-02-07
        • 2012-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多