LINQ中的System.NullReferenceException

时间:2017-05-27 21:06:19

标签: c# linq nullreferenceexception

基于先前编写的code snippet,我现在尝试将多个图像从某个subreddit一次存储到本地目录中。我的问题是我无法使我的LINQ语句正常工作。我也不想下载缩略图,这就是我查看HTML页面的原因,并发现我想要检索的链接隐藏在def属性中的第5级:

href

这是我最好的赌注'???':

(...)
Level 1: <div class="content">...</div>
    Level 2: <div class="spacer">...</div>
        Level 3: <div class="siteTable">...</div>
            Level 4: <div class=" thing id-t3_6dj7qp odd  link ">...</div>                      
                Level 5: <a class="thumbnail may-blank outbound" href="href="http://i.imgur.com/jZ2ZAyk.jpg"">...</a>

可悲的是,它抛出error说明

.Where(link => Directory.GetParent(link).Equals(@"http://i.imgur.com"))

现在我知道为什么它不起作用但我仍然不知道如何重写这一行,因为我还是对Lambda Expressions还不熟悉。说实话,我真的不知道为什么我首先得到 Object reference not set to an instance of an object 而不是下一行。有什么不同?也许我对这个问题的处理方法甚至都不是很好的做法,所以请让我知道如何进一步。

System.NullReferenceException

修改:如果有人对此解决方案感兴趣,我最终会使用以下答案让其工作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Net;
using HtmlAgilityPack;

namespace GetAllImages
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> imageLinks = new List<string>();

            // Specify Directory manually
            string dirName = "Jessica Clements";
            string rootPath = @"C:\Users\Stefan\Desktop";
            string dirPath = Path.Combine(rootPath, dirName);

            // Specify the subReddit manually
            string subReddit = "r/Jessica_Clements";
            string url = @"https://www.reddit.com/" + subReddit;

            try
            {
                DirectoryInfo imageFolder = Directory.CreateDirectory(dirPath);                

                HtmlDocument document = new HtmlWeb().Load(url);
                imageLinks = document.DocumentNode.Descendants("a")
                            .Select(element => element.GetAttributeValue("href", null))
                            .Where(???) 
                            .Where(stringLink => !String.IsNullOrEmpty(stringLink))
                            .ToList();

                foreach(string link in imageLinks)
                {
                    using (WebClient _wc = new WebClient())
                    {
                        _wc.DownloadFileAsync(new Uri(link), Path.Combine(dirPath, Path.GetFileName(link)));
                    }                        
                 }

            Console.WriteLine($"Files successfully saved in '{Path.GetFileName(dirPath)}'.");             

            }

            catch(Exception e)
            {
                while(e != null)
                {
                    Console.WriteLine(e.Message);
                    e = e.InnerException;
                }
             }

            if(System.Diagnostics.Debugger.IsAttached)
            {
                Console.WriteLine("Press any key to continue . . .");
                Console.ReadKey(true);
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

鉴于此行抛出异常:

.Where(link => Directory.GetParent(link).Equals(@"http://i.imgur.com"))

我确保link不为空且GetParent(link)的结果也不为空。所以你可以这样做:

.Where(link => link != null && (Directory.GetParent(link)?.Equals(@"http://i.imgur.com") ?? false))

注意空检查和?.之后的GetParent()。如果从GetParent()返回null,则会停止执行该术语。它被称为Null Conditional Operator或&#34;猫王运营商&#34;因为它可以被看作是两只眼睛的头发。 ?? false给出了默认值,以防由于空值而停止执行。

然而,如果您打算解析HTML代码,请务必查看Html Agility Pack (HAP)

答案 1 :(得分:1)

如果您尝试将所有链接指向http://i.imgur.com,则需要这样的内容

for(i=1, j=0;i<10;i++) {
    j += i;
}
System.out.println(i);