Java 在数组中避免null?
我是一个新手,在大学里我们被要求只使用数组 (我问老师,说没有数组列表或其他什么,想用粗糙的方法) 它是关于制作一个可以插入、搜索或删除其中某个值的数组。我通过搜索和应用解决方案来充分利用它 但是他们想要一个输出,所以如果我删除然后搜索该值,它会显示该值已消失,但问题是,由于该值已删除,Java会在其中放置一个null,因此当for循环遍历所有null时,它会创建可怕的NullPointerException错误。我目前正在搜索具有这些限制的解决方案,但没有结果,加上我的Java词汇表和术语目前确实很短:PJava 在数组中避免null?,java,Java,我是一个新手,在大学里我们被要求只使用数组 (我问老师,说没有数组列表或其他什么,想用粗糙的方法) 它是关于制作一个可以插入、搜索或删除其中某个值的数组。我通过搜索和应用解决方案来充分利用它 但是他们想要一个输出,所以如果我删除然后搜索该值,它会显示该值已消失,但问题是,由于该值已删除,Java会在其中放置一个null,因此当for循环遍历所有null时,它会创建可怕的NullPointerException错误。我目前正在搜索具有这些限制的解决方案,但没有结果,加上我的Java词汇表和术语目前
import static java.lang.System.out;
import java.util.Scanner;
public class JavaApplication
{
public static void main(String[] args)
{
Scanner kb = new Scanner(System.in);
//initialize String array x20
String[] regName = new String[20];
int regCount = 0;
int func = 0;
while (func == 0) //Main Menu Looper
{
out.println("Select function by entering its number.");
out.println("[1] Insert");
out.println("[2] Search");
out.println("[3] Delete");
out.println("[4] Exit");
out.print("Choose Operation: ");
func = kb.nextInt(); //Choose Option
out.print("======================================");
out.print("\n");
switch (func)
{
case 1: //Insertion
//set Array index start
char yesNo;
do
{
//Inserting into arrays loop
out.print("Insert student last name: ");
regName[regCount] = kb.next();
regCount++;
out.print("\n");
//Viewing loop
out.println("Student List: ");
for (int ctrl = 0; ctrl < regCount; ctrl++)
{
out.println(regName[ctrl]);
}
out.print("\n");
//Question loop
out.print("You want to insert again(Y/N):");
yesNo = kb.findWithinHorizon(".", 0).charAt(0);
if (yesNo == 'y' || yesNo == 'Y')
{
yesNo = 'y';
}
} while (yesNo == 'y');
func = 0;
break;
case 2: //Searching
out.print("Enter keyword: ");
String search = kb.next();
boolean found = false;
int searchCount = 0;
for (int ctrl = 0; ctrl < regCount; ctrl++)
{
if (regName[ctrl].equalsIgnoreCase(search)) {
found = true;
out.println(search + " has " + " a match.");
}
else
{
out.println(search + " has " + " not found.");
}
}
out.print("\n");
func = 0;
break;
case 3: //Deleting
out.print("type surname you want to delete: ");
String toDelete = kb.next();
for (int ctrl = 0; ctrl < regCount; ctrl++)
{
if (regName[ctrl].equalsIgnoreCase(toDelete)) {
regName[ctrl] = null;
out.println("Record deleted.");
}
}
out.print("\n");
func = 0;
break;
} //switch
} //while
} //main
} //class
导入静态java.lang.System.out;
导入java.util.Scanner;
公共类Java应用程序
{
公共静态void main(字符串[]args)
{
扫描仪kb=新扫描仪(System.in);
//初始化字符串数组x20
字符串[]regName=新字符串[20];
int regCount=0;
int func=0;
while(func==0)//主菜单循环器
{
println(“通过输入函数的编号来选择函数”);
out.println(“[1]插入”);
out.println(“[2]搜索”);
out.println(“[3]删除”);
out.println(“[4]退出”);
打印(“选择操作:”);
func=kb.nextInt();//选择选项
打印(“================================================================”);
打印输出(“\n”);
开关(func)
{
案例1://插入
//设置数组索引开始
char yesNo;
做
{
//插入到数组循环中
打印(“插入学生姓氏:”);
regName[regCount]=kb.next();
regCount++;
打印输出(“\n”);
//观察环
out.println(“学生名单”);
对于(int-ctrl=0;ctrl
只需执行空检查:if(regName[ctrl].equalsIgnoreCase(search)){
可以变成if(regName[ctrl]!=null&®Name[ctrl].equalsIgnoreCase(search)){
等等
这相当于:
if (regname[ctrl] != null)
{
if (regName[ctrl].equalsIgnoreCase(search))
{
...
由于Java对表达式求值的方式,第二部分只有在第一部分正确时才能完成——在您的情况下,只有在索引处的值不为null时才尝试使用数组)
如果你想给老师留下深刻印象,请将插入搜索和删除分为不同的方法。搜索时,在调用
equalsIgnoreCase
之前检查null
if (regName[ctrl]!=null && regName[ctrl].equalsIgnoreCase(search)) {
found = true;
out.println(search + " has " + " a match.");
}
else
{
out.println(search + " has " + " not found.");
}
其他答案建议检查空值。但这并不能解决您的问题。因为代码的其余部分不希望在学生列表中出现空白 删除某些名称后,请尝试移动这些名称:
case 3: //Deleting
out.print("type surname you want to delete: ");
String toDelete = kb.next();
int deleted = 0;
for (int ctrl = 0; ctrl < regCount; ctrl++) {
if (regName[ctrl].equalsIgnoreCase(toDelete)) {
out.println("Record deleted.");
deleted++;
}
if(deleted > 0) {
int newCtrl = ctrl + deleted;
regName[ctrl] = (newCtrl < regCount) ? regName[newCtrl] : null;
}
}
regCount -= deleted;
out.print("\n");
func = 0;
break;
更新:仅删除第一次出现的内容
case 3: //Deleting
out.print("type surname you want to delete: ");
String toDelete = kb.next();
int deletedIndex = -1;
for (int ctrl = 0; ctrl < regCount; ctrl++) {
if(deletedIndex >= 0) {
int newCtrl = ctrl + 1;
regName[ctrl] = (newCtrl < regCount) ? regName[newCtrl] : null;
} else if (regName[ctrl].equalsIgnoreCase(toDelete)) {
deletedIndex = ctrl;
out.println("Record deleted : #" + deletedIndex);
regCount--;
}
}
out.print("\n");
func = 0;
break;
case 3://删除
打印(“键入您要删除的姓氏:”;
字符串toDelete=kb.next();
int deletedIndex=-1;
对于(int-ctrl=0;ctrl=0){
int newCtrl=ctrl+1;
regName[ctrl]=(newCtrl
每当您使用任何数据结构编写代码时,都要考虑空检查,以避免未检查的异常。因此,您可以先添加先执行的检查,如果为true,则只进行检查
case 3: //Deleting
out.print("type surname you want to delete: ");
String toDelete = kb.next();
int deletedIndex = -1;
for (int ctrl = 0; ctrl < regCount; ctrl++) {
if(deletedIndex >= 0) {
int newCtrl = ctrl + 1;
regName[ctrl] = (newCtrl < regCount) ? regName[newCtrl] : null;
} else if (regName[ctrl].equalsIgnoreCase(toDelete)) {
deletedIndex = ctrl;
out.println("Record deleted : #" + deletedIndex);
regCount--;
}
}
out.print("\n");
func = 0;
break;
if (regname[ctrl] != null && regName[ctrl].equalsIgnoreCase(search)) {