我创建了一个包含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
非常感谢任何帮助!
答案 0 :(得分:0)
你不能在无效的东西上调用方法;如果methodType [i]包含空引用,则尝试在其上调用方法会导致NullPointerException。首先使用!=
检查它是否为空:
if (memberType[i] != null && memberType[i].equals("whatever")) {
...
如果memberType为null,这将会短路,因此不会评估表达式的其余部分(&amp;&amp;&amp;&amp;)。
答案 1 :(得分:0)
您似乎正在获得空指针异常,因为您正在尝试比较不存在的内容。我建议使用列表而不是数组。这样您就可以动态地向它们添加项目,并且永远不需要检查空值。