我的代码出现问题。我已经运行并调试了好几次。如果我不在我的getEntry函数中抛出异常,它似乎工作正常。但是当我抛出异常时,我的程序在此之后会出现分段错误。当我通过程序调试时,似乎getEntryHelper中的nextNodePtr不是0x0。因此它在抛出异常后会以某种方式被更改,我不明白为什么。
我的主要人物:
#include <iostream>
#include "BinarySearchTree.h"
int main {
BinarySearchTree<std::string,std::string> myTree;
myTree.add("book");
myTree.add("encyclopedia");
myTree.add("automobile");
myTree.add("zebra");
myTree.getEntry(zebra);
myTree.getEntry(xylophone);
myTree.getEntry(tree); // Does not get to here
}
这是我的add和getEntry方法(虽然看起来我的getEntry是问题所在:
template<typename KeyType, typename ItemType>
void BinarySearchTree<KeyType,ItemType>::add(const ItemType& newEntry) {
if(rootPtr == NULL)
rootPtr = new BinaryNode<ItemType>(newEntry);
else {
addHelper(rootPtr,rootPtr,newEntry);
}
}
template<typename KeyType, typename ItemType>
ItemType BinarySearchTree<KeyType,ItemType>::getEntry(const KeyType& aKey) const
throw(NotFoundException) {
try {
BinaryNode<ItemType>* temp = getEntryHelper(rootPtr,aKey);
std::cout << temp->getItem() << "\n";
return temp->getItem();
}
catch(NotFoundException& nf) {
std::cout << nf.what();
}
}
template<typename KeyType, typename ItemType>
void BinarySearchTree<KeyType,ItemType>::addHelper(BinaryNode<ItemType>* prevNodePtr,
BinaryNode<ItemType>* nextNodePtr,
const ItemType& newEntry) {
if(nextNodePtr == NULL) { // Base Case
nextNodePtr = new BinaryNode<ItemType>(newEntry,NULL,NULL);
if(newEntry < prevNodePtr->getItem())
prevNodePtr->setLeftChildPtr(nextNodePtr);
else
prevNodePtr->setRightChildPtr(nextNodePtr);
return;
}
if(newEntry < nextNodePtr->getItem()) {
prevNodePtr = nextNodePtr;
nextNodePtr = nextNodePtr->getLeftChildPtr();
addHelper(prevNodePtr,nextNodePtr,newEntry);
}
else {
prevNodePtr = nextNodePtr;
nextNodePtr = nextNodePtr->getRightChildPtr();
addHelper(prevNodePtr,nextNodePtr,newEntry);
}
}
template<typename KeyType, typename ItemType>
BinaryNode<ItemType>* BinarySearchTree<KeyType,ItemType>::getEntryHelper(BinaryNode<ItemType>* nextNodePtr,const KeyType& aKey) const {
if(nextNodePtr == NULL) {
throw NotFoundException("does not exist in tree.\n");
}
else if(nextNodePtr->getItem() == aKey)
return nextNodePtr;
else if(aKey < nextNodePtr->getItem()) {
getEntryHelper(nextNodePtr->getLeftChildPtr(),aKey);
}
else {
getEntryHelper(nextNodePtr->getRightChildPtr(),aKey);
}
}
输出: 汽车 书 百科全书 斑马 斑马 前提条件违规异常:树中不存在木琴。 分段错误(核心转储)
答案 0 :(得分:1)
快速浏览一下,我发现几乎没有问题可以解决异常问题。
函数getEntry()表示它可以提示NotFoundException,但在main()中我看不到任何异常处理程序。所以在main()函数中放置一个基本的try catch,它可以处理任何异常。
int main()
{
try
{
//some code
}
catch(..)
{
cout << "Unkown Exception";
}
return 0;
}
函数getEntry()表示它可以提供NotFoundException,但是你有一个try catch块,你可以处理异常,但是从不重新抛出任何新的\ modified NotFoundException。如果你不想抛出它,那么在函数声明中注释throw(NotFoundException)。
ItemType BinarySearchTree<KeyType,ItemType>::getEntry(const KeyType& aKey) //const throw (NotFoundException) -> Comment this
如果在处理NotFoundException之后没有,请重新抛出它。
catch(NotFoundException& nf) {
std::cout << nf.what();
rethrow;
}
但我仍然不确定你的二进制代码插入逻辑是否正常工作。如果您遇到任何逻辑问题,请发布整个标头和cpp文件。