java.lang.StringIndexOutOfBoundsException和showInputDialog

时间:2011-12-04 22:58:42

标签: java string while-loop joptionpane

这是一个家庭作业问题。我正在研究一个使用JOptionPane来计算投票的程序,直到输入Q或q并且投票计数停止。然后它会启动showConfirmDialog,询问用户是否真的要退出。该程序的主要任务已经完成,但其中一条指令指出,在showInputDialog中,任何不是Y,y,N,n,Q或q的条目都将被忽略。

我遇到了麻烦,因为出于某种原因,任何时候点击对话框上的任何按钮,程序都会关闭。程序的其余部分工作正常,但是当我运行它时,它会给出编译错误通知,我最终遇到了这个问题。

这是我的代码。知道这里发生了什么吗?谢谢你的帮助。

编辑 - 只是你知道,System.out.println("HI");行就在那里,所以我可以确定问题是否与continue语句的整个if语句一致。

编辑#2 - 我在第一个程序(现在是VoteCount2)下面使用您的建议(至少我如何解释它)发布了我的代码编辑。

编辑#3 - 我重新格式化并尝试按照您的建议。如果我做错了什么我很抱歉,但我只是不知道该怎么做。

编辑#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);

    }
    }
}

3 个答案:

答案 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,因此voteStringnull。这意味着只需调用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))

获取输入的字符。您甚至可以使用不同类型的对话框(允许选择是/否/取消按钮),而不是输入文本。

如果您可以使用开关(投票)块在输入的文本之间进行选择。