Java 测验程序中的索引越界
我正在制作一个测验程序,调用两个.txt文件(一次一个)来获取问题和答案。这两个文件有不同数量的问题和答案。它按顺序遍历它们,在您得到最后一个问题的答案并点击“获取问题”按钮后,它会给出一个索引越界错误。我试图找出在显示最后一个问题后禁用jbuttonQ的最佳方法。我想我在某个地方错过了一个for-loop或try-catch。问题和答案是独立的ArrayList 以下是执行的jbuttonQ操作代码:Java 测验程序中的索引越界,java,Java,我正在制作一个测验程序,调用两个.txt文件(一次一个)来获取问题和答案。这两个文件有不同数量的问题和答案。它按顺序遍历它们,在您得到最后一个问题的答案并点击“获取问题”按钮后,它会给出一个索引越界错误。我试图找出在显示最后一个问题后禁用jbuttonQ的最佳方法。我想我在某个地方错过了一个for-loop或try-catch。问题和答案是独立的ArrayList 以下是执行的jbuttonQ操作代码: statusMessageLabel.setText(""); jtxtA.setTex
statusMessageLabel.setText("");
jtxtA.setText("");
jtxtQ.setText(q.getQuestion());
jtxtCurrQ.setText(String.valueOf(q.getQNumber()));
jbtnA.setEnabled(true);
jbtnA.requestFocusInWindow();
jbtnQ.setEnabled(false);
statusMessageLabel.setText("");
jtxtA.setText(q.getAnswer());
jbtnQ.setEnabled(true);
jbtnQ.requestFocusInWindow();
jbtnA.setEnabled(false);
以下是jbuttonA操作执行的代码:
statusMessageLabel.setText("");
jtxtA.setText("");
jtxtQ.setText(q.getQuestion());
jtxtCurrQ.setText(String.valueOf(q.getQNumber()));
jbtnA.setEnabled(true);
jbtnA.requestFocusInWindow();
jbtnQ.setEnabled(false);
statusMessageLabel.setText("");
jtxtA.setText(q.getAnswer());
jbtnQ.setEnabled(true);
jbtnQ.requestFocusInWindow();
jbtnA.setEnabled(false);
以下是jbtnMenu代码:
statusMessageLabel.setText("");
jtxtQ.setText("");
jtxtA.setText("");
jtxtCurrQ.setText("");
jtxtTotQ.setText("");
JFileChooser f = new JFileChooser(".");
String path = "";
f.setDialogTitle("Select quiz file.");
FileNameExtensionFilter filter = new FileNameExtensionFilter("Text file (*.txt)","txt");
f.setFileFilter(filter);
JDialog dg = new JDialog();
int rval = f.showOpenDialog(dg);
if(rval == JFileChooser.CANCEL_OPTION){
statusMessageLabel.setText("Open canceled.");
jtxtFile.setText("");
}else{
path = f.getSelectedFile().getAbsolutePath();
jtxtFile.setText(path);
q = new Quiz(path); //instantiation call
if(q.getErrorMsg().isEmpty()){
statusMessageLabel.setText(q.getActionMsg());
jtxtTotQ.setText(String.valueOf(q.getQCount()));
jbtnQ.setEnabled(true);
jbtnQ.requestFocusInWindow();
}else{
statusMessageLabel.setText(q.getErrorMsg());
}
}
}
下面是quick.java类:
public class Quiz {
private String filename;
private String errmsg, actmsg;
private ArrayList<String> questions;
private ArrayList<String> answers;
private int qCount, qNumber;
private boolean quizover;
public Quiz(String path){
this.errmsg = "";
this.actmsg = "";
questions = new ArrayList<>();
answers = new ArrayList<>();
try{
BufferedReader in = new BufferedReader(new FileReader(path));
String s = in.readLine();
while (s != null){
questions.add(s);
answers.add(in.readLine());
qCount++;
s = in.readLine();
}
in.close();
}catch(IOException e){
this.errmsg = "Unable to open file " + path;
}
if (qCount > 0){
this.actmsg = "Quiz file has " + qCount + " questions.";
qNumber = 1;
quizover = false;
}else if(qCount <= 0){
this.actmsg = "No questions in file: " + path;
qNumber = 0;
quizover = true;
}
}//end of constructor
public String getErrorMsg(){
return this.errmsg;
}
public String getActionMsg(){
return this.actmsg;
}
public int getQCount(){
return this.qCount;
}
public int getQNumber(){
return this.qNumber;
}
public String getQuestion(){
if(this.qCount == 0){
this.errmsg = "Question requested from empty quiz.";
return this.errmsg;
}
return this.questions.get(this.qNumber - 1);
}
public String getAnswer(){
if(this.qCount == 0){
this.errmsg = "Answer requested from empty quiz.";
return this.errmsg;
}
String a = this.answers.get(this.qNumber - 1);
qNumber ++;
return a;
}
公开课测验{
私有字符串文件名;
私有字符串errmsg,actmsg;
私人问题;
私人ArrayList回答;
专用整数qCount,qNumber;
私有布尔奎佐弗;
公共问答(字符串路径){
this.errmsg=“”;
this.actmsg=“”;
问题=新的ArrayList();
answers=newarraylist();
试一试{
BufferedReader in=新的BufferedReader(新文件读取器(路径));
字符串s=in.readLine();
while(s!=null){
问题.添加(s);
add(in.readLine());
qCount++;
s=in.readLine();
}
in.close();
}捕获(IOE异常){
this.errmsg=“无法打开文件”+路径;
}
如果(qCount>0){
this.actmsg=“测验文件有“+qCount+”个问题。”;
qNumber=1;
quizover=假;
}否则,如果(qCount我知道您没有共享完整的代码;因此,我在这一点上对您的代码的理解是有限的
但是,最大的问题是,您正在用this.qCount检查“最后一个问题”,但您的get是this.qNumber;您还需要减少qNumber。请尝试以下方法:
public String getQuestion(){
if (this.qNumber > 0) {
return this.questions.get(this.qNumber - 1);
}
else {
this.errmsg = "Question requested from empty quiz.";
return this.errmsg;
}
}
public String getAnswer(){
if (this.qNumber > 0) {
String a = this.answers.get(this.qNumber - 1);
qNumber--;
return a;
}
else {
this.errmsg = "Answer requested from empty quiz.";
return this.errmsg;
}
}
我明白了,我更改了jbtnA代码:
statusMessageLabel.setText("");
if(String.valueOf(q.getQNumber()).equals(String.valueOf(q.getQCount()))){
statusMessageLabel.setText("End of questions in file.");
jbtnQ.setEnabled(false);
}else{
jtxtA.setText(q.getAnswer());
jbtnQ.setEnabled(true);
jbtnQ.requestFocusInWindow();
jbtnA.setEnabled(false);
}
“这两个文件有不同数量的问题和答案”这是否意味着问答文件的条目数不同,或者只要两个文件的条目数相等,这些文件就可以包含任意数量的条目?…哪一行获得IndexOutOfBoundsException?这两个文件的条目数不同。它说的不是哪一行线程AWT-EventQueue-0中的异常索引超出边界异常:索引6,大小6