【背景】
一个C#程序,利用Amazon的AWS的API去获得对应的Amazon产品的信息。
结果运行期间出错:
************** Exception Text ************** System.NullReferenceException: Object reference not set to an instance of an object. at ScrapeAmazonProduct.frmScrapeAmazonProduct.awsGetAllProductInfo(String itemAsin, awsItemAttributes itemAttributes) at ScrapeAmazonProduct.frmScrapeAmazonProduct.processAmazonItem(String itemAsin) at ScrapeAmazonProduct.frmScrapeAmazonProduct.processAwsSearchItem(awsSearchResultItem singleAwsSearchItem) at ScrapeAmazonProduct.frmScrapeAmazonProduct.awsMainCategorySearch() at ScrapeAmazonProduct.frmScrapeAmazonProduct.btnSearch_Click(Object sender, EventArgs e) at System.Windows.Forms.Control.OnClick(EventArgs e) at System.Windows.Forms.Button.OnClick(EventArgs e) at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ButtonBase.WndProc(Message& m) at System.Windows.Forms.Button.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) |
对应最后的log信息是:
[2013-06-19 19:13:53][ INFO] =========================== [850] Valid: B0007S5N8O ============================ [2013-06-19 19:13:53][DEBUG] Extracting info for: B0007S5N8O [2013-06-19 19:13:53][ INFO] [Title] 9 Kenmore 50558, 5055, 50557 Micro Filtration Canister Vacuum Bags [2013-06-19 19:13:53][ INFO] [Description] Panasonic and Sears Kenmore Vacuum Clean …… [2013-06-19 19:13:53][ INFO] [BulletList] Total 1 bullets [2013-06-19 19:13:53][DEBUG] not find EditorialReviews for ASIN=B0007S5N8O |
【解决过程】
1.很明显,是哪里返回的空值,null值,导致出现:
Object reference not set to an instance of an object
的错误的。
2.所以就去看了看awsGetAllProductInfo部分的代码,找找是哪里返回的null。
同时,去看了看:
not find EditorialReviews for |
所对应的代码的部分,是函数
1 | public awsEditorialReview awsGetEditorialReview( string itemAsin) |
中的。
3.但是,结果去测试后发现,对于上述的B0007S5N8O,是可以正常返回对应的EditorialReviews的。
4.所以后来推测是:
之前通过正常的模式,利用HttpWebRequest和HttpWebResponse去获得一个url的html。
后来为了不阻塞UI线程,利用了BackgroundWorker去做这个事情。
以为是:
有时候,通过BackgroundWorker,利用HttpWebRequest和HttpWebResponse,所返回的html,会错乱掉。
比如正常的是:
url1获得是html1,然后url2获得是html2
但是有时候调用BackgroundWorker多次,或者是频率太高了?
会出现,访问url1但返回html2的情况,导致后续代码出错。
5.但是后来的结果证明,实际上,是由于之前的代码:
1 | public awsImages awsGetImages( string itemAsin) |
中,也是有上述的:
not find EditorialReviews for |
而实际上出错的,是上面的这个awsGetImages。
对应的B0007S5N8O返回的内容中,的确没有包含对应的Images:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <? xml version = "1.0" ?> < ItemLookupResponse > < OperationRequest > < HTTPHeaders > < Header Name = "UserAgent" Value = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E" /> </ HTTPHeaders > < RequestId >4878a911-d0ac-472b-9077-a3595a1773f4</ RequestId > < Arguments > < Argument Name = "Operation" Value = "ItemLookup" /> < Argument Name = "Service" Value = "AWSECommerceService" /> < Argument Name = "Signature" Value = "Fc7pdsPwmLFafceDEbRz2WlDW69TWoPtBbLqLw7lLfg=" /> < Argument Name = "AssociateTag" Value = "xxx" /> < Argument Name = "Version" Value = "2011-08-01" /> < Argument Name = "ItemId" Value = "B0007S5N8O" /> < Argument Name = "IdType" Value = "ASIN" /> < Argument Name = "AWSAccessKeyId" Value = "xxx" /> < Argument Name = "Timestamp" Value = "2013-06-20T04:52:21Z" /> < Argument Name = "ResponseGroup" Value = "Images" /> </ Arguments > < RequestProcessingTime >0.0091180000000000</ RequestProcessingTime > </ OperationRequest > < Items > < Request > < IsValid >True</ IsValid > < ItemLookupRequest > < IdType >ASIN</ IdType > < ItemId >B0007S5N8O</ ItemId > < ResponseGroup >Images</ ResponseGroup > < VariationPage >All</ VariationPage > </ ItemLookupRequest > </ Request > < Item > < ASIN >B0007S5N8O</ ASIN > </ Item > </ Items > </ ItemLookupResponse > |
【总结】
教训是:
1.以后写代码,还是要更加仔细,避免拷贝参考别的代码时,没有修改对应的部分的内容,而导致以后可能发生其他的问题。
比如此处在写awsGetImages的代码时,参考了awsGetEditorialReview,结果导致找不到Images节点时报错的信息,却是awsGetEditorialReview的
not find EditorialReviews for
而导致错误原因误判了,导致后续的调试困难。
幸亏后来发现及时,否则真不知道如何解决此问题了。
经验是:
1.在出错,异常的地方,该加的代码,要是尽量不要省,否则,却的时间,最后总会被bug所“补”上来的。。
转载请注明:在路上 » 【已解决】C#程序出错:Object reference not set to an instance of an object