获取Java String数组中的非空字段数

时间:2015-07-07 19:05:32

标签: java arrays

我创建了一个包含100个字段的String数组。

然后,我从文件中读取值。

只有7个值,但是这个数字可以在1到100之间变化,所以我给String数组留下了100个字段。

基本上,我有一个键值,我将用它来识别其他相同的值。

但是,当我尝试检查数组的值是否等于键值时,我收到一个空指针异常:

for(i = 0; i <= memberType.length; i++)
{
    if(memberType[i].equalsIgnoreCase(memberTypeInput))
    {
        out.println(memberCode[i] + " " + memberType[i] + " " + firstName[i] + " " +
                lastName[i] + " " + age[i] + " " + gender[i]);
    }// END IF
}// END FOR

从阅读其他几个相似(但不完全相同)的问题/答案,以及谷歌搜索这个问题几个小时,我现在明白空指针异常发生,因为我试图检查我的键值对一些值是空。

我的问题是:在这种情况下避免空指针异常的最佳方法是什么?

更具体地说:如何让Java找到非空字段的数量? 我想如果我能找到非空字段的数量,我可以让Java只针对非空字段检查我的键值,从而避免空指针异常。

我尝试使用以下方法查找非空字段的数量:

int index = -1;
for (i = 0; i < memberType.length; i++)
                {
                    if (!memberType[i].equals(null))
                    {
                        index = i;
                    }
                }

然后我使用&#34; index&#34;在for循环中搜索数组中等于键值的值。

但是,上面的代码会抛出另一个空指针异常。

如果你想查看它,我的所有代码都在下面。还有一些其他的事情正在发生,但我想留下它,这样你就可以了解全局。空指针异常指向第157行。它是一个IF语句。

package Phase2;

import java.io.*;
import java.util.*;

import javax.swing.JOptionPane;

import static java.lang.System.out;

