我正在尝试从TXT文件中读取一些单词并且我收到此错误:java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1。我不知道出了什么问题,可能是开始和结束索引......你知道如何修复索引吗?请...谢谢...
import java.util.ArrayList;
import java.io.*;
import java.util.*;
/**
* Write a description of class Zoznam here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Sklad
{
Tovar tovar;
ArrayList<Tovar> potrZoznam = new ArrayList<Tovar>();
String aDruh;
String aVaha;
String aKrajinaPôvodu;
String aCena;
int i;
// /**
// * Constructor for objects of class Zoznam
// */
// public Zoznam()
// {
//
// }
public int getSkladDlzka()
{
return potrZoznam.size();
}
public void pridajPotravinu(String paDruh, String paVaha, String paKrajinaPôvodu, String paCena) throws IOException
{
Tovar a1= new Tovar(paDruh, paVaha, paKrajinaPôvodu, paCena);
potrZoznam.add(a1);
}
public void nacitajZoSuboru()
throws IOException
{
FileReader fr = new FileReader("subor.txt");
BufferedReader in = new BufferedReader(fr);
String riadok, pom;
int i = 0;
System.out.print("\f");
while((riadok = in.readLine()) != null) {
aDruh = riadok.substring(0, riadok.indexOf('/'));
riadok = riadok.substring(riadok.lastIndexOf('/') + 1, riadok.length());
int x = 0;
riadok = riadok.substring(riadok.lastIndexOf('/') + 1, riadok.length());
////////////////////////////////
aKrajinaPôvodu = riadok.substring(0, riadok.lastIndexOf('/')); // error there
riadok = riadok.substring(riadok.lastIndexOf('/') + 1, riadok.length());
aCena = riadok.substring(0, riadok.lastIndexOf('/'));
riadok = riadok.substring(riadok.lastIndexOf('/') + 1 , riadok.length());
i++;
pridajPotravinu(aDruh, aVaha, aKrajinaPôvodu, aCena);
}
fr.close();
}
public void PridatDoSkladu() throws FileNotFoundException, IOException
{
String aDruh, aVaha, aKrajinaPôvodu, aCena, novyRiadok;
Scanner vstup = new Scanner (System.in);
System.out.println("\fPRIDAŤ DO Skladu:");
System.out.println("\nZadajte Druh:");
aDruh = vstup.nextLine();
System.out.println("\nZadajte Vahu: ");
aVaha = vstup.nextLine();
System.out.println("\nZadajte Krajinu Pôvodu: ");
aKrajinaPôvodu = vstup.nextLine();
System.out.println("\nZadajte Canu");
aCena = vstup.nextLine();
System.out.println("\f\nVami zadane údaje sú: \n" + aDruh + ", " + aVaha + ", " + aKrajinaPôvodu + ", " + aCena + ".");
novyRiadok = (aDruh + " " + aVaha + " " + aKrajinaPôvodu + ", " + aCena);
PrintWriter zapisdoskladu = new PrintWriter(new FileOutputStream("subor.txt",true));
zapisdoskladu.print(novyRiadok);
zapisdoskladu.println();
zapisdoskladu.close();
pridajPotravinu(aDruh, aVaha, aKrajinaPôvodu, aCena);
}
public void AktualizujSubor() throws FileNotFoundException, IOException
{
File frM = new File("subor.txt");
FileWriter fw = new FileWriter("subor.txt");
int a = getSkladDlzka();
for (int i =0; i<a ;i++)
{
String novyRiadok = (potrZoznam.get(i).getDruh() + " " + potrZoznam.get(i).getVaha() + " " + potrZoznam.get(i).getKrajinaPôvodu() + "," + potrZoznam.get(i).getCena());
PrintWriter zapisdoskladu = new PrintWriter(new FileOutputStream("sklad.txt",true));
zapisdoskladu.print(novyRiadok);
zapisdoskladu.println();
zapisdoskladu.close();
}
fw.close();
}
public void Vypis(int i)
{
System.out.printf("%-20d. %-20s %-30s %-10s ",i+1, potrZoznam.get(i).getDruh() + " " + potrZoznam.get(i).getVaha() + " " + potrZoznam.get(i).getKrajinaPôvodu() + "," + potrZoznam.get(i).getCena());
}
public void zoradPodlaCeny()
{
boolean Zamena;
do{
Zamena=false;
for (int i=0;i<potrZoznam.size()-1;i++)
{
if (potrZoznam.get(i).getCena().compareToIgnoreCase(potrZoznam.get(i+1).getCena())>0)
{
Tovar tovar = potrZoznam.get(i);
potrZoznam.set(i, potrZoznam.get(i+1));
potrZoznam.set(i+1, tovar);
Zamena=true;
}
}
} while (Zamena);
}
}
答案 0 :(得分:1)
您的问题很简单,您的代码会对&#34;布局&#34;做出很多很多的假设。传入的字符串。
你知道,当没有这样的索引时,所有这些方法如indexOf()或lastIndexOf()都返回-1。
换句话说:之前处理字符串并使用&#34;索引&#34;对于子字符串调用...您必须验证您对传入字符串布局的假设!
例如通过做
之类的事情int index = whatever.indexOf("/");
if (index != -1) {
...
或者你做了一些&#34;初始&#34;验证;例如使用正则表达式。
长话短说:当&#34;子串&#34;有两种方式。来自字符串:要么首先要确保所有你正在寻找的东西都在那里......或者你处理这样的例外情况告诉你:传入的字符串不匹配你在代码中提出的期望!