2016-10-18 16 views
1

私は、ユーザーの入力を3つの異なる配列に分割しようとしている箇所を、ユーザーが持っている値の間のスペースを使って書いています入力されました。例えば、空白文字列を分割しようとしています

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 
      at Substring.main(Substring.java:18) 
    Java Result: 1 

私はテキストを入力するときに別の区切り文字を使用しようとしましたし、それがうまく働いていますが、毎回では私はエラーを取得するコードを実行します正確に同じ入力を/分割して使用し、これまでにやりたいことをやりました。 ご協力いただければ幸いです! は、ここで必要な

import java.util.Scanner; 

    public class Substring{ 
    public static void main(String[]args){ 
    Scanner user_input = new Scanner(System.in); 

    String fullname = ""; //declaring a variable so the user can enter their full name 
    String[] NameSplit = new String[2]; 
    String FirstName; 
    String MiddleName; 
    String LastName; 

    System.out.println("Enter your full name (First Middle Last): "); 
    fullname = user_input.next(); //saving the user's name in the string fullname 

    NameSplit = fullname.split(" ");//We are splitting up the value of fullname every time there is a space between words 
    FirstName = NameSplit[0]; //Putting the values that are in the array into seperate string values, so they are easier to handle 
    MiddleName = NameSplit[1]; 
    LastName = NameSplit[2]; 

    System.out.println(fullname); //outputting the user's orginal input 
    System.out.println(LastName+ ", "+ FirstName +" "+ MiddleName);//outputting the last name first, then the first name, then the middle name 
    new StringBuilder(FirstName).reverse().toString(); 
    System.out.println(FirstName); 


} 

}

+0

なぜあなたは、 fullname.split( "")の代わりにfullname.split( "\\")を実行していますか?私が前にこれをやったことは確かです。 – Addi

+1

ええ、あなたはあなたが入力したことを教えてくれませんでした。 –

+0

そこにはいけません、私の悪い –

答えて

0

を使用することができます。

fullname = user_input.next();

あなたは完全に読みたいので、それだけではなくnext()nextLine()する必要がありますスキャナーからのライン。

String[] NameSplit = new String[2];

あります。後でNameSplit = user_input.split(...)を行っているとして、このステップは必要ありませんが、あなたは3つのエントリ、すなわちファーストネーム、ミドルネームとラストネームを格納しているためではなくnew String[2]new String[3]でなければなりません。

class Substring { 
    public static void main (String[] args) throws java.lang.Exception { 
     Scanner user_input = new Scanner(System.in); 
     String[] NameSplit = new String[3]; 
     String FirstName; 
     String MiddleName; 
     String LastName; 

     System.out.println("Enter your full name (First Middle Last): "); 
     String fullname = user_input.nextLine(); 

     NameSplit = fullname.split(" "); 
     FirstName = NameSplit[0]; 
     MiddleName = NameSplit[1]; 
     LastName = NameSplit[2]; 

     System.out.println(fullname); 
     System.out.println(LastName+ ", "+ FirstName +" "+ MiddleName); 
     new StringBuilder(FirstName).reverse().toString(); 
     System.out.println(FirstName); 
    } 
} 

出力:

Enter your full name (First Middle Last): John Mayer Smith

Smith, John Mayer

John

+0

それは最初の値が0、2番目の1、3番目の2のように文字列[2]です:しかし、とにかく助けてくれてありがとう! –

+0

@ L.Jones28インデックスは「0」から始まり、スペースを予約している間はインデックスの概念はもはや保持されません。だから、 '2'ではなく' 3'でなければなりません。 – user2004685

1

スプリットが正規表現であれば、あなたの代わりに一つだけのスペースの1つ以上のスペース(「+ 『)(』」)を探すことができます私のコードです。

String[] array = s.split(" +"); 

それとも、あなたは、次の場所でミスをしたStrintトークナイザ

String message = "MY name is "; 
String delim = " \n\r\t,.;"; //insert here all delimitators 
StringTokenizer st = new StringTokenizer(message,delim); 
while (st.hasMoreTokens()) { 
    System.out.println(st.nextToken()); 
} 
0

、デフォルトでは空白に一致する区切り文字パターンを、使用してトークンにその入力を壊すjava.util.Scannerここ

は正しいプログラムです。 「Elvis John Presley」と入力しても、「Elvis」のみがfullName変数に格納されます。

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 
    try { 
     fullname = reader.readLine(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

またはあなたが使用してスキャナのデフォルトの動作を変更することができます: user_input.useDelimiter("\n");方法を あなたはフルラインを読むためにBufferedReaderのを使用することができます。

0

例外は、配列の長さを超えていることをはっきりと示しています。インデックス2LastName = NameSplit[2]は配列の範囲外です。配列の長さが3でなければなりませんので、変更String[] NameSplit = new String[2]String[] NameSplit = new String[3]

の1-:あなたがしなければならないエラーを取り除くために。

読むよりここに:[How do I declare and initialize an array in Java?]

エラーがなくなっているが、user_input.next();は基本的に空白になるまで最初の単語のみ(*を読み取るためソリューションは、正しくない、まだNameSplit[1]NameSplit[2]以来nullをしているここまで

( 1単語のみの場合は '\ n')が検出された場合)。だから、:よりここ user_input.nextLine();

2 -変更user_input.next();nextLine()が(まで基本的に* '\ n' が検出された)行全体を読み取るため

読む:[http://www.cs.utexas.edu/users/ndale/Scanner.html]

関連する問題