我正在尝试使用此方法读取文件:
public static char [] llegir() {
Palabra nova = new Palabra();
botarBlancs();
while ((lletra != fiSequencia) && // No ha acabat la seqüència
(lletra != blanc)) { // Hi ha prou espai
nova.lletres[nova.llargaria++] = lletra;
lletra = leerCarTeclado();
}
//System.out.println(nova.girar());
return nova.lletres;
}
(botarBlancs()只是跳空格来区分一个词)
这是我正在使用的代码:
public static void generador_de_cartas() throws Exception{
Palabra pl = new Palabra();
FileReader fr = new FileReader("datos_clientes.txt");
BufferedReader br = new BufferedReader(fr);
String line = br.readLine();
char [] linea;
while (line != null) {
linea=line.toCharArray();
linea=Palabra.llegir();
System.out.println(linea);
line=br.readLine();
}
br.close();
fr.close();
}
它在线程“main”中给出了一个异常java.lang.ArrayIndexOutOfBoundsException:20在方法llegir()中,它表示:nova.lletres [nova.llargaria ++] = lletra;
我该如何解决这个问题?
有关如何使用该方法读取文件行的任何想法吗?
提前谢谢
*********************** EDIT ***********************
这是我尝试过的:
public static void generador_de_cartas() throws Exception {
Palabra pl = new Palabra();
char[] tipo1 = {'t', '1'}, tipo2 = {'t', '2'}, tipo3 = {'t', '3'}, nRef = {'#', 'n'}, dRef = {'#', 'd'};
FileReader fr = new FileReader("datos_clientes.txt");
BufferedReader br = new BufferedReader(fr);
String line = br.readLine();
char[] linea;
while (line != null) {
linea = line.toCharArray();
Palabra.llegir(); //reads line
if (Palabra.llegir() == tipo1) {
//code that creates a new file following the pattern of tipo 1 files
} else {
if (Palabra.llegir() == tipo2) {
//code that creates a new file following the pattern of tipo 2 files
} else {
if (Palabra.llegir() == tipo2) {
//code that creates a new file following the pattern of tipo 3 files
}
}
line = br.readLine();
}
line = br.readLine(); //reads following line
}
br.close();
fr.close();
}
但它一直报告同样的例外情况。
该程序的主要思想是为主文件(datos_clientes.txt)的不同行中表示的每个人创建一个文本文件,文件具有不同的文本或模式,具体取决于人。
主文件的一行如下所示:
t1 #n name #d address(t1是将要创建的文件的模式)
之后我必须阅读该人的姓名,保存,阅读地址,保存并将其写入为他们创建的文件中。
这是我到目前为止所做的,只是创建不同文件的方法。
希望你能帮助我
谢谢!
这是Palabra类:
public class Palabra {
public static final char blank = ' ';
public static final char endSequence = '\n';
// Constants privades
// Llargària màxima d'una paraula
private static final int MAXIM = 20;
// ATRIBUTS
private char[] letters;
private int length;
// atribut de classe, per simplificar les operacions de lectura
private static char letter = ' ';
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++EXTRA
private static char[] frase = null;
private static int indice;
// INTERFICIE
// Constructor
public Palabra() {
letters = new char[MAXIM];
length = 0;
}
public static char[] llegir() {
Palabra nova = new Palabra();
botarBlancs();
while ((letter != endSequence) && // No ha acabat la seqüència
(letter != blank)) { // Hi ha prou espai
if (nova.length < nova.letters.length) {
nova.letters[nova.length++] = letter;
letter = leerCarTeclado();
}
}
return nova.letters;
}
public boolean esIgualA(Palabra b) {
boolean iguals = length == b.length;
for (int idx = 0; (idx < length) && iguals; idx++) {
iguals = letters[idx] == b.letters[idx];
}
return iguals;
}
public static boolean iguals(Palabra a, Palabra b) {
// using previous esIgualA
return a.esIgualA(b);
}
public static void botarBlancs() {
while (letter == blank) {
letter = leerCarTeclado();
}
}
static public char leerCarTeclado() {
char res = '.';
if (frase != null) {
res = frase[indice++];
}
return res;
}
}
我把一些改为非静态,至少我可以运行它,现在我想知道我是否正确读取了这条线。如果我对方法llegir()没有错,我可以读一个单词并保存它,对吗?如我错了请纠正我。我正在尝试读取行中的第一个“单词”,例如“t1”,然后我将它与另一个char数组进行比较,我尝试打印以检查代码是否有效,但事实并非如此。我做错了什么?
while (line != null) {
linea = line.toCharArray();
char [] tipo=Palabra.llegir(); //reads first word
if (tipo == tipo1) {
System.out.print("tipo1") ;//code that creates a new file following the pattern of tipo 1 files
} else {
if (tipo == tipo2) {
System.out.print("tipo2") ;//code that creates a new file following the pattern of tipo 2 files
} else {
if (tipo == tipo2) {
System.out.print("tipo3") ; //code that creates a new file following the pattern of tipo 3 files
}
}
}
line = br.readLine(); //reads following line
}
答案 0 :(得分:2)
每次调用方法时都应该从数组的开头开始,即0,你应该确保你没有尝试访问一个不存在的索引,即必须为真nova.llargaria < nova.lletres.length
注意:您正在阅读一行,但您似乎忽略了它。这是为了吗?
答案 1 :(得分:0)
你没有给我们足够的信息......但是:
在调试器中打开它(Intellij IDEA有一个很棒的例子)。如果通过单击左边距并右键单击它来创建断点,则可以告诉它在断点处停止的条件。
告诉它在nova.llargaria is >= nova.lletres.length
时停在断点处。这样可以让你在崩溃之前看到正在发生的事情。
此外,您只需检查代码中的nova.llargaria is >= nova.lletres.length
和continue;
是否跳过它,以便在这种情况下不会崩溃。