2013-10-12 5 views
0

Мой код, когда я скомпилировать и запустить выводит первые строки файла, то он говорит, что все это:почему мой код не продолжать читать весь файл целиком

java.lang.StringIndexOutOfBoundsException: String index out of range: -1 
at java.lang.String.substring(Unknown Source) 
at Popcorn1.main(Popcorn1.java:59) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272) 

И код:

import java.io.*; 
import java.util.Scanner; 
public class Popcorn1 { 

public static void main(String args[]) throws FileNotFoundException { 
    printHeader(); 
    File file; 

    do { 
     Scanner in = new Scanner(System.in); 
     System.out.println("Enter the the file name"); 
     String filename = in.next(); 

     file = new File(filename); 
    } while (!file.exists()); 

    FileReader inputFile = new FileReader(file); 
    Scanner inFile = new Scanner(inputFile); 

    System.out.println("  PopCorn Co-op"); 
    System.out.println("          Production in Hundreds"); 
    System.out.println("          of Pint Jars Per Acre"); 
    System.out.println("         1 2 3 4 5 6"); 
    System.out.println("Farm Name      ---|---|---|---|---|---|"); 
    System.out.println(); 

    // Printing out title and table header for reader to easily read data 
    String errorMSG = " "; 
    while (inFile.hasNextLine()) { 
     String inputLine = inFile.nextLine(); 
     //System.out.print(inputLine); 
     int position; 
     String name; 
     int jars; 
     double acres; 
     position = inputLine.indexOf(',');//Get the Location of the comma to use as a delimiter 

     name = inputLine.substring(0, position); //Everything to the left of the comma is the farm name 
     System.out.printf("%-31s", name); 

     inputLine = inputLine.substring(position + 2, inputLine.length());   //rest of the string 
     Scanner line = new Scanner(inputLine); 
     { 
      //acres = 0; 

      jars = 0; 
      acres = 0; 
      if (line.hasNextDouble()) { 
       acres = line.nextDouble(); 
      } else { 
       errorMSG += "There is missing data"; 
      } 
      // jars = 0; 
      if (line.hasNextInt()) { 

       jars = line.nextInt(); 
      } else { 
       errorMSG += "There is missing data"; 
      } 
     } 

     int starsConversion = (int) (jars/acres/25); 

     for (int i = 1; i < starsConversion; i++) { 
      if (i == 20) { 
       System.out.print("#"); 
      } else { 
       System.out.print("*"); 
      } 
     } 
     if (starsConversion < 20) { 
      for (int i = 1; i < (21 - starsConversion); i++) { 
       System.out.print(" "); 
      } 
      System.out.print("|"); 
      { 
       System.out.println(); //go to the next line 
      } 
     } 

     System.out.println(errorMSG); 
    } 
} 
} 

ответ

3

трудно быть уверенным, что происходит без файла, но это выглядит как

position = inputLine.indexOf(','); 

возвращается -1 (он не находит», 'в файле), что дает вам недопустимый индекс.

Попробуйте распечатать позицию после расчета, чтобы убедиться, что она действительна.

System.out.println("Position: " + position); 
System.out.println("Length: " + inputLine.length()); 
System.out.println("Trimmed: " + inputLine.trim().length()); 

Если длина 0 или просто пробел, в ней не будет запятой.

Это может быть исправлен с добавлением следующего после прочтения nextLine:

if(inputLine.trim().length() == 0) 
    continue 
if(inputLine.indexOf(",") == -1) 
    System.out.println("There is no comma on this line: " + inputLine); 
+0

вы можете ввести expample для этого. Что ты имеешь в виду, напечатайте его после того, как я это сделаю. Я уже распечатываю его – user2872881

Смежные вопросы