问题描述
对于我的一个类,我被指派创建自己的 Stack 类,以及 push()、pop() 和 size() 方法。完整代码在这里:
public class Stack {
private int maxStackSize,topOfStack;
private int[] stack;
public Stack(int maxStackSize) {
if (maxStackSize <= 0)
System.out.println("Stack size should be a positive integer.");
else {
this.maxStackSize = maxStackSize;
topOfStack = -1;
stack = new int[maxStackSize];
}
}
public void push(int val) {
if(topOfStack == maxStackSize - 1)
System.out.println("Cannot push! Stack is full.");
else
stack[++topOfStack] = val;
}
public int pop() {
if (topOfStack == -1)
throw new Arrayindexoutofboundsexception("Cannot pop! Stack is empty.");
else
return stack[topOfStack--];
}
public int size() {
return (topOfStack+1);
}
}
除了 pop() 的问题外,这些方法都可以正常工作。我需要检查堆栈是否为空,即“if”语句,如果堆栈中没有任何内容,则显示错误消息“无法弹出!堆栈为空”。但是,我没有为 if-else 的“if”部分返回一个整数,所以我一直在尝试抛出异常,正如您所看到的那样。
public int pop() {
if (topOfStack == -1)
throw new Arrayindexoutofboundsexception("Cannot pop! Stack is empty.");
else
return stack[topOfStack--];
}
然而,我仍然收到异常消息,但现在它只是伴随着我自己的消息,“无法弹出!堆栈为空。”我得到的完整例外是这样的:
Exception in thread "main" java.lang.Arrayindexoutofboundsexception: Cannot pop! Stack is empty.
at Stack.pop(Stack.java:25)
at Main.main(Main.java:6)
如果可能,我希望不显示异常,只在遇到空堆栈时显示消息“无法弹出!堆栈为空”。有没有办法做到这一点?我只是错误地抛出异常吗?任何帮助表示赞赏。
解决方法
它显示错误消息是因为您正在抛出错误
throw new ArrayIndexOutOfBoundsException("Cannot pop! Stack is empty.");
如果您不想要错误,那么只需将消息打印到控制台即可。
,好消息:您没有“错误”地抛出异常。问题在于调用您的 pop()
方法的代码如何处理(或不处理)异常。该代码负责决定在 pop()
抛出异常时该怎么做,并且取决于该代码是什么,您可能对此事没有任何发言权。
例如,如果 pop()
被您的讲师提供的一些您无权访问的自动化测试或评估框架调用,您将被框架提供的任何异常处理行为所困扰。
但是,如果您编写(或至少可以访问其源代码)调用 pop()
的代码,您可以选择捕获异常并处理它随你怎么便。例如,如果您只想显示错误消息而不是完整的堆栈跟踪,您可以执行以下操作:
try {
pop();
} catch (ArrayIndexOutOfBoundsException ex) {
System.err.println(ex.getMessage());
}
当然,无论您在此处阅读什么内容,请确保您了解作业的要求并严格按照要求进行操作。
,调用pop方法的要求
- 即使栈为空也可以调用
- 不应抛出异常
- 方法签名可以更改
可选的方法
import java.util.Optional;
public class StackTest {
public static void main(String[] args) {
Stack<Integer,Optional<Integer>> stack = new MySafeIntegerStack(1);
System.out.println(stack.push(1));
System.out.println(stack.push(1));
System.out.println(stack.pop().get());
Optional<Integer> popped = stack.pop();
if (popped.isPresent()) {
System.out.println(popped.get());
} else {
System.out.println(popped);
}
}
interface Stack<U,V> {
boolean push(U value);
V pop();
}
static class MySafeIntegerStack implements Stack<Integer,Optional<Integer>> {
private int maxStackSize,topOfStack;
private int[] stack;
public MySafeIntegerStack(final int maxStackSize) {
if (maxStackSize <= 0) {
System.out.println("Stack size should be a positive integer.");
} else {
this.maxStackSize = maxStackSize;
topOfStack = -1;
stack = new int[maxStackSize];
}
}
public boolean push(final Integer val) {
if (topOfStack == maxStackSize - 1) {
System.out.println("Cannot push! Stack is full.");
return false;
}
stack[++topOfStack] = val;
return true;
}
public Optional<Integer> pop() {
if (topOfStack == -1) {
System.out.println("Cannot pop! Stack is empty.");
return Optional.empty();
} else {
return Optional.of(stack[topOfStack--]);
}
}
public int size() {
return (topOfStack + 1);
}
}
}
注意
- 假设堆栈必须使用数组(而不是列表)来实现,则无法进一步抽象泛型类型。 (泛型类型无法创建数组)
- 如果
pop()
和push()
调用无效,可以添加另一个实现以抛出异常