public class Phase2
{

// DEFINING ARRAYS & VARIABLES //



/////////////////
// MAIN METHOD //
/////////////////
public static void main (String[] args)
{
    int menuSelection;

    start_program();

    menuSelection = Menu();

    switch(menuSelection)
    {
        case 1:
            Modify_member();
            break;

        case 2:
            Modify_registration();
            break;

        case 3:
            Report();
            break;

        case 4:
            end_program();
            System.exit(0);

    }// END SWITCH CASE STATEMENT

}// END MAIN METHOD


////////////////////////////////////////////
// METHOD to run once at start of program //
////////////////////////////////////////////
public static void start_program()
{

    //VARS & ARRAYS FOR start_program() METHOD
    String newLine;

    int count = -1;
    int[] memberCode = new int[100];
    String[] memberType = new String[100];
    String[] firstName = new String[100];
    String[] lastName = new String[100];
    int[] age = new int[100];
    char[] gender = new char[100];

    int menuSelection = 0;
    String menuOutput;
    int i;

    String memberTypeInput;

    try
    {
        BufferedReader membersFile = new BufferedReader(new FileReader("members.dat"));

        while ((newLine = membersFile.readLine()) != null)
            {
                StringTokenizer delimiter = new StringTokenizer(newLine, "#");
                count = count+1;
                memberCode[count] = Integer.parseInt(delimiter.nextToken());
                memberType[count] = delimiter.nextToken();
                firstName[count] = delimiter.nextToken();
                lastName[count] = delimiter.nextToken();
                age[count] = Integer.parseInt(delimiter.nextToken());
                gender[count] = delimiter.nextToken().charAt(0);

            }// END WHILE

        membersFile.close();
    }// END TRY

    catch(IOException error)
    {
        out.println("There was an error on file read " + error);
    }// END CATCH


    //////////
    // MENU //
    //////////
    menuOutput =    "\tMoon Area YMCA" + "\n" +
                    "1. All Member Info" + "\n" +
                    "2. All Members of a Specific Type" + "\n" +
                    "3. All Members Between a Specific Age Range" + "\n" +
                    "4. All Members of a Specific Gender" + "\n" +
                    "5. Report 5" + "\n" +
                    "6. Report 6" + "\n" +
                    "7. Report 7" + "\n" +
                    "8. Report 8" + "\n" +
                    "9. Report 9" + "\n" +
                    "10. Exit Report Menu" + "\n\n" +
                    "Please Make Your Selection";

    while(menuSelection != 10)
    {
        menuSelection = Integer.parseInt
                (JOptionPane.showInputDialog(null, menuOutput, "Main Menu", JOptionPane.QUESTION_MESSAGE));

        switch(menuSelection)
        {
        case 1:
            for (i=0; i<=count; ++i)
            {
                out.println(memberCode[i] + " " + memberType[i] + " " + firstName[i] + " " +
                lastName[i] + " " + age[i] + " " + gender[i]);
            }// END FOR
            break;

        case 2:
            memberTypeInput = JOptionPane.showInputDialog
                (null, "Please enter member type", "Info by Member Type", JOptionPane.QUESTION_MESSAGE);

            if (memberTypeInput.equalsIgnoreCase("single") ||
                memberTypeInput.equalsIgnoreCase("family") ||
                memberTypeInput.equalsIgnoreCase("couple"))
            {   
                // getting number of non-null fields in memberType array

                //// NEED TO FIND NUMBER OF NOT NULL FIELDS
                /*int index = -1;

                for (i = 0; i < memberType.length; i++)
                {
                    if (!memberType[i].equals(null))
                    {
                        index = i;
                        break;
                    }
                }*/

                // getting index number of each memberTypeInput value in array

                for(i = 0; i <= memberType.length; i++)
                {
                    if(memberType[i].equalsIgnoreCase(memberTypeInput))
                    {
                        out.println(memberCode[i] + " " + memberType[i] + " " + firstName[i] + " " +
                                lastName[i] + " " + age[i] + " " + gender[i]);
                    }// END IF
                }// END FOR

            }// END IF
            else
            {
                JOptionPane.showMessageDialog
                    (null, "Please choose 'single', 'couple', or 'family'", "Error", JOptionPane.INFORMATION_MESSAGE);
            }// END ELSE
            break;

        case 3:
            break;

        case 4:
            break;

        case 5:
            break;

        case 6:
            break;

        case 7:
            break;

        case 8:
            break;

        case 9:
            break;

        case 10:
            break;

        }// END SWITCH
    }// END WHILE


}// END start_program METHOD


//////////////////////////////////////////////////////////
// METHOD to print menu and return user input selection //
//////////////////////////////////////////////////////////
public static int Menu()
{
    String menuSelectionString;
    int menuSelection = 0;
    String output;

    while(menuSelection == 0)
    {
        output =    "Moon Area YMCA\n\n" +
                    "1. Add/Modify Member Information\n" +
                    "2. Add/Modify Class Registrations\n" +
                    "3. Report Section\n" +
                    "4. Exit the System\n\n" +
                    "Please make your selection:" ;

        menuSelectionString = JOptionPane.showInputDialog(null, output, "Main Menu", JOptionPane.QUESTION_MESSAGE);
        if (menuSelectionString.equals("1") ||
            menuSelectionString.equals("2") ||
            menuSelectionString.equals("3") ||
            menuSelectionString.equals("4"))
        {
            menuSelection = Integer.parseInt(menuSelectionString);
        }// END IF STATEMENT
        else
        {
            JOptionPane.showMessageDialog(null, "Please select a number between 1 and 4.", "Error", JOptionPane.INFORMATION_MESSAGE);
            menuSelection = 0;
        }// END ELSE STATEMENT

    }// END WHILE LOOP

    return menuSelection;

}// END Menu METHOD


////////////////////////////////////////////////////////////
// METHOD to add, delete, change basic member information //
////////////////////////////////////////////////////////////
public static void Modify_member()
{
    out.println("Modify_member() method has executed.");
}// END Modify_member METHOD


//////////////////////////////////////////////////////////////////
// METHOD to add, delete, change class registration information //
//////////////////////////////////////////////////////////////////
public static void Modify_registration()
{
    out.println("Modify_registration() method has executed.");
}// END Modify_registration METHOD


/////////////////////////////
// METHOD to print reports //
/////////////////////////////
public static void Report()
{
    out.println("Report() method has executed.");
}// END Report METHOD


//////////////////////////////////////////
// METHOD to run once at end of program //
//////////////////////////////////////////
public static void end_program()
{
    out.println("end_program() method has executed.");
}// END end_program METHOD

}// END Phase2 CLASS

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

你不能在无效的东西上调用方法;如果methodType [i]包含空引用,则尝试在其上调用方法会导致NullPointerException。首先使用!=检查它是否为空:

if (memberType[i] != null && memberType[i].equals("whatever")) {
    ...

如果memberType为null,这将会短路,因此不会评估表达式的其余部分(&amp;&amp;&amp;&amp;)。

答案 1 :(得分:0)

您似乎正在获得空指针异常,因为您正在尝试比较不存在的内容。我建议使用列表而不是数组。这样您就可以动态地向它们添加项目,并且永远不需要检查空值。