我试图在c ++中使用标准异常类,如:
#include <iostream>
#include <exception>
using namespace std;
int main(){
int a[6]={12,3,2,4,5,6};
int n=6;
try{
cout<<a[6]<<" ";
}
catch(std::exception & exc)
{
cout<<exc.what();
}
return 0;
}
但是没有向我显示错误 - “超出索引”,它会抛出运行时错误,说“变量a未初始化”,为什么?我已将其声明为数组并对其进行初始化。请给我一些建议,为什么会这样做?
答案 0 :(得分:14)
访问a[6]
是未定义的行为,因为a
的唯一有效索引是0
.. 5
。
您不应期望a[6]
执行任何边界检查,更不用说在越界数组访问上抛出C ++异常。
如果您想要自动边界检查,请将a
设为std::vector<int>
并使用a.at(index)
访问其元素。
答案 1 :(得分:4)
标准数组不会检查您的访问范围。如果你想要一个绑定的检查数组,你可以使用boost/std::array
或std::vector
并使用绑定的安全访问函数at()
。
答案 2 :(得分:2)
您已将a
声明为包含六个元素的数组;合法索引从0到5运行。表达式a[6]
的结果是未定义的行为 - 程序终止(在这种情况下)是结果。没有任何地方说非法数组访问会引发异常 - 这不是Java!
答案 3 :(得分:2)
c ++不检查数组大小,因此不会抛出异常。如果要进行此检查,则必须使用STD容器,如std :: vector。
答案 4 :(得分:2)
C ++异常并不意味着用于捕获编程错误。它们存在运行时错误,例如无法打开文件等。