简体   繁体   中英

I keep getting a java.lang.arrayindexoutofboundsexception 5 error, but I can't find the error

*Heads up this is technically HOMEWORK , but it won't let me add the tag for some reason

the compiler seems to be specifically pointing to the specialPrintData() method, but I honestly can't figure out what's wrong. This is the last step to finishing my program so all help is welcomed!

import java.util.Scanner;
import java.io.File;

public class Lab07
{
   static final int MAX = 100;  // global constant

   static public int readFile( String [ ] fd, String fileName)  throws Exception
   {

   File f = new File( fileName );
   Scanner input = new Scanner( f );

   int count = 0;

   while( count < fd.length && input.hasNextLine( ) )
   {
       fd[count] = input.nextLine( );
       count++;
   }

   if (input.hasNext( ) )
   {
      System.out.println("File is larger than array. Program is terminating.");
      System.exit(0);
   }

   else
   {
      System.out.println("Read " + count + " int values from file.");
   }
   input.close( );

   return count;
}   

static public void printData( String [ ] fd, int count )
{
  for( int i = 0; i < count; i++)
  {
    System.out.println(  fd[i] );
  }
  System.out.println();
}

static public void specialPrintData( String [ ] fd, int count )
{
  for( int i = 3; i < count; i++)
  {
    System.out.printf(" %4s ", fd[i] );
  }
}

static public int countWords(String str)
{
    int count = 1;
    for (int i = 0; i <= str.length() - 1; i++)
    {
        if (str.charAt(i) == ' ' && str.charAt(i+1) != ' ')
        {
            count++;
        }
    }
    return count;
}

static public void printNicelyFormattedData( String [ ] fd, int count )
{
    int numKids = 0;

    for( int i = 0; i < count; i++)
    {   
        if (countWords( fd[i] ) > 2)
        {
            numKids = ((countWords( fd[i]) - 3));
        }

        String [ ] list1 = fd[i].split(" ");

        System.out.println( list1[0] + " and " + list1[1] + " " + list1[2] + " have " + numKids + " children:" + "\n");

        specialPrintData( list1, count);
    }

    System.out.println();
}


   static public void main( String args [ ] )  throws Exception
   {
    if( args.length < 1 )
    {
       System.out.println("Error running program!");
       System.out.println("Usage:  java Lab07   L7d.txt");
       System.exit( 0 );
    }

    String [ ] fileData = new String[MAX];
    int count = 0;

    count = readFile( fileData, args[0] );
    System.out.println( "Array of file data contains " + count + " lines of data:");
    printData( fileData, count );

    System.out.println("*******************************************************");
    System.out.println("Family Data for past and present presidential families:");
    printNicelyFormattedData( fileData, count );

}
}

In the countWords method you are accessing the character at index i + 1 . Therefore you must check before like this:

if (i + 1 < str.length()) {

When you have fixed this problem, you will get a NullPointerException . Looking at the stack trace, you can see in which line of the code it occurred.

To fix that, you should replace the String[] with an ArrayList<String> . Then you can get rid off the MAX constant, since a list is like an array, but it grows automatically whenever you add something to it.

the problem is in your printNicelyFormattedData method. At this line

specialPrintData( list1, count);

you are passing the count of the String[] fd and not the count of String[] list .

that is instead of the number of words in a line, you are passing the number of lines in the file.

so instead of that, use this

specialPrintData( list1, list1.length);

EDIT:

as @Roland mentioned there is another exception likely to happen but only in the below case.

StringIndexOutOfBoundsException is likely to happen at this line if (str.charAt(i) == ' ' && str.charAt(i+1) != ' ') only if the last character of the line is ' ' otherwise the first condition would fail for the last character and the second condition would never be checked

hope this helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM