如果列表中有NULL对象,我该如何处理异常?
#include <iostream>
#include <string>
#include <vector>
#include <exception>
#include <Windows.h>
using namespace std;
class Test {
public:
string m_say;
void Say() {
cout << m_say << endl;
}
Test(string say) {
m_say = say;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
vector<Test*> lst;
Test * a = new Test("YO!");
lst.push_back(a);
lst.push_back(nullptr);
for (vector<Test*>::iterator iter = lst.begin(); iter != lst.end(); iter++)
{
try {
Test * t = *iter;
t->Say();
}
catch (exception& e) {
cout << e.what() << endl;
}
catch (...) {
cout << "Error" << endl;
}
}
return 0;
}
此代码将生成“访问冲突读取”异常,并且无法捕获“try / catch”。我尝试使用“__try / __ except”,但这只会给我以下编译错误:
C2712:无法在需要对象展开的函数中使用__try。
答案 0 :(得分:5)
您应该检查迭代器是否指向nullptr
。
for (vector<Test*>::iterator iter = lst.begin(); iter != lst.end(); iter++)
{
if (*iter != nullptr)
(*iter)->Say();
}
修改
如果您希望在nullptr
遇到for (vector<Test*>::iterator iter = lst.begin(); iter != lst.end(); iter++)
{
if (*iter == nullptr)
throw some_type_of_excpetion;
(*iter)->Say();
}
时抛出一个激活,那么您可以使用
frameBorder="0"
答案 1 :(得分:4)
如果与Java之类的语言相比,取消引用空指针,则C ++不会抛出异常。您必须显式检查空指针。
答案 2 :(得分:4)
嗯......你可以用/EHa
标志构建你的项目。它可能将Win32异常转换为常规C ++异常。那么你可以用
catch(...){}
<强> 但是 强>
你不应该依赖这种hackish方式来取代经常被证明的处理内存异常的方法 - 不要在第一时间创建它们!
通过定期空检查可以轻松解决您的问题。
if (t){
t->Say();
}