我有一个专门用于将堆栈基础知识实现到Web浏览器URL的类。
预期的行为如下 如果用户在地址栏中键入URL,则清除前向堆栈。 如果用户单击后退按钮,则当前URL(在地址栏中)将被推送到前向堆栈。弹出后堆栈,弹出的URL放在地址栏中。如果后栈是空的,则没有任何反应。 如果用户单击前进按钮,则当前URL(在地址栏中)被推送到后台堆栈。弹出前向堆栈,弹出的URL放在地址栏中 如果后向堆栈为空,则不会发生任何事情。
基本上,我遇到了处理后台堆栈的问题。每次调用后堆栈块时,当前url都被推入前向堆栈。虽然这种行为对于后排堆栈的一次推送是正确的,但是当后堆栈不再向后移动时是无意的(例如:Google.com [后台堆栈调用] Google.com,将Google.com推向前向堆栈两次)
我很难想到不允许这种情况发生的逻辑。显然不正确的行为是必须多次推进前向堆栈以仅向上移动一个网页。
在保持我的代码核心完整的同时提出任何建议吗?
public class BrowserStack {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
// the current URL
String url = null;
Stack<String> forward = new Stack<String>();
Stack<String> back = new Stack<String>();
String input;
System.out.println("Type a combination of URLs, or the > or < symbol.\nType 'q' to quit.");
while (true) {
input = s.next();
if (input.equals("q")) {
System.out.println("Bye");
return;
}
if (input.equals("<")) {
try {
forward.push(url); //unintended behavior happens here
url = back.pop();
} catch (EmptyStackException e) {
}
}
else if (input.equals(">")) {
try {
back.push(url);
url = forward.pop();
} catch (EmptyStackException e) {
}
}
else {
if (url != null)
back.push(url);
url = input;
forward.clear();
}
System.out.println("Current webpage [" + url + "]");
}
}
}
答案 0 :(得分:1)
交换你的推/弹顺序,以便在推入堆栈之前退出try / catch:
if (input.equals("<")) {
try {
String temp = url;
url = back.pop();
forward.push(temp); // this only executes if the last line completed unexceptionally
} catch (EmptyStackException e) {
}
}
但是更好的是不要引起异常,而是在弹出之前检查:
if (input.equals("<")) {
if (!back.isEmpty());
forward.push(url);
url = back.pop();
}
}