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

时间:2016-12-13 17:09:33

标签: java substring

我正在尝试从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);
}

}

1 个答案:

答案 0 :(得分:1)

您的问题很简单,您的代码会对&#34;布局&#34;做出很多很多的假设。传入的字符串。

你知道,当没有这样的索引时,所有这些方法如indexOf()或lastIndexOf()都返回-1。

换句话说:之前处理字符串并使用&#34;索引&#34;对于子字符串调用...您必须验证您对传入字符串布局的假设!

例如通过做

之类的事情
int index = whatever.indexOf("/");
if (index != -1) { 
...

或者你做了一些&#34;初始&#34;验证;例如使用正则表达式。

长话短说:当&#34;子串&#34;有两种方式。来自字符串:要么首先要确保所有你正在寻找的东西都在那里......或者你处理这样的例外情况告诉你:传入的字符串不匹配你在代码中提出的期望!