Java 在数组中避免null?

Java 在数组中避免null?,java,Java,我是一个新手,在大学里我们被要求只使用数组 (我问老师,说没有数组列表或其他什么,想用粗糙的方法) 它是关于制作一个可以插入、搜索或删除其中某个值的数组。我通过搜索和应用解决方案来充分利用它 但是他们想要一个输出,所以如果我删除然后搜索该值,它会显示该值已消失,但问题是,由于该值已删除,Java会在其中放置一个null,因此当for循环遍历所有null时,它会创建可怕的NullPointerException错误。我目前正在搜索具有这些限制的解决方案,但没有结果,加上我的Java词汇表和术语目前

我是一个新手,在大学里我们被要求只使用数组 (我问老师,说没有数组列表或其他什么,想用粗糙的方法)

它是关于制作一个可以插入、搜索或删除其中某个值的数组。我通过搜索和应用解决方案来充分利用它

但是他们想要一个输出,所以如果我删除然后搜索该值,它会显示该值已消失,但问题是,由于该值已删除,Java会在其中放置一个null,因此当for循环遍历所有null时,它会创建可怕的NullPointerException错误。我目前正在搜索具有这些限制的解决方案,但没有结果,加上我的Java词汇表和术语目前确实很短:P

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)) {