昨夜

2011-10-20 3 views
1

ファイルのデータを読みながら、私はこのような質問をしたサブストリングを使用して、私は何が起こっているかわからないんだけど、私はので、ここで別の問題が発生したが行く:昨夜

私のインストラクターは、プロジェクトに私のクラスそのプログラムを与えていますファイルを読み込み、各文字を読み取り、各行にあるヒット、アウト、ウォーク、およびハエの量を表示します。私はこのトピックについて私のoriginal questionにいくつかの情報を掲載しました。 私は、プログラムを稼働させるチャンスをより良くするためにコードを書き直しました。私は部分文字列が何であるかを知ったとトークンについてもう少し、このプログラムと一緒に来た:

import java.util.Scanner; 
import java.io.*; 

public class BaseballStats 
{ 
    public static void main(String[]args) throws IOException 
    { 
    Scanner fileScan, lineScan; 
    String fileName; 
    int oCount = 0, hCount = 0, sCount = 0, wCount = 0; 
    Scanner scan = new Scanner(System.in); 

    System.out.print("Enter the name of the input file: "); 
    fileName = scan.nextLine(); 
    fileScan = new Scanner(new File(fileName)); 

    while (fileScan.hasNext()) 
    { 
     lineScan = new Scanner (fileName); 
     lineScan.useDelimiter(","); 

     String input = lineScan.nextLine(); 
     int point =(input.indexOf(",")); 

     String name = input.substring(0,point); 
     String records = input.substring(point,input.length()); 

     for (int i = 0; i < records.length(); i++) 
     { 
     if (records.charAt(i) == 's') 
      sCount++; 
     else if (records.charAt(i) == 'o') 
      oCount++; 
     else if (records.charAt(i) == 'h') 
      hCount++; 
     else if (records.charAt(i) == 'w') 
      wCount++; 
     }// end of for loop 
     System.out.printf("Name: %s. Hits: %d. Outs: %d. Walks: %d. Sacrifice flies: %d.", name, hCount, oCount, wCount, sCount); 
     System.out.println(); 

    }//end of while loop 

}//end of main 
}// end 

プログラムが正常に動作が、私はSTATS.DAT(読みことになっているファイル)に入力した後、

java.lang.StringIndexOutOfBoundsException: String index out of range: -1 
at java.lang.String.substring(Unknown Source) 
at BaseballStats.main(BaseballStats.java:25) 
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:271) 

これは、25行目に指し、

String name = input.substring(0,point); 

ラインです:私は、次の例外エラーが発生します。私はこれで困惑しています、何かが欠けていますか?

注:元の質問に関するAdamskiの提案を読んでいます。私はそれに追いつこうとしましたが、私がJavaに新しいので、カプセル化、特にセッターとゲッターメソッドを理解するのが苦労しています。私のクラスで説明されている次の章まで、彼らを一人ままにしておくことが最善であると考えました。

+0

'int point =(input.indexOf( "、"));'あなたが '入力'の部分文字列を入力しようとすると、 'ポイント'が何を解決しているかを見てください。 –

+0

教授フックス? – Kevin

答えて

5

あなたが扱っていることを「エッジ条件」といいます。これは、アルゴリズムにとって最も一般的な状況ではない状況です。しかし、エラーを避けるためにはまれな状況にも対処しなければなりません。

  1. :これはバグ診断の問題は、(。一日中やるいるプログラマ)あなたは今、以下を自問する必要が

    String input = lineScan.nextLine(); 
    int point =(input.indexOf(",")); 
    String name = input.substring(0,point); 
    

    です:

    次のコードを持っています"StringIndexOutOfBoundsException"とはどういう意味ですか? Googleからその旨が伝えられます。

  2. どうしたのでしょうか?部分文字列を呼び出すときに何が起こるのでしょうか? (Google javaの部分文字列を使用すると、その部分の例外をスローすることができます)
  3. これは、indexOf()メソッドを見てもらいます(やはりgoogleはあなたの友人です)。そのスタックトレースに追加します。
  4. どのような入力がそのような状況につながる可能性がありますか?

あなたが再び前進する希望。

+1

とても素敵な宿題スタイルの答えです。 – ty1824

+0

私はあなたがどこに行くのか理解していると思います。主な問題は、lineScanの次のトークンを読み込んでいる入力宣言のようです。 lineScanの区切り文字はカンマであるため、文字列にコンマが表示されることはありません。そのため、-1が返されます。私が改善する必要があるものを私に与えてくれてありがとう、今私は名前を印刷する方法を理解する必要があります。 – mooles

-1

String#indexOf(String)パラメータが渡された場合は、this文字列に-1が返されます。

ので、inputの可能性があることで,を見つけない:

int point =(input.indexOf(",")); 

そして、あなたはString.substring(int, int)に負のインデックスを渡すとき、StringIndexOutOfBoundsExceptionがスローされます。

String name = input.substring(0,point); // input.substring(0, -1); will throw the exception 
関連する問題