我需要编写一个返回数组中运行时间最长的程序。程序运行正常,直到给出一个空参数。它产生一个0,但显示出一个Out of Bounds Error。我该如何解决这个问题?
这是我目前的代码:
public class Numbers{
/**Computes the length of the longest run (sequence of
adjacent repeated values) in an array.
@param values an array of integer values
@return the length of the longest run in values
*/
public int lengthOfLongestRun(int[] values){
int lastVal = values[0];
int currentLength = 1;
int longestLength = 1;
for (int i = 1; i < values.length; i++)
{
if (values[i] == lastVal)
{
currentLength++;
}
else
{currentLength = 1;}
lastVal = values[i];
if (currentLength > longestLength)
{ longestLength = currentLength; }
}
return longestLength;
}
}
错误: java.lang.ArrayIndexOutOfBoundsException
答案 0 :(得分:1)
代码的第一行:
int lastVal = values[0];
假设数组中至少有一个值。
所以添加防守线:
if (values.length==0){
return 0;
}
答案 1 :(得分:1)
当数组为空时,该行将产生异常:
int lastVal = values[0];
在执行任何其他操作之前,您需要添加一个检查以查看数组是否为非空:
public int lengthOfLongestRun(int[] values) {
if (values == null || values.length == 0) {
return 0;
}
// The rest of your method goes here
...
}
通常,最好在方法顶部以参数检查的形式说明方法对其参数内容的假设。例如,如果您知道在传递null
或空集合时方法不起作用,请在顶部添加一个检查以立即返回或根据需要抛出异常。
注意:您应该修复代码中的else
以包括重置长度和最后一个值,如下所示:
...
else {
currentLength = 1;
lastVal = values[i];
}
答案 2 :(得分:1)
您的错误就在这一行:
lastVal = values[i];
我的初始值为1,当给出空参数时,值为空数组。
答案 3 :(得分:0)
获取数组中数字的最大序列:
public int maxSequence(int[] A, int number) {
int counter = 0, maxCounter = 0;
for (int i = 0; i < A.length; i++)
if (A[i] == number)
maxCounter = ++counter > maxCounter ? counter : maxCounter;
else
counter = 0;
return maxCounter;
}
答案 4 :(得分:0)
最好在开始处理之前对empty
或null
进行检查并对其采取适当的措施。
在你的情况下是array
,请参考以下代码:
/**
* Computes the length of the longest run (sequence of adjacent repeated
* values) in an array.
*
* @param values
* an array of integer values
* @return the length of the longest run in values
*/
public int lengthOfLongestRun(int[] values) {
int longestLength = 1;
if (values != null && values.length > 0) {
int lastVal = values[0];
int currentLength = 1;
for (int i = 1; i < values.length; i++) {
if (values[i] == lastVal) {
currentLength++;
} else {
currentLength = 1;
}
lastVal = values[i];
if (currentLength > longestLength) {
longestLength = currentLength;
}
}
} else {
// take some action either return some default value or throw some
// exception
}
return longestLength;
}