【发布时间】:2019-10-31 19:48:25
【问题描述】:
我目前正在尝试调试我正在为一个名为 MyString 的类编写的 indexOf() 方法。以下是相关方法:
public int indexOf(int startIndex, char ch)
{
if(startIndex < 0 || startIndex >= length())
{
System.out.println("\nFATAL ERROR: indexOf() given invalid startIndex\n");
System.exit(0);
}
for(int i = startIndex; i < this.length(); i++)
{
if(this.charAt(i) == ch)
{
return i;
}
}
return NOT_FOUND;
}
public int indexOf(MyString key)
{
if(key.length() > this.length())
{
return NOT_FOUND;
}
int indexOfFirstKeyLetter = indexOf(0, key.letters[0]);
while(indexOfFirstKeyLetter != NOT_FOUND)
{
if(keyFound(indexOfFirstKeyLetter, key))
{
return indexOfFirstKeyLetter;
}
else
{
indexOfFirstKeyLetter = indexOf(indexOfFirstKeyLetter + 1, key.letters[0]);
}
}
return NOT_FOUND;
}
private boolean keyFound(int indexOfFirstKeyLetter, MyString key) //Note: this method works for most strings, but doesn't work if the end of MyString is identical to the first few letters of key (ex: ado and dog falsely returns as true)
{
for(int i = indexOfFirstKeyLetter; i < key.length() + indexOfFirstKeyLetter && i < this.length(); i++)
{
if(this.letters[i] != key.letters[i - indexOfFirstKeyLetter])
{
return false;
}
}
return true;
}
我相信问题出在我的 keyFound 方法上,虽然它适用于大多数字符串,但当正在测试的 MyString 对象的结尾与它所比较的键的前几个字母相同时,它将返回 true。例如,在indexOf(MyString other)方法中测试“ado”和“dog”时,返回值1,表示在this.letters[1]位置找到匹配开始的索引,当它应该返回 NOT_FOUND 或 -1,因为完整的键字符串“dog”不在“ado”中。有什么方法可以改变我的 keyFound 方法来解决这个问题?
【问题讨论】:
-
爱它 - 我用无效索引调用你的方法,整个 JVM 退出。
-
很少有使用
System.exit的正当理由。考虑抛出异常。然后调用者可以弄清楚如何处理它,并可以决定他是要恢复还是崩溃。使用System.exit,您将杀死一切,没有人有机会做出反应甚至执行正确的关闭逻辑。 -
我知道我可以很容易地抛出一个异常来阻止代码简单地退出,但这就是我的教授希望它用于作业的方式,因为我们还没有~正式~学习异常。
-
欢迎来到 Stack Overflow!请阅读“如何创建minimal reproducible example”。然后使用edit 链接改进您的问题(不要通过 cmets 添加更多信息)。否则我们无法回答您的问题并为您提供帮助。不要冗长地描述您的代码何时失败。给我们一段完整的代码,其中已经包含您的示例代码。是的:忘记 system.exit,研究异常!
-
告诉你的教授,教人们以后必须忘记的东西是个坏主意;-)