如何处理NullReferenceException错误

时间:2015-08-07 14:42:05

标签: asp.net-mvc-4 error-handling nullreferenceexception

我的网站停了几天,因此我试图产生一些错误处理,而MVC应用程序无法访问某些资源,所以如果某些东西不能再次变得不可用,那么整个过程就不会失败。

目前,控制器正在尝试访问不可用的viewbag.moreNewProducts。

public ActionResult Index(string search)
    {
        string[] newProductLines = this.getMoreNewProducts();
        string[] newNews = this.getMoreNews();
        string[] newPromotions = this.getMorePromotions();
        string[] fewerProductLines = this.getLessNewProducts(newProductLines);
        ViewBag.moreNewProducts = newProductLines;
        ViewBag.moreNews = newNews;
        ViewBag.morePromotions = newPromotions;
        ViewBag.lessNewProducts = fewerProductLines;
        bool disableShowMore = false;

这是我遇到错误的地方:“foreach(newProductLines中的字符串行)”

public string[] getLessNewProducts(string[] newProductLines)
    {
        int charCount = 0;
        int arrayCount = 0;
        string[] displayProductLines = new string[6];
        bool continueWriting;

            if (newProductLines == null)
            {

                foreach (string line in newProductLines)
                {
                    continueWriting = false;
                    for (int i = 0; charCount < 250 && i < line.Length && arrayCount < 5; i++)
                    {
                        string index = newProductLines[arrayCount].Substring(i, 1);
                        displayProductLines[arrayCount] += index;
                        charCount++;
                        continueWriting = true;
                    }
                    if (continueWriting == true)
                    {
                        arrayCount++;
                    }
                }
                string[] LessNewProducts = new string[arrayCount];
                for (int d = 0; d < arrayCount; d++)
                {
                    LessNewProducts[d] = displayProductLines[d];
                }
                return LessNewProducts;

            }

            else
            {
                return null;
            }




    }

如何解决if else语句,以便整个事情不必崩溃?

3 个答案:

答案 0 :(得分:0)

if(newProductLines == null)

应替换为if(newProductLines!= null),因此您不必将newProductLines处理为null。基本上,在这种情况下,除非使用try catch块管理异常,否则将始终具有NullReferenceException。

答案 1 :(得分:0)

两件事。

  1. 您的if (newProductLines == null)语句的条件错误。如果newProductLines为空,我不相信你想输入它。您可以反转此条件以获得所需的结果(if (newProductLines != null))。
    1. 如果您稍后遇到需要捕获错误的其他情况,可以始终使用try-catch块来捕获您期望的异常。
    2. try
      {
         //code that could cause the error here
      }
      catch(NullReferenceException nullRefExcep)
      {
         //what you want it to do if the null reference exception occurs
      }
      

答案 2 :(得分:0)

要问自己的真正问题是:

  

为什么newProductLines会为空?

据推测,getMoreNewProducts()发现了一种情况,认为返回null值是合适的。

如果发生这种情况是因为系统有错误导致您的页面无意义,那么您可能只想更改getMoreNewProducts(),以便在发生错误状态时抛出异常。通常,它是最安全和最容易调试的程序,一旦遇到意外情况就会失败。

如果发生这种情况是因为没有新产品,那么您应该只返回一个空集合,而不是null。在那之后你的所有代码都应该正常工作,而不需要if / else语句:它将为LessNewProducts返回一个空数组,这可能是正确的。

但是,我们假设您预期的情况会不时发生,这将使您无法在那时检索newProductLines,但是你希望系统能够优雅地处理它。您可以只使用null来表示该值不存在,但很难知道哪些变量可能为空,哪些变量永远不应该为空。使用an optional type来表示getMoreNewProducts()可能根本不返回任何内容可能更明智,因此您可以强制任何消费代码识别这种可能性并找出在项目开始之前如何处理它编译:

public ActionResult Index(string search)
{
    Maybe<string[]> newProductLines = this.getMoreNewProducts();
    string[] newNews = this.getMoreNews();
    string[] newPromotions = this.getMorePromotions();
    Maybe<string[]> fewerProductLines = newProductLines.Select(this.getLessNewProducts);

免责声明:我是上面引用的Maybe<>类的作者。

以下是我建议的其他一些改进措施:

  1. 不要使用ViewBag。相反,创建一个强类型的ViewModel,以便您可以更频繁地在编译时捕获代码中的错误:

    var viewModel = new ReportModel {
        newProductLines = this.getMoreNewProducts(),
        newNews = this.getMoreNews(),
        ...
    };
    ...
    return View(viewModel);
    
  2. 学习使用LINQ。它将简化许多非常复杂的代码。例如,而不是:

            string[] LessNewProducts = new string[arrayCount];
            for (int d = 0; d < arrayCount; d++)
            {
                LessNewProducts[d] = displayProductLines[d];
            }
            return LessNewProducts;
    

    ......你可以说:

            string[] LessNewProducts = displayProductLines.Take(arrayCount).ToArray();
    

    事实上,我认为您的整个getLessNewProducts()方法可以替换为:

    return newProductLines
        .Where(line => line.Length > 0)
        .Select(line => line.Substring(0, Math.Min(line.Length, 250)))
        .Take(5);