这是一个存储10个唯一字符串的程序。如果用户输入数组中已存在的字符串,则用户将收到错误。我的代码完全适用于我输入的第一个字符串,但在此之后抛出异常,我不知道为什么。我如何解决这个问题并使其有效?
P.S。我不想使用Set。我想用数组来做。
编辑:错误名称:线程“main”java.lang.NullPointerException中的异常 Java结果:1
感谢。
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
int stringNumber = 0;
String[] stringArray = new String[10];
for (int i = 0; i <= stringArray.length; i++) {
boolean itemExists = false;
out.println("\nEnter a string");
String input = keyboard.next();
if (i > 0) {
for (int j = 0; j < stringArray.length; j++) {
if (stringArray[j].equalsIgnoreCase(input)) {
itemExists = true;
out.println("Item \"" + input + "\" already exists.");
break;
} else {
continue; // Unhandled exception error. If I don't have "continue" here, the program doesn't work properly after the first number.
}
}
}
if (itemExists == false) {
stringArray[stringNumber] = input;
out.println("\"" + stringArray[stringNumber] + "\"" + " has been stored.");
} else {
out.println("Try again.");
}
PrintArray(stringArray);
stringNumber++;
}
}
public static void PrintArray(String[] stringArray) {
for (int i = 0; i <= 9; i++) {
if (stringArray[i] == null) {
out.print(" ");
} else {
out.print("\nYour strings:");
out.print(" " +stringArray[i] + " ");
}
}
}
答案 0 :(得分:1)
你问题是这个if (stringArray[j].equalsIgnoreCase(input)) {
,你引用了null元素,因为你的数组不包含任何内容。
你可以解决这个问题
if (input.equalsIgnoreCase(stringArray[j])) {
现在,您可以再次比较可能为null的数组项的值。
检查示例代码
private final static Scanner keyboard = new Scanner(System.in);
private final static String[] stringArray = new String[10];
public static void main(String[] args) {
int stringNumber = 0;
for (int i = 0; i < stringArray.length; i++) {
System.out.println("\nEnter a string");
String input = readNextItem();
if(isInputExist(input)) {
System.out.println("Item \"" + input + "\" already exists.");
System.out.println("Try again.");
} else {
stringArray[stringNumber++] = input;
System.out.println("\"" + input + "\"" + " has been stored.");
}
printArray(stringArray);
}
}
private static String readNextItem() {
return keyboard.next();
}
private static boolean isInputExist(String input) {
for(String stored : stringArray) {
if(input.equalsIgnoreCase(stored)) {
return true;
}
}
return false;
}
答案 1 :(得分:0)
您正在获取NullPointerException,因为您正在访问一个空数组。在第二个循环中,你循环遍历整个stringArray数组,但是你已经插入了第一个i元素。
改变这个:
for (int j = 0; j < stringArray.length; j++) {
用这个:
for (int j = 0; j < i; j++) {
P.S。 我建议你使用Set而不是数组。
这是一个带有Set的版本:
int numStrings = 10;
Set<String> inserted = new HashSet<String>();
while(inserted.size()<=numStrings) {
out.println("\nEnter a string");
String input = keyboard.next();
if (inserted.contains(input)) {
out.println("Item \"" + input + "\" already exists.");
out.println("Try again.");
} else {
inserted.add(input);
out.println("\"" + input + "\"" + " has been stored.");
}
}
out.println(inserted);
答案 2 :(得分:0)
问题在于这个内循环:
for (int j = 0; j < stringArray.length; j++) {
if (stringArray[j].equalsIgnoreCase(input)) {
itemExists = true;
out.println("Item \"" + input + "\" already exists.");
break;
} else {
continue; // Unhandled exception error. If I don't have "continue" here, the program doesn't work properly after the first number.
}
}
它不是导致问题的 continue 语句,而是你调用的
stringArray[j].equalsIgnoreCase(input)
在if - stringArray [j]中尚未填充String,它将导致NullPointerException。您可以反转表达式:
input.equalsIgnoreCase(stringArray[j])
(假设“输入”永远不是NULL)