*抬头这在技术上是 HOMEWORK ,但它不会让我因某种原因添加标签
编译器似乎是专门指向specialPrintData()方法,但老实说我不知道出了什么问题。这是完成我的计划的最后一步,所以欢迎所有帮助!
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 );
}
}
答案 0 :(得分:2)
在countWords
方法中,您正在访问索引i + 1
处的字符。因此,你必须像这样检查:
if (i + 1 < str.length()) {
解决此问题后,您将获得NullPointerException
。查看堆栈跟踪,您可以看到它出现在代码的哪一行。
要解决此问题,您应该将String[]
替换为ArrayList<String>
。然后你可以摆脱MAX
常量,因为列表就像一个数组,但只要你add
有什么东西,它就会自动增长。
答案 1 :(得分:1)
问题出在您的printNicelyFormattedData
方法中。在这一行
specialPrintData( list1, count);
您传递的是String[] fd
的计数,而不是String[] list
的计数。
而不是一行中的单词数,你传递的是行数 文件。
所以不要那样,使用这个
specialPrintData( list1, list1.length);
修改强>
正如@Roland所说,可能会发生另一个例外情况,但仅限于以下情况。
StringIndexOutOfBoundsException可能发生在这一行if(str.charAt(i)==''&amp;&amp; str.charAt(i + 1)!=''),只有当该行的最后一个字符是' '否则第一个条件将失败,最后一个字符将永远不会被检查
希望这会有所帮助。