Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么minVal不更新?_Java_Data Structures_Logic - Fatal编程技术网

Java 为什么minVal不更新?

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

我不明白为什么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 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.
}