java.lang.StringIndexOutOfBoundsException: 索引 x ,长度 0 没有循环
java.lang.StringIndexOutOfBoundsException: index x , length 0 without a loop
我目前正在添加功能并完成我的编程老师制作的 Hang-Man 游戏。
以下错误消息:线程“AWT-EventQueue-0”中出现异常 java.lang.StringIndexOutOfBoundsException:索引 0,长度 0,字符串生成器中的每个索引的索引都在变化。每次我输入一个在游戏中猜对的字母都会出现。
我已经尝试了一段时间来修复它,但我还没有能够。
package hangManSo;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Arrays;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class HangManSO extends JPanel implements ActionListener, MouseListener {
private int error;
JButton button;
JTextField field;
JFrame frame;
JLabel rättord;
HangManSO(JButton button, JTextField field, JFrame frame, JLabel rättord) {
this.button = button;
this.field = field;
this.frame = frame;
this.rättord = rättord;
this.addMouseListener(this);
}
static String [] ord = {"rome"};
static Random r = new Random();
static int randomNumber=r.nextInt(ord.length);
static String d = ord[randomNumber];
StringBuilder builder = new StringBuilder(d.length());
StringBuilder builderDisplay = new StringBuilder();
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
String guessedletter = field.getText();
if (source.equals(button)) {
if (!d.contains(guessedletter)) {
error++;
frame.repaint();
}
if (d.contains(guessedletter)) {
char [] randomWord = d.toCharArray();
char CharGuessedLetter = guessedletter.charAt(0);
//gets the index of the guessed letter in the randomword
builder.append(randomWord);
int index = builder.indexOf(String.valueOf(CharGuessedLetter));
//is supposed to set the correctly guessed letter in the correct index
builderDisplay.setCharAt(index, CharGuessedLetter);
rättord.setText(builderDisplay.toString());
}
field.setText("");
}
}
public void paintComponent(Graphics g ) {
super.paintComponent(g);
if (error == 1)
g.drawLine(10, 270, 500, 270);
if (error == 2) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
}
if (error == 3) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
}
if (error == 4) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
g.drawLine(200, 30, 350, 30);
g.drawLine(250, 30, 200, 75);
}
if (error == 5) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
g.drawLine(200, 30, 350, 30);
g.drawLine(250, 30, 200, 75);
g.drawLine(350, 30, 350,100);
}
if (error == 6) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
g.drawLine(200, 30, 350, 30);
g.drawLine(250, 30, 200, 75);
g.drawLine(350, 30, 350,100);
g.drawOval(330, 100, 40, 40);
}
if (error == 7) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
g.drawLine(200, 30, 350, 30);
g.drawLine(250, 30, 200, 75);
g.drawLine(350, 30, 350,100);
g.drawOval(330, 100, 40, 40);
g.drawLine(350, 140, 350,200);
}
if (error == 8) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
g.drawLine(200, 30, 350, 30);
g.drawLine(250, 30, 200, 75);
g.drawLine(350, 30, 350,100);
g.drawOval(330, 100, 40, 40);
g.drawLine(350, 140, 350,200);
g.drawLine(350, 200,390, 240);
}
if (error == 9) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
g.drawLine(200, 30, 350, 30);
g.drawLine(250, 30, 200, 75);
g.drawLine(350, 30, 350,100);
g.drawOval(330, 100, 40, 40);
g.drawLine(350, 140, 350,200);
g.drawLine(350, 200,390, 240);
g.drawLine(350, 200, 310, 240);
}
if (error == 9) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
g.drawLine(200, 30, 350, 30);
g.drawLine(250, 30, 200, 75);
g.drawLine(350, 30, 350,100);
g.drawOval(330, 100, 40, 40);
g.drawLine(350, 140, 350,200);
g.drawLine(350, 200,390, 240);
g.drawLine(350, 200, 310, 240);
}
if (error == 10) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
g.drawLine(200, 30, 350, 30);
g.drawLine(250, 30, 200, 75);
g.drawLine(350, 30, 350,100);
g.drawOval(330, 100, 40, 40);
g.drawLine(350, 140, 350,200);
g.drawLine(350, 200,390, 240);
g.drawLine(350, 200, 310, 240);
g.drawLine(350, 170, 400, 150);
}
if (error == 11) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
g.drawLine(200, 30, 350, 30);
g.drawLine(250, 30, 200, 75);
g.drawLine(350, 30, 350,100);
g.drawOval(330, 100, 40, 40);
g.drawLine(350, 140, 350,200);
g.drawLine(350, 200,390, 240);
g.drawLine(350, 200, 310, 240);
g.drawLine(350, 170, 400, 150);
g.drawLine(350, 170, 300, 150);
}
if(error > 11) {
g.setFont(new Font("Calibri", Font.BOLD, 26));
g.drawString("GAME OVER", 225, 150);
}
}
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("HangMan");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel rubrikOrd = new JLabel("rätt gissade ord");
rubrikOrd.setOpaque(false);
rubrikOrd.setBackground(Color.GREEN);
rubrikOrd.setBounds(10, 10, 100, 20);
JLabel rättord = new JLabel();
rättord.setOpaque(true);
rättord.setBackground(Color.GREEN);
rättord.setBounds(10, 35, 100, 20);
JTextField field = new JTextField();
field.setVisible(true);
JButton b = new JButton("ok");
b.setBounds(370, 300, 100, 30);
frame.add(b);
field.setSize(300, 30);
field.setLocation(60, 300);
field.setVisible(true);
frame.add(field);
frame.add(rättord);
frame.add(rubrikOrd);
frame.setBackground(Color.white);
frame.setSize(600, 400);
HangManSO object = new HangManSO(b, field, frame, rättord);
b.addActionListener(object);
field.addActionListener(object);
frame.add(object);
frame.setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println(e.getX() + " " + e.getY());
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
}
代码不必要地复杂,这让您很难看到问题所在。
您的实际问题从这一行开始,您将整个正确的单词 d
分配给 randomWord
:
char [] randomWord = d.toCharArray();
//randomWord now equals `{r,o,m,e}`
然后您使用整个正确的单词并将其附加到您的 builder
字符串中:
//builder equals a blank string of 4 characters " "
builder.append(randomWord);
//builder now equals a string with 4 blank characters followed by some " rome"
System.out.print(builder.toString());
所以现在当你尝试获取你的字母的索引时,例如如果你猜 'm' 它将 return 一个大索引:
//the builder string now " rome"
int index = builder.indexOf(String.valueOf(CharGuessedLetter));
//So `m` will be found at the 6th index of " rome"
System.out.print("index = " + index);
因此,当您使用索引为 6
的下一行时,它将越界,因为 builderDisplay
字符串对于单词 rome
只有 4 个字符长:
builderDisplay.setCharAt(index, CharGuessedLetter);
那么你能做些什么来解决这个问题呢?我不会给你一个确切的答案,但你应该首先考虑上面的代码,它哪里出了问题(append
),以及如何 return 正确的字符索引(使用d
字符串)
最后的提示,下一行将得到一个字符的正确字符索引,注意我们如何使用 d
字符串,而不是 builder
字符串:
int index = d.indexOf(String.valueOf(CharGuessedLetter));
编辑:
根据评论跟进。您还需要用空格填充字符串生成器以避免此问题:
//Create the hangman object
HangManSO object = new HangManSO(b, field, frame, rättord);
//Now populate the string builder with empty characters "_" or you could use a space " "
for (int i = 0; i < object.d.length(); i++) {
object.builderDisplay.append('_');
}
另请注意,您应该检查单词中的重复字符:
//check against every letter of the word to make sure that it gets duplicate characters
for (int i = 0; i < d.length(); i++) {
if (d.charAt(i) == charGuessedLetter){
builderDisplay.setCharAt(i, charGuessedLetter);
System.out.println("Match found");
}
}
rättord.setText(builderDisplay.toString());
我目前正在添加功能并完成我的编程老师制作的 Hang-Man 游戏。
以下错误消息:线程“AWT-EventQueue-0”中出现异常 java.lang.StringIndexOutOfBoundsException:索引 0,长度 0,字符串生成器中的每个索引的索引都在变化。每次我输入一个在游戏中猜对的字母都会出现。
我已经尝试了一段时间来修复它,但我还没有能够。
package hangManSo;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Arrays;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class HangManSO extends JPanel implements ActionListener, MouseListener {
private int error;
JButton button;
JTextField field;
JFrame frame;
JLabel rättord;
HangManSO(JButton button, JTextField field, JFrame frame, JLabel rättord) {
this.button = button;
this.field = field;
this.frame = frame;
this.rättord = rättord;
this.addMouseListener(this);
}
static String [] ord = {"rome"};
static Random r = new Random();
static int randomNumber=r.nextInt(ord.length);
static String d = ord[randomNumber];
StringBuilder builder = new StringBuilder(d.length());
StringBuilder builderDisplay = new StringBuilder();
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
String guessedletter = field.getText();
if (source.equals(button)) {
if (!d.contains(guessedletter)) {
error++;
frame.repaint();
}
if (d.contains(guessedletter)) {
char [] randomWord = d.toCharArray();
char CharGuessedLetter = guessedletter.charAt(0);
//gets the index of the guessed letter in the randomword
builder.append(randomWord);
int index = builder.indexOf(String.valueOf(CharGuessedLetter));
//is supposed to set the correctly guessed letter in the correct index
builderDisplay.setCharAt(index, CharGuessedLetter);
rättord.setText(builderDisplay.toString());
}
field.setText("");
}
}
public void paintComponent(Graphics g ) {
super.paintComponent(g);
if (error == 1)
g.drawLine(10, 270, 500, 270);
if (error == 2) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
}
if (error == 3) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
}
if (error == 4) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
g.drawLine(200, 30, 350, 30);
g.drawLine(250, 30, 200, 75);
}
if (error == 5) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
g.drawLine(200, 30, 350, 30);
g.drawLine(250, 30, 200, 75);
g.drawLine(350, 30, 350,100);
}
if (error == 6) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
g.drawLine(200, 30, 350, 30);
g.drawLine(250, 30, 200, 75);
g.drawLine(350, 30, 350,100);
g.drawOval(330, 100, 40, 40);
}
if (error == 7) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
g.drawLine(200, 30, 350, 30);
g.drawLine(250, 30, 200, 75);
g.drawLine(350, 30, 350,100);
g.drawOval(330, 100, 40, 40);
g.drawLine(350, 140, 350,200);
}
if (error == 8) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
g.drawLine(200, 30, 350, 30);
g.drawLine(250, 30, 200, 75);
g.drawLine(350, 30, 350,100);
g.drawOval(330, 100, 40, 40);
g.drawLine(350, 140, 350,200);
g.drawLine(350, 200,390, 240);
}
if (error == 9) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
g.drawLine(200, 30, 350, 30);
g.drawLine(250, 30, 200, 75);
g.drawLine(350, 30, 350,100);
g.drawOval(330, 100, 40, 40);
g.drawLine(350, 140, 350,200);
g.drawLine(350, 200,390, 240);
g.drawLine(350, 200, 310, 240);
}
if (error == 9) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
g.drawLine(200, 30, 350, 30);
g.drawLine(250, 30, 200, 75);
g.drawLine(350, 30, 350,100);
g.drawOval(330, 100, 40, 40);
g.drawLine(350, 140, 350,200);
g.drawLine(350, 200,390, 240);
g.drawLine(350, 200, 310, 240);
}
if (error == 10) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
g.drawLine(200, 30, 350, 30);
g.drawLine(250, 30, 200, 75);
g.drawLine(350, 30, 350,100);
g.drawOval(330, 100, 40, 40);
g.drawLine(350, 140, 350,200);
g.drawLine(350, 200,390, 240);
g.drawLine(350, 200, 310, 240);
g.drawLine(350, 170, 400, 150);
}
if (error == 11) {
g.drawLine(10, 270, 500, 270);
g.drawLine(200, 30, 200, 270);
g.drawLine(200, 30, 350, 30);
g.drawLine(200, 30, 350, 30);
g.drawLine(250, 30, 200, 75);
g.drawLine(350, 30, 350,100);
g.drawOval(330, 100, 40, 40);
g.drawLine(350, 140, 350,200);
g.drawLine(350, 200,390, 240);
g.drawLine(350, 200, 310, 240);
g.drawLine(350, 170, 400, 150);
g.drawLine(350, 170, 300, 150);
}
if(error > 11) {
g.setFont(new Font("Calibri", Font.BOLD, 26));
g.drawString("GAME OVER", 225, 150);
}
}
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("HangMan");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel rubrikOrd = new JLabel("rätt gissade ord");
rubrikOrd.setOpaque(false);
rubrikOrd.setBackground(Color.GREEN);
rubrikOrd.setBounds(10, 10, 100, 20);
JLabel rättord = new JLabel();
rättord.setOpaque(true);
rättord.setBackground(Color.GREEN);
rättord.setBounds(10, 35, 100, 20);
JTextField field = new JTextField();
field.setVisible(true);
JButton b = new JButton("ok");
b.setBounds(370, 300, 100, 30);
frame.add(b);
field.setSize(300, 30);
field.setLocation(60, 300);
field.setVisible(true);
frame.add(field);
frame.add(rättord);
frame.add(rubrikOrd);
frame.setBackground(Color.white);
frame.setSize(600, 400);
HangManSO object = new HangManSO(b, field, frame, rättord);
b.addActionListener(object);
field.addActionListener(object);
frame.add(object);
frame.setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println(e.getX() + " " + e.getY());
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
}
代码不必要地复杂,这让您很难看到问题所在。
您的实际问题从这一行开始,您将整个正确的单词 d
分配给 randomWord
:
char [] randomWord = d.toCharArray();
//randomWord now equals `{r,o,m,e}`
然后您使用整个正确的单词并将其附加到您的 builder
字符串中:
//builder equals a blank string of 4 characters " "
builder.append(randomWord);
//builder now equals a string with 4 blank characters followed by some " rome"
System.out.print(builder.toString());
所以现在当你尝试获取你的字母的索引时,例如如果你猜 'm' 它将 return 一个大索引:
//the builder string now " rome"
int index = builder.indexOf(String.valueOf(CharGuessedLetter));
//So `m` will be found at the 6th index of " rome"
System.out.print("index = " + index);
因此,当您使用索引为 6
的下一行时,它将越界,因为 builderDisplay
字符串对于单词 rome
只有 4 个字符长:
builderDisplay.setCharAt(index, CharGuessedLetter);
那么你能做些什么来解决这个问题呢?我不会给你一个确切的答案,但你应该首先考虑上面的代码,它哪里出了问题(append
),以及如何 return 正确的字符索引(使用d
字符串)
最后的提示,下一行将得到一个字符的正确字符索引,注意我们如何使用 d
字符串,而不是 builder
字符串:
int index = d.indexOf(String.valueOf(CharGuessedLetter));
编辑:
根据评论跟进。您还需要用空格填充字符串生成器以避免此问题:
//Create the hangman object
HangManSO object = new HangManSO(b, field, frame, rättord);
//Now populate the string builder with empty characters "_" or you could use a space " "
for (int i = 0; i < object.d.length(); i++) {
object.builderDisplay.append('_');
}
另请注意,您应该检查单词中的重复字符:
//check against every letter of the word to make sure that it gets duplicate characters
for (int i = 0; i < d.length(); i++) {
if (d.charAt(i) == charGuessedLetter){
builderDisplay.setCharAt(i, charGuessedLetter);
System.out.println("Match found");
}
}
rättord.setText(builderDisplay.toString());