这是一个家庭作业问题。我正在研究一个使用JOptionPane
来计算投票的程序,直到输入Q或q并且投票计数停止。然后它会启动showConfirmDialog
,询问用户是否真的要退出。该程序的主要任务已经完成,但其中一条指令指出,在showInputDialog中,任何不是Y,y,N,n,Q或q的条目都将被忽略。
我遇到了麻烦,因为出于某种原因,任何时候点击对话框上的任何按钮,程序都会关闭。程序的其余部分工作正常,但是当我运行它时,它会给出编译错误通知,我最终遇到了这个问题。
这是我的代码。知道这里发生了什么吗?谢谢你的帮助。
编辑 - 只是你知道,System.out.println("HI");
行就在那里,所以我可以确定问题是否与continue语句的整个if语句一致。
编辑#2 - 我在第一个程序(现在是VoteCount2
)下面使用您的建议(至少我如何解释它)发布了我的代码编辑。
编辑#4 - 以下是我如何运作..
Do { String voteString = "";
voteString = JOptionPane.showInputDialog(null, "Enter 'Y' to vote yes, 'N' to vote no, or 'Q' to quit voting", "Vote Now!", JOptionPane.OK_CANCEL_OPTION);
if (voteString == null || voteString.length() == 0) continue;
else if(voteString.toLowerCase().equals("y"))
yesVotes++;
else if (voteString.toLowerCase().equals("n"))
noVotes++;
剩下的旧程序
package javaapplication16;
import javax.swing.JOptionPane;
public class VoteCount {
public static void main(String[] args) {
int yesVotes = 0, noVotes = 0, totalVotes = 0;
totalVotes = yesVotes + noVotes;
char vote;
int reply = 1;
int option = 0;
{
do {
String voteString = JOptionPane.showInputDialog(null, "Enter 'Y' to vote yes, 'N' to vote no, or 'Q' to quit voting", "Vote Now!", JOptionPane.OK_CANCEL_OPTION);
vote = voteString.charAt(0);
if (vote == 'Y' || vote == 'y')
yesVotes++;
if (vote == 'N' || vote == 'n')
noVotes++;
if (option == JOptionPane.OK_OPTION)
System.out.println("HI");
if (option == JOptionPane.CANCEL_OPTION)
continue;
if (option == JOptionPane.CLOSED_OPTION)
continue;
{
}
if (vote == 'Q' || vote == 'q')
{
reply = JOptionPane.showConfirmDialog(null, "Quit?", "Warning!", JOptionPane.YES_NO_OPTION);
if (reply == JOptionPane.YES_OPTION)
JOptionPane.showMessageDialog(null, "yes " + yesVotes + " no " + noVotes + " total " + totalVotes);
else if (reply != JOptionPane.YES_OPTION);
continue;
}
} while (reply != JOptionPane.YES_OPTION);
}
}
}
package javaapplication16;
import javax.swing.JOptionPane;
public class VoteCount {
public static void main(String[] args) {
int yesVotes = 0, noVotes = 0, totalVotes = 0;
totalVotes = yesVotes + noVotes;
char vote;
int reply = 1;
{
do {
String voteString = JOptionPane.showInputDialog(null, "Enter 'Y' to vote yes, 'N' to vote no, or 'Q' to quit voting", "Vote Now!", JOptionPane.OK_CANCEL_OPTION);
vote = voteString.charAt(0);
if (voteString == null || voteString.length() == 0)
vote = 'q';
if (voteString.toLowerCase().equals("y"))
yesVotes++;
if (voteString.toLowerCase().equals("n"))
noVotes++;
{
}
if (voteString.toLowerCase().equals("q"))
{
reply = JOptionPane.showConfirmDialog(null, "Quit?", "Warning!", JOptionPane.YES_NO_OPTION);
if (reply == JOptionPane.YES_OPTION)
JOptionPane.showMessageDialog(null, "yes " + yesVotes + " no " + noVotes + " total " + totalVotes);
else if (reply != JOptionPane.YES_OPTION);
continue;
}
} while (reply != JOptionPane.YES_OPTION);
}
}
}
答案 0 :(得分:0)
您尝试从字符串中获取字符,无论字符串中是否有任何内容(例如单击按钮时)。一种选择是首先检查按钮按压。
另一种方法是检查字符串,小写,对"y"
或"n"
,例如:
if (voteString.toLowerCase().equals("y")) {
// etc.
当用户取消对话框时,您仍需要处理null
返回值。如果他们选择“确定”,则不会是null
,但将为空,从而导致越界异常。
答案 1 :(得分:0)
我在这里看到的唯一问题是,如果按“取消”,则会出现NullPointerException
,因为在这种情况下对话框将返回null
作为输入,但是您尝试获取第一个无论如何。否则它应该(并且 - 我编译并运行它)工作得很好。
看看这两行:
String voteString = JOptionPane.showInputDialog(null, "Enter 'Y' to vote yes, 'N' to vote no, or 'Q' to quit voting", "Vote Now!", JOptionPane.OK_CANCEL_OPTION);
vote = voteString.charAt(0);
有两个可能的问题。首先,假设用户按下“取消”。在这种情况下,showInputDialog()
会返回null
,因此voteString
为null
。这意味着只需调用voteString.charAt(0)
即可抛出NullPointerException
。您必须先检查null
- 即。,
String voteString = JOptionPane.showInputDialog(null, "Enter 'Y' to vote yes, 'N' to vote no, or 'Q' to quit voting", "Vote Now!", JOptionPane.OK_CANCEL_OPTION);
if (voteString == null) {
// User has cancelled; let's quit
System.exit(0);
}
第二个问题是如果你在没有输入任何内容的情况下按“确定”会发生什么。在这种情况下,voteString
长度为零个字符,并且调用charAt(0)
将抛出IndexOutOfBoundsException
,因为索引0处没有字符。再次,您需要检查这一点。添加到上一个示例:
String voteString = JOptionPane.showInputDialog(null, "Enter 'Y' to vote yes, 'N' to vote no, or 'Q' to quit voting", "Vote Now!", JOptionPane.OK_CANCEL_OPTION);
if (voteString == null) {
// User has cancelled; let's quit
System.exit(0);
} else if (voteString.length() == 0) {
// This will just skip to the next go-round of the do/while loop, and prompt again
continue;
}
答案 2 :(得分:0)
一些事情:
正如其他人所说,你没有正确处理没有输入文字的情况。具体来说,如果单击“确定”,则voteString将是该字段中的任何内容(即空字符串)。如果单击“取消”,则voteString将为null。
如果检测到以下任何一种情况,可以通过将voteString设置为默认值来解决此问题:
if (voteString == null || voteString .equals("")) voteString = "q";
其他一些事情:你永远不会更新totalVotes。
您可以使用
vote = Character.toLowerCase(voteString.charAt(0))
获取输入的字符。您甚至可以使用不同类型的对话框(允许选择是/否/取消按钮),而不是输入文本。
如果您可以使用开关(投票)块在输入的文本之间进行选择。