开发者

Managed C++, Object reference not set to an instance of an object

I've run into this problem before, but never in a situation like this. I'm completely confused. As the question states, I'm getting the runtime error "Object reference not set to an instance of an object." Using the debugger tools, I think I've pinpointed the problem to this line:

dataFileLocation = path;

The entire function is here:

void DATReader::SetPath(String^ path) 
{
    if(!File::Exists(path))
    {
        MessageBox::Show( "DATReader (missing dat file: \n"+path+"\n )", "Error", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
        return;
    }
    dataFileLocation = path;
}

dataFileLocation is declared here, but nothing is assigned to it:

ref class DATReader
{
private:
    System::String^ dataFileLocation;
    // ...
}

Now I know the reason I'm getting the error is because dataFileLocation is assigned to nothing. But I'm having problems assigning it. When I add = 0; to it, it won't build because its a ref class. When I try to assigned it to = 0; in the constructor, it yells at me for trying to convert it from a System::String^ to an int. If I assign it to a = gcnew String(""); it builds, but th开发者_StackOverflow中文版rows the same runtime exception.

I don't get it, am I reading the debugger wrong, and this isn't the source of the problem at all? I've just started to use managed code recently, so I'm confused :\


You may want to check and make sure your DATReader object isn't null as well It may be throwing the exception at your DATReader.SetPath() call.


This is a nicety in C# that's missing in C++/CLI. C# generates code that ensures this can never be null. Easily seen in the debugger by setting a breakpoint on the method and inspecting "this". Here's an example program that reproduces the exception:

#include "stdafx.h"

using namespace System;

ref class Example {
    String^ dataFileLocation;
public:
    void SetPath(String^ path) { 
        dataFileLocation = path;   // Set breakpoint here and inspect "this"
    }
};

int main(array<System::String ^> ^args)
{
    Example^ obj /* = gcnew Example */;
    obj->SetPath("foo");
    return 0;
}

Remove the /* */ comments to fix. Fix your code by looking at the call stack to find the method that forgot to instantiate the object.


Managed C++ uses nullptr for null references. So you can check:

if (path == nullptr) { ... }

or use:

if (!String::IsNullOrEmpty(path))
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