Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NullReferenceException while objects involved are valid

NullReferenceException is being thrown on a line on which all involved objects are valid. StackTrace shows the line # is 432.

The code is

enter image description here

Here, Flags and tempFlags both are datatables. Data types of columns of both datatables are primitive (decimal, datetime, short). The application is a multithreaded application and the code snippet belongs to the thread function. Flags is decalred at instance level i.e. shared to all threads while tempFlags is declared inside the thread function.

Here at this particular instance of time the Flags contains 1946 records and tempFlags contains 1. So, why is this NullReferenceException ??

Edit # 1

ex.InnerException
null
ex.StackTrace
at System.Data.DataTable.RecordStateChanged(Int32 record1, DataViewRowState oldState1, DataViewRowState newState1, Int32 record2, DataViewRowState oldState2, DataViewRowState newState2)
at System.Data.DataTable.InsertRow(DataRow row, Int64 proposedID)
at System.Data.DataTable.MergeRow(DataRow row, DataRow targetRow, Boolean preserveChanges, Index idxSearch)
at System.Data.Merger.MergeTable(DataTable src, DataTable dst)
at System.Data.Merger.MergeTableData(DataTable src)
at System.Data.Merger.MergeTable(DataTable src)
at System.Data.DataTable.Merge(DataTable table, Boolean preserveChanges, MissingSchemaAction missingSchemaAction)
at System.Data.DataTable.Merge(DataTable table)
at [...].cs:line 432"
ex.Data
    {System.Collections.ListDictionaryInternal}
        [System.Collections.ListDictionaryInternal]: {System.Collections.ListDictionaryInternal}
        IsFixedSize: false
        IsReadOnly: false
        Keys: {System.Collections.ListDictionaryInternal.NodeKeyValueCollection}
        Values: {System.Collections.ListDictionaryInternal.NodeKeyValueCollection}
ex.Message
"Object reference not set to an instance of an object."
ex.Source
"System.Data"

Edit # 2

It looks the Merge statement is not thread safe as after putting line 432 inside a lock, the exception is gone, SO FAR.

like image 282
bjan Avatar asked Jan 02 '13 05:01

bjan


2 Answers

Whenever you get NullReferenceException from within the framework and you're multithreading, it's almost certainly a thread-safety issue where you are not applying locks where you should be.

like image 115
Andrew Arnott Avatar answered Oct 19 '22 21:10

Andrew Arnott


Since it appears to be happening when inserting a new row, System.Data.DataTable.InsertRow(DataRow row, Int64 proposedID) I would guess there is a constraint saying a field cannot be null. And you are trying to insert a null from the source table.

Or, there is a calculated column and one of the input columns is null.

like image 27
Steve Wellens Avatar answered Oct 19 '22 21:10

Steve Wellens