Java 为什么minVal不更新?
我不明白为什么MinStack类中的minCheck函数在从push函数调用时不能成功更新minVal的值。忽略逻辑错误,即如果弹出minVal,minVal的值将不代表实际的min值Java 为什么minVal不更新?,java,data-structures,logic,Java,Data Structures,Logic,我不明白为什么MinStack类中的minCheck函数在从push函数调用时不能成功更新minVal的值。忽略逻辑错误,即如果弹出minVal,minVal的值将不代表实际的min值 public class MinStack { int[] array; //array to hold elements int n = 0; // number of elements in array int minVal=10000; // smallest value
public class MinStack {
int[] array; //array to hold elements
int n = 0; // number of elements in array
int minVal=10000; // smallest value in array (initialize to 1000 to prove it wont change)
public int size() { //ignore this useless method
return n;
}
public void push(int x) {
if((n+1)>array.length)
resize();
array[n] = x;
n++;
minCheck(x); // minCheck will check if x is the new smallest value, and set minVal = x if it is.
}
public int pop() {
int x = array[n-1];
n--;
return x;
}
public void minCheck(int x) {
if(n==1)
minVal = x; //if x is the only element in the array, it must be the minVal
else {
if(minVal>x) //if x is smaller than current minVal, it becomes the minVal
minVal = x;
}
}
private void resize() { //method not relevant to the question
int[] secondArray = new int[(Math.max(1, n * 2))];
for(int i=0; i<n; i++) {
secondArray[i] = array[i];
}
array = secondArray;
}
public String printMinVal() {
return "minimum value is: " + minVal;
}
public static void main(String[] args) {
MinStack myStack = new MinStack();
try {
myStack.push(3);
myStack.push(2);
myStack.push(1);
myStack.push(4);
myStack.push(5);
myStack.pop();
} catch(NullPointerException e) {};
System.out.println(myStack.printMinVal()); //would expect to get "minimum value is 1" as console output, but instead get "minimum value is 1000"
}
}
公共类MinStack{
int[]数组;//用于保存元素的数组
int n=0;//数组中的元素数
int minVal=10000;//数组中的最小值(初始化为1000以证明它不会改变)
public int size(){//忽略这个无用的方法
返回n;
}
公共无效推送(int x){
if((n+1)>数组长度)
调整大小();
数组[n]=x;
n++;
minCheck(x);//minCheck将检查x是否是新的最小值,如果是,则设置minVal=x。
}
公共int-pop(){
int x=数组[n-1];
n--;
返回x;
}
公共无效检查(整数x){
如果(n==1)
minVal=x;//如果x是数组中唯一的元素,则它必须是minVal
否则{
if(minVal>x)//如果x小于当前minVal,它将成为minVal
minVal=x;
}
}
私有void resize(){//方法与问题无关
int[]secondArray=newint[(Math.max(1,n*2));
对于(int i=0;i发生的情况是,您在第一次push()
中得到了一个NullPointerException
,因为您没有初始化数组
在这里:
您捕获了异常,但没有显示它。因此您认为它运行了,但实际上没有。初始化数组,所有操作都应该正常工作
作为建议,请确保显示所有捕获的异常(通过日志记录,或仅将其打印到控制台),和/或如果是非暂时性错误(如此错误),则不要在该过程之后继续该过程。不这样做是危险的。发生的情况是,在第一次推送()
,因为您没有初始化阵列
在这里:
您捕获了异常,但没有显示它。因此您认为它运行了,但实际上没有。初始化数组,所有操作都应该正常工作
作为建议,请确保显示所有捕获的异常(通过日志记录,或仅将其打印到控制台),和/或如果这是一个非暂时性错误(如此错误),则不要继续此过程。不这样做是危险的。永远不要捕获NullPointerException
!永远不要捕获异常并对其执行任何操作,甚至不要记录它。永远不要捕获NullPointerException
!永远不要捕获异常并对其执行任何操作,甚至不记录。最重要的是:删除尝试捕获!是的,完全同意。最重要的是:删除尝试捕获!是的,完全同意
public void push(int x) {
if((n+1)>array.length) //array is null, calling length throws the exception
resize();
array[n] = x;
n++;
minCheck(x); // minCheck will check if x is the new smallest value, and set minVal = x if it is.
}