java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1

java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1,java,substring,Java,Substring,我试图从TXT文件中读取一些单词,但出现以下错误:java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1。我不知道出了什么问题,可能是有开始和结束索引。。。你知道如何解决这个问题吗?请。。。谢谢 import java.util.ArrayList; import java.io.*; import java.util.*; /** * Write a description of class Zoznam here. * * @auth

我试图从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);
}
import java.util.ArrayList;
导入java.io.*;
导入java.util.*;
/**
*在这里写下Zoznam类的描述。
* 
*@author(你的名字)
*@version(版本号或日期)
*/
公共级Sklad
{
托瓦尔托瓦尔;
ArrayList potrZoznam=新的ArrayList();
字符串aDruh;
字符串aVaha;
字符串aKrajinaPôvodu;
线状aCena;
int i;
//    /**
//*Zoznam类对象的构造函数
//      */
//公共佐兹南()
//    {
//          
//    }
公共int getSkladDlzka()
{
返回potrZoznam.size();
}
public void pridajPotravinu(字符串paDruh、字符串paVaha、字符串pakrainapôvodu、字符串paCena)引发IOException
{
Tovar a1=新的Tovar(paDruh、paVaha、Pakrainapôvodu、paCena);
potrZoznam.增补(a1);
}
公共无效nacitajZoSuboru()
抛出IOException
{
FileReader fr=新的FileReader(“subor.txt”);
BufferedReader in=新的BufferedReader(fr);
字符串riadok,pom;
int i=0;
系统输出打印(“\f”);
而((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('/');//出现错误
riadok=riadok.substring(riadok.lastIndexOf('/')+1,riadok.length());
aCena=riadok.substring(0,riadok.lastIndexOf('/');
riadok=riadok.substring(riadok.lastIndexOf('/')+1,riadok.length());
i++;
pridajPotravinu(阿德鲁、阿瓦哈、阿克拉吉纳普·沃杜、阿塞纳);
}
fr.close();
}
public void PridatDoSkladu()引发FileNotFoundException,IOException
{ 
字符串aDruh、aVaha、Akrainapôvodu、aCena、novyRiadok;
Scanner vstup=新扫描仪(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+”、“+Akrainapôvodu+”、“+aCena+”);
novyRiadok=(aDruh+“”+aVaha+“”+aKrajinaPôvodu+”,“+aCena);
PrintWriter zapisdoskladu=新的PrintWriter(新文件输出流(“subor.txt”,true));
zapisdoskladu.印刷(novyRiadok);
println();
zapisdoskladu.close();
pridajPotravinu(阿德鲁、阿瓦哈、阿克拉吉纳普·沃杜、阿塞纳);
}   
public void AktualizujSubor()抛出FileNotFoundException、IOException
{ 
文件frM=新文件(“subor.txt”);
FileWriter fw=新的FileWriter(“subor.txt”);
int a=getSkladDlzka();

对于(inti=0;i,您的问题只是代码对传入字符串的“布局”做出了许多假设

你看,所有这些方法,比如indexOf()或lastIndexOf()在没有这样的索引时返回-1

换句话说:在处理字符串并使用“索引”进行子字符串调用之前,必须验证您对传入字符串布局的假设

例如,通过做以下事情

int index = whatever.indexOf("/");
if (index != -1) { 
...
或者进行一些“初始”验证;例如使用正则表达式


长话短说:“子字符串”有两种方式从字符串:要么你首先确保你要查找的所有东西都在那里……要么你处理这样的异常,这些异常告诉你:传入的字符串与你在代码中写下的期望不匹配!

哪一行抛出了该异常?你能包括堆栈跟踪吗?我在代码中标记了它。^ ^ aKrajinaPôvodu=riadok.substring(0,riadok.lastIndexOf('/');
lastIndexOf
如果在
字符串中找不到它,则返回
-1
。提示:这里的主要语言是英语。对于源代码来说也是如此,因此没有“英语”源代码只会减少快速/准确回答的机会。