gpt4 book ai didi

java - 堆栈实现中的空指针异常

转载 作者:行者123 更新时间:2023-12-01 07:05:22 25 4
gpt4 key购买 nike

这段代码是如何在push和main中产生NullPointerException的:这是代码:

class Stack {
private char ch[];
private int top;

Stack(int n) {
char ch[] = new char[n];
top = -1;
}

void push(char c) {
if (top == ch.length - 1) {
System.out.println("Stack full.");
return;
}
top++;
ch[top] = c;
}

char pop() {
if (isEmpty()) {
System.out.println("Stack empty");
return (char) 0;
}
char p;
p = ch[top];
top--;
return p;
}

boolean isEmpty() {
if (top == -1)
return true;
else
return false;
}
}


class StackDemo {
public static void main(String args[]) {
final int size = 10;
Stack s = new Stack(size);

// Push charecters into the stack
for (int i = 0; i < size; i++) {
s.push((char) ((int) 'A' + i));
}
// pop the stack untill its empty
for (int i = size - 1; i >= 0; i--) {
System.out.println("Poped element " + i + " is " + s.pop());
}
}
}

生成的错误代码是:

0Exception in thread "main" java.lang.NullPointerException at Stack.push(StackDemo.java:11) at StackDemo.main(StackDemo.java:46)

由于java中已经有Stack库,我是否必须将这些类放入包中?

最佳答案

问题出在这里:

char ch[] = new char[n];

您在构造函数中本地声明数组,因此该字段永远不会被分配。通过这样做修复它:

this.ch = new char[n];

关键字 this 当然是可选的,但它可以让您更清楚地了解您在做什么,并且使您的代码更具可读性。

<小时/>

通常,当您对 null 调用 . 时,会发生 NullPointerException。例如,此代码将抛出 NPE:

Object o = null;
o.toString();

您的代码抛出了 NullPointerException,因为您从未分配过 ch 变量。您的赋值语句正在本地范围中分配变量。

  • 本地作用域 - 仅适用于当前 { } block 的作用域,例如构造函数声明方法声明
  • 全局范围 - 适用于当前 { } block 之外的范围,例如字段分配。

因为 char ch[] = new char[n]; 是一个本地范围赋值,所以您的全局范围 私有(private) char ch[]; 从未被赋值,因此默认值为 null

关于java - 堆栈实现中的空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26509758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com