2016-12-13 14 views
1

TXTファイルからいくつかの単語を読み込もうとしていますが、このエラーが発生します。java.lang.StringIndexOutOfBoundsException:文字列インデックスが範囲外です。何が間違っているのか分かりません。おそらく始めと終わりのインデックスを持つものでしょう...そのインデックスを修正する方法を知っていますか? plsは...おかげで...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); 
} 

}

+2

** line **はその例外を投げていますか? –

+0

スタックトレースを含めることはできますか? – user123

+0

私はコードでマークしました。^_ ^aKrajinaPôvodu= riadok.substring(0、riadok.lastIndexOf( '/')); –

答えて

1

あなたの問題は、あなたのコードが入ってくる文字列の「レイアウト」について多くの多くの仮定を行うことだけです。

indexOf()やlastIndexOf()などのこれらのメソッドはすべて、そのようなインデックスがない場合は-1を返します。言い換えれば

:あなたの文字列を処理し、コールのサブストリングのための「インデックス」を使用して...あなたは検証あなたの着信文字列のレイアウトについてのあなたの仮定に持って前に!

int index = whatever.indexOf("/"); 
if (index != -1) { 
... 

たり、いくつかの「初期」の検証を行うようなことを行って、例えば

。たとえば、正規表現を使用します。

かいつまん:とき、文字列から「substring'ing」2つの方法があります:あなた最初は、あなたが探しているすべてのものがあることを確認してください...または、このような例外を除いて、あなた契約のいずれかあなたがあなたのコードに入れた期待にマッチしない着信文字列を教えてください!

関連する問題