On Sun, Jul 12, 2009 at 12:56 PM, Andorien<[email protected]> wrote: > So I'm trying to put together a simple RSS feed reader as sort of a personal > project. It uses the standard design of a feed list to the left, a list of > articles on top, and the actual article being displayed on bottom. The > desired behavior is that selecting a feed will clear the article list of any > previous entries and populate it with the feed's articles. Selecting an > article then loads the Webkit.WebView widget with the html string from the > article for display. The crash occurs if you have a feed as well as an > article already selected, and you click another feed to select. This causes > an exception to be thrown with the following text: > > System.NullReferenceException: Object reference not set to an instance of an > object > > It should be noted that this crash doesn't occur when selecting different > feeds as long as an article hasn't been selected yet. Here are the relevant > functions: > > void OnFeedSelectionChanged(object o, EventArgs args) > { > TreeSelection selection = (TreeSelection) o; > TreeIter iter; > selection.GetSelected(out iter); > > Feed feed = (Feed) FeedList.Model.GetValue(iter, 0); > > ItemList.View.Selection.UnselectAll(); // <-- Crash occurs at both this > function call and the next > ItemList.Model.Clear(); > > for(byte n = 0; n < feed.Items.Count; n++) > ItemList.Model.AppendValues(feed.Items[n]); > } > > void OnItemSelectionChanged(object o, EventArgs args) > { > TreeSelection selection = (TreeSelection) o; > TreeIter iter; > selection.GetSelected(out iter); > > Feed.FeedItem item = (Feed.FeedItem) ItemList.Model.GetValue(iter, 0); > > View.LoadHtmlString(item.Contents, ""); > } > > Interestingly enough, if I remove the code loading the WebView widget with > HTML, the crash disappears. This initially led me to believe that there was > a problem with WebView, but replacing it with gtk.HTML resulted in the same > problem. I figure there must be some issue with the why I'm manipulating the > two TreeViews, but I have no idea. Any help would be greatly appreciated.
The problem here is rather simple. When you call UnselectAll, you are causing a selection change to occur. OnItemSelectionChanged is being called to handle this, but nowhere do you handle the case where there is no item selected. Here is what's happening: /* This method is returning false, because there is no selection. You should alter your code path to handle this. Because you do not, iter is set to an invalid/zero TreeIter. */ selection.GetSelected(out iter); /* This line works fine, because GetValue is returning null, since the iter is invalid. You can cast null to any reference type successfully. */ Feed.FeedItem item = (Feed.FeedItem) ItemList.Model.GetValue(iter, 0); /* This line crashes because item is null. */ View.LoadHtmlString(item.Contents, ""); Simply handle the case where selection.GetSelected is returning false and you should have no issues. -- Chris Howie http://www.chrishowie.com http://en.wikipedia.org/wiki/User:Crazycomputers _______________________________________________ Gtk-sharp-list maillist - [email protected] http://lists.ximian.com/mailman/listinfo/gtk-sharp-list
