簡體   English   中英

空指針異常字符串生成器

[英]null pointer exception string builder

我正在嘗試在StringBuilder中使用setCharAt方法,但出現了空指針異常。 有沒有一種方法可以將值添加到我制作的StringBuilder數組中,因此不會出現這些錯誤。

通過研究,我發現了.append()方法,但我什至不確定它是如何工作的。

import java.util.*;  // Allows for the input of a scanner method.
import java.io.*;    // Allows for the inputting and outputting of a data file.
import java.lang.*;  // Allows for the use of String Methods.
//////////////////////////////////////////////////////////////////////////////////////

public class TESTY
{
static Scanner testanswers;
static PrintWriter testresults;

public static void main(String[] args) throws IOException
{
    testanswers = new Scanner(new FileReader("TestInput.dat"));
    testresults = new PrintWriter("TestOutput.dat");

    String StudentID;
    String answers;
    // Reads first two lines first to know how many records there are.
    String answerKey = testanswers.nextLine();
    int count = Integer.parseInt(testanswers.nextLine());

    // Allocate the array for the size needed.
    String[][] answerArray = new String[count][];

    for (int i = 0; i < count; i++)
    {
        String line = testanswers.nextLine();
        answerArray[i] = line.split(" ", 2);
    }

    for(int row = 0; row < answerArray.length; row++)
    {
        for(int col = 0; col < answerArray[row].length; col++)
        {
            System.out.print(answerArray[row][col] + " ");
        }
        System.out.println();
    }   
    gradeData(answerArray, answerKey);




    testanswers.close();
    testresults.close();

}
///////////////////////////////////////////////////////////
//Method: gradeData
//Description: This method will grade testanswers showing 
//what was missed, skipped, letter grade, and percentage.
///////////////////////////////////////////////////////////
public static double gradeData(String[][] answerArray, String answerKey)
{   

    String key = answerKey;
    double Points = 0;
    StringBuilder[] wrongAnswers = new StringBuilder[5];
    String studAnswers;

    for(int rowIndex = 0; rowIndex < answerArray.length; rowIndex++)   /// Counting rows
    {
        studAnswers = answerArray[rowIndex][1].replace(" ", "S");  ///Counts rows, Col stay static index 1
        for(int charIndex = 0; charIndex < studAnswers.length(); charIndex++) 
        {
            if(studAnswers.charAt(charIndex) == key.charAt(charIndex))
            {
                Points += 2;
            }
            else if(studAnswers.charAt(charIndex) == 'S')
            {
                Points --;
            }
            else if(studAnswers.charAt(charIndex) != key.charAt(charIndex))
            {
                for(int i = 0; i < wrongAnswers.length; i++)
                {

                    wrongAnswers[i].setCharAt(charIndex, 'X');
                }
                Points -= 2;                        
            }

        }
        System.out.println(Points);
    }

    return Points;


}

}

錯誤發生在第91行:

wrongAnswers[i].setCharAt(charIndex, 'X');

StringBuilder[] wrongAnswers = new StringBuilder[5];

不會創建5個空的StringBuilders,而是5個null的StringBuilders。

您需要撥打類似

wrongAnswers[i] = new StringBuilder()

為了初始化您的5個數組成員。

您已經聲明了StringBuilder的數組,但是尚未初始化任何插槽,因此它們仍然為null

初始化它們:

StringBuilder[] wrongAnswers = new StringBuilder[5];
for (int i = 0; i < wrongAnswers.length; i++)
{
    wrongAnswers[i] = new StringBuilder();
}

另外,使用setCharAt在這里不起作用,因為最初, StringBuilder沒有任何內容。 根據您要在此處執行的操作,您可能只需要調用append ,或者您可能最初想要一個包含空格的字符串,以便可以將特定字符設置為'X'

你的問題是

StringBuilder[] wrongAnswers = new StringBuilder[5];

不會創建5個StringBuilder對象。 它僅創建具有5個null StringBuilder引用的數組。 您需要使用如下一行分別創建每個StringBuilder

wrongAnswers[i] = new StringBuilder();

i的循環中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM