2016-12-15 24 views
-1

我正在製作一個測驗程序,它可以調用兩個.txt文件(一次一個)來獲得問題和答案。這兩個文件有不同數量的問題和答案。它按順序遍歷它們,當你得到最後一個問題的答案後,點擊get question按鈕,它會給出一個索引超出界限的錯誤。我試圖找出在顯示最後一個問題後禁用jbuttonQ的最佳方法。我想我錯過了一個for循環或嘗試捕獲某處。這些問題和答案是分開的ArrayList指數超出了測驗程序的界限

這裏的jbuttonQ行動執行代碼:

statusMessageLabel.setText(""); 
jtxtA.setText(""); 
jtxtQ.setText(q.getQuestion()); 
jtxtCurrQ.setText(String.valueOf(q.getQNumber())); 
jbtnA.setEnabled(true); 
jbtnA.requestFocusInWindow(); 
jbtnQ.setEnabled(false); 

這裏的jbuttonA行動執行代碼:

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()); 
     } 
    } 
}          

這裏是Quiz.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; 
} 

}

任何幫助,將不勝感激。謝謝。

+0

「這兩個文件有問題和答案不同數量的」這是否意味着問題和答案文件有不同數量的條目,或者文件可以包含任何數字,只要這兩個文件具有相同的數字? – NRitH

+0

...以及哪條線獲取IndexOutOfBoundsException? –

+0

這兩個文件具有不同數量的條目。它沒有說明哪一行,它說「線程中的異常AWT-EventQueue-0索引超出範圍異常:索引6,大小6 – Josh

回答

0

我瞭解您尚未分享您的完整代碼;所以,我現在對代碼的理解是有限的。

但是,最大的問題是,你正在使用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; 
    } 
} 
+0

我編輯了我的問題與其餘的代碼。 – Josh

0

我想通了,我改變了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); 
    }