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);
    }
}
}
4

1 に答える 1

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);
于 2013-10-12T01:40:05.960 に答える