Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cli 托管C++;,对象引用未设置为对象的实例_C++ Cli_Managed_Nullreferenceexception_Runtime Error - Fatal编程技术网

C++ cli 托管C++;,对象引用未设置为对象的实例

C++ cli 托管C++;,对象引用未设置为对象的实例,c++-cli,managed,nullreferenceexception,runtime-error,C++ Cli,Managed,Nullreferenceexception,Runtime Error,我以前遇到过这个问题,但从未遇到过这样的情况。我完全糊涂了。如问题所述,我得到了运行时错误“对象引用未设置为对象的实例”。使用调试器工具,我认为我已将问题精确定位到这一行: dataFileLocation=path; 整个功能如下: void DATReader::SetPath(字符串^path) { 如果(!File::存在(路径)) { MessageBox::Show(“DATReader(缺少dat文件:\n”+path+“\n)”,“Error”,MessageBoxButton

我以前遇到过这个问题,但从未遇到过这样的情况。我完全糊涂了。如问题所述,我得到了运行时错误“对象引用未设置为对象的实例”。使用调试器工具,我认为我已将问题精确定位到这一行:

dataFileLocation=path;
整个功能如下:

void DATReader::SetPath(字符串^path)
{
如果(!File::存在(路径))
{
MessageBox::Show(“DATReader(缺少dat文件:\n”+path+“\n)”,“Error”,MessageBoxButtons::OK,MessageBoxIcon::叹号);
回来
}
dataFileLocation=path;
}
dataFileLocation
在此声明,但未为其分配任何内容:

ref类数据读取器
{
私人:
系统::字符串^dataFileLocation;
// ...
}
现在我知道出现错误的原因是,
dataFileLocation
未分配任何内容。但我在分配它时遇到了问题。当我添加
=0时=0System::String^
转换为
int
。如果我将其分配给
=gcnew字符串(“”)它生成,但引发相同的运行时异常


我不明白,我是不是看错了调试器,而这根本不是问题的根源?我最近刚开始使用托管代码,所以我很困惑:\< /p>< P>托管C++使用空代码引用>代码> nulLPTR < /代码>。因此,您可以检查:

if (path == nullptr) { ... }
或使用:

if (!String::IsNullOrEmpty(path))

托管C++使用空引用引用代码> NulLPTR < /代码>。因此,您可以检查:

if (path == nullptr) { ... }
或使用:

if (!String::IsNullOrEmpty(path))

您可能需要检查并确保DATReader对象不为null,它可能会在DATReader.SetPath()调用时引发异常。

您可能需要检查并确保DATReader对象不为null,它可能会在DATReader.SetPath()上引发异常调用。

这是C++中缺少的一个细节。C#生成的代码确保该值永远不能为空。通过在方法上设置断点并检查“this”,可以很容易地在调试器中看到。下面是一个复制异常的示例程序:

#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;
}
#包括“stdafx.h”
使用名称空间系统;
参考类示例{
字符串^dataFileLocation;
公众:
void SetPath(字符串^path){
dataFileLocation=path;//在此处设置断点并检查“this”
}
};
int main(数组^args)
{
示例^obj/*=gcnew-Example*/;
obj->SetPath(“foo”);
返回0;
}
删除要修复的/**/注释。通过查看调用堆栈找到忘记实例化对象的方法来修复代码。

这是C++中缺少的一个细节。C#生成的代码确保该值永远不能为空。通过在方法上设置断点并检查“this”,可以很容易地在调试器中看到。下面是一个复制异常的示例程序:

#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;
}
#包括“stdafx.h”
使用名称空间系统;
参考类示例{
字符串^dataFileLocation;
公众:
void SetPath(字符串^path){
dataFileLocation=path;//在此处设置断点并检查“this”
}
};
int main(数组^args)
{
示例^obj/*=gcnew-Example*/;
obj->SetPath(“foo”);
返回0;
}

删除要修复的/**/注释。通过查看调用堆栈找到忘记实例化对象的方法来修复代码。

您确定不是
path
为null吗?path为null不应导致该行出现错误-如果错误在另一行,则允许,那可能是对的。你确定它不是空的吗?路径为空不应该导致该行出现错误-当然,如果错误在另一行,那可能是对的。谢谢!我完全忘记了nullptr关键字。谢谢!我完全忘记了nullptr关键字。我可以批准这个,我现在有这样一个错误。在调试时,似乎已经创建了DATReader对象,我可以进入它的方法,只是在第一行失败。但是我给出的参数没有问题,只是DATReader引用为空…我可以批准这个,我现在有这样一个错误。在调试时,似乎已经创建了DATReader对象,我可以进入它的方法,只是在第一行失败。但我给出的参数没有问题,只是DATReader引用为空。。。