Java 中的 pop() 方法抛出异常
Throwing exceptions for a pop() method in Java
对于我的 class 之一,我被分配创建自己的 Stack class,以及方法 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”语句,如果堆栈中没有任何内容,则显示错误信息“Cannot pop! Stack is empty”。但是,对于 if-else 的“if”部分,我没有 return 的整数,所以我一直在尝试抛出异常,正如您在我的尝试中看到的那样。
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()
调用时抛出异常
对于我的 class 之一,我被分配创建自己的 Stack class,以及方法 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”语句,如果堆栈中没有任何内容,则显示错误信息“Cannot pop! Stack is empty”。但是,对于 if-else 的“if”部分,我没有 return 的整数,所以我一直在尝试抛出异常,正如您在我的尝试中看到的那样。
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()
调用时抛出异常