2013-10-31 145 views
-1

*擡頭這在技術上是HOMEWORK,但它不會讓我添加標記由於某種原因我不斷收到一個java.lang.arrayindexoutofboundsexception 5的錯誤,但我不能找到錯誤

編譯器似乎特別指向了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

家庭作業不再是SO中的標記http://meta.stackexchange.com/questions/147100/the-homework-tag-is-now-officially-deprecated –

+0

您是否還嘗試過調試您的程序? –

+0

發佈堆棧跟蹤。 – Maximin

回答

2

countWords方法,則需要在索引i + 1訪問的字符。因此,您必須像這樣前檢查:

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

當你有固定的這個問題,你會得到一個NullPointerException。查看堆棧跟蹤,可以看到它發生的代碼行。

要解決該問題,您應該將String[]替換爲ArrayList<String>。然後你可以去掉MAX常量,因爲列表就像一個數組,但是隻要你有一些東西,它就會自動增長。

+0

注意OP有'str.length() - 1',但它們也有'<=',而不是'<'。這是真正的區別。 – kevinsa5

+0

但OP已經指出異常正在拋出'specialPrintData'方法。請參閱我的回答 –

+1

這裏有不止一個例外。 :) –

1

問題出在您的printNicelyFormattedData方法中。在這條線

specialPrintData(list1, count); 

你逝去的String[] fd的數量,而不是String[] list計數。

而不是一行中的單詞數量,您正在傳遞 文件中的行數。

所以不是說,使用這種

specialPrintData(list1, list1.length); 

編輯:

爲@Roland提到的還有另一個可能發生,但只有在以下情況下例外。

的StringIndexOutOfBoundsException很可能在這行發生,如果(str.charAt(I)== '' & & str.charAt第(i + 1)!='「)僅當該行的最後一個字符是'',否則第一個條件將失敗的最後一個字符和第二個條件將永遠不會被檢查

希望這可以幫助。

+0

這解決了這個問題!謝謝,非常感謝!現在我可以睡了... –

+0

歡迎..總是樂於幫助:) –

相關問題