【问题标题】:NullPointerException from null array cells来自空数组单元格的 NullPointerException
【发布时间】:2014-12-15 03:22:27
【问题描述】:

使用 Java 而不是 IDE,而是使用命令行,我应该编写一个基本的电话簿程序,专注于数组,其中用户有三个选项:在数组中搜索名称并打印名称和电话号码,如果找到姓名,则根据用户输入将新姓名和电话号码添加到数组中,并根据用户输入从数组中删除姓名和号码。添加功能完全按照它应该的方式工作,但搜索和删除功能无法正常工作。我的代码可以编译并运行,但每当我尝试搜索或删除数组中不存在的名称时,都会出现 NullPointerException 运行时错误。

这些是程序“删除条目”部分的具体说明:

"要从这样的数组中删除一个名字和数字,首先找到名字所在的单元格。如果要删除的名字不在数组中,则报错。现在复制最后一个非空单元格中的引用到被删除名称的单元格。将最后一个非空单元格设置为空。现在删除的PhoneEntry是垃圾,所有数组最后仍然有所有空值。”

这是我的代码:

import java.util.*;

class PhoneEntry
{
    String name;    // name of a person
    String phone;   // their phone number

    PhoneEntry( String n, String p )
    {
        name = n; phone = p;
    }
}

class PhoneBook
{
    PhoneEntry[] phoneBook;

    PhoneBook()    // constructor
    {
        phoneBook = new PhoneEntry[ 10 ] ;

        phoneBook[0] = new PhoneEntry( "James Barclay", "(418) 665-1223" );
        phoneBook[1] = new PhoneEntry( "Grace Dunbar",  "(860) 399-3044" );
        phoneBook[2] = new PhoneEntry( "Paul Kratides", "(815) 439-9271" );
        phoneBook[3] = new PhoneEntry( "Violet Smith",  "(312) 223-1937" );
        phoneBook[4] = new PhoneEntry( "John Wood",     "(913) 883-2874" );
        phoneBook[5] = new PhoneEntry( null, null );
        phoneBook[6] = new PhoneEntry( null, null );
        phoneBook[7] = new PhoneEntry( null, null );
        phoneBook[8] = new PhoneEntry( null, null );
        phoneBook[9] = new PhoneEntry( null, null );
    }

    PhoneEntry search( String targetName )
    {
        for ( int i = 0 ; i < phoneBook.length ; i++ )
        {
            System.out.println(i);  // debug
            if ( phoneBook[i] != null && phoneBook[i].name.equals( targetName ) )
            {
                return phoneBook[i];
            }
        }
        return null;
    }

    PhoneEntry addEntry( String addName, String addNumber )
    {
        boolean found = false;
        for ( int i = 0 ; i < phoneBook.length ; i++ )
        {
            System.out.println(i);  // debug
            if ( phoneBook[i].name == null )
            {
                phoneBook[i] = new PhoneEntry( addName, addNumber );
                found = true;
                    break;
            }
        }
        if ( !found )
        {
            System.out.println("Phone book is full! Delete an entry first!");
        }
        return null;
    }

    PhoneEntry deleteEntry( String deleteName )
    {
        boolean found = false;
        for ( int i = 0 ; i < phoneBook.length ; i++ )
        {
            System.out.println(i);  // debug
            if ( phoneBook[i] != null && phoneBook[i].name.equals( deleteName ) )
            {
                System.out.println( phoneBook[i].name + " found");  // debug
                phoneBook[i] = new PhoneEntry( null, null );
                found = true;
                    break;
            }
        }
        if ( !found )
        {
            System.out.println( "Entry not found." );
        }
        return null;
    }
}

class PhoneBookComplete
{
    public static void main ( String[] args )
    {
        PhoneBook pb = new PhoneBook();
        Scanner scan = new Scanner( System.in );
        String tempName, tempNumber, tempDelName;

            // INITIAL WELCOME MESSAGE START

        System.out.println();
        System.out.println("**********************");
        System.out.println("***** PHONE BOOK *****");
        System.out.println("**********************");
        System.out.println();
        System.out.println(" 1  Search for an entry");
        System.out.println(" 2  Add a new entry");
        System.out.println(" 3  Delete an entry");
        System.out.println(" 4  Quit program");
        System.out.println();
        System.out.print("Enter a command: ");

        String userInput = scan.nextLine();
        PhoneEntry entry;
        System.out.println();

            // INITIAL WELCOME MESSAGE END

        while ( userInput != "quit" )
        {
            if ( userInput.equals("1") )        //  NAME SEARCH
            {
                    System.out.println("    NAME SEARCH START");
                System.out.println("**********************");
                System.out.println("***** NAME SEARCH ****");
                System.out.println("**********************");
                System.out.println();
                System.out.print("Enter a name: ");
                userInput = scan.nextLine();
                entry = pb.search( userInput );

                if ( entry != null )
                {
                    System.out.println();
                    System.out.println( "  " + entry.name + ": " + entry.phone );
                    System.out.println();
                }
                else if ( userInput.equals("quit") )
                {
                    break;
                }
                else
                {
                    System.out.println("Name not found.");
                    System.out.println();
                }
                    System.out.println("    NAME SEARCH END");
                    System.out.println();
            }
            else if ( userInput.equals("2") )   //  ADD ENTRY
            {
                    System.out.println("    ADD ENTRY START");

                System.out.println("**********************");
                System.out.println("***** ADD ENTRY ******");
                System.out.println("**********************");
                System.out.println();

                System.out.print("Enter full name: ");
                tempName = scan.nextLine();

                    if ( userInput.equals("quit") )
                    {
                        break;
                    }

                System.out.print("Enter phone number: ");
                tempNumber = scan.nextLine();

                    if ( userInput.equals("quit") )
                    {
                        break;
                    }

                entry = pb.addEntry( tempName, tempNumber );

                System.out.println();
                System.out.println( "Entry for " + tempName + " successfully added." );
                //System.out.println("Phone book is full! Delete an entry first!");

                    System.out.println("    ADD ENTRY END");
                    System.out.println();
            }
            else if ( userInput.equals("3") )   //  DELETE ENTRY
            {
                    System.out.println("    DELETE ENTRY START");

                System.out.println("**********************");
                System.out.println("**** DELETE ENTRY ****");
                System.out.println("**********************");
                System.out.println();

                System.out.print("Enter full name: ");
                tempDelName = scan.nextLine();
                entry = pb.deleteEntry( tempDelName );

                if ( entry == null )
                {
                    System.out.println();
                    System.out.println( "Entry for " + tempDelName + " successfully deleted." );
                    System.out.println();
                }
                else if ( userInput.equals("quit") )
                {
                    break;
                }
                else
                {
                    System.out.println();
                }

                    System.out.println("    DELETE ENTRY END");
                    System.out.println();
            }
            else if ( userInput.equals("4") )   //  QUIT PROGRAM
            {
                    System.out.println();
                break;
            }

            //System.out.println("Select a command:");
            System.out.println("**********************");
            System.out.println("**********************");
            System.out.println("**********************");
            System.out.println();
            System.out.println(" 1  Search for an entry");
            System.out.println(" 2  Add a new entry");
            System.out.println(" 3  Delete an entry");
            System.out.println(" 4  Quit program");
            System.out.println();
            System.out.print("Enter a command: ");
            userInput = scan.nextLine();
        }
        System.out.println("Goodbye.");
    }
}

这是我在尝试搜索不存在的名称时遇到的错误:

Exception in thread "main" java.lang.NullPointerException
        at PhoneBook.search(PhoneBookComplete.java:39)
        at PhoneBookComplete.main(PhoneBookComplete.java:128)

这是我尝试删除不存在的名称时遇到的错误:

Exception in thread "main" java.lang.NullPointerException
        at PhoneBook.deleteEntry(PhoneBookComplete.java:73)
        at PhoneBookComplete.main(PhoneBookComplete.java:193)

我知道这与我对 null 的使用有关,但我还能用什么来代替 null?另外,我应该无论如何都要使用 null。

所以我想我的问题是:应该在我的代码中修改什么,以便当用户尝试删除或搜索不存在的名称时,会打印一条错误消息而不会导致程序崩溃?

在回答时,请记住,我对 Java 很陌生,数组、方法和诸如此类的东西仍然让我很困惑。如果需要更多信息等,请询问,您将收到。话虽如此,任何对任何事情的帮助和解释都将受到赞赏和欢迎。谢谢!

【问题讨论】:

    标签: java arrays nullpointerexception


    【解决方案1】:

    检查名字也不是null,这个

    if (phoneBook[i] != null && phoneBook[i].name.equals(targetName))
    

    应该是这样的

    if (phoneBook[i] != null && targetName.equals(phoneBook[i].name))
    

    deleteEntry 一样

    if (phoneBook[i] != null && deleteName.equals(phoneBook[i].name))
    

    因为当phoneBook[i].namenull 时,它会导致NullPointerException 调用.equals()。你也可以在.name 上添加一个null 测试,但是你需要另一个&amp;&amp;

    if (phoneBook[i] != null && phoneBook[i].name != null &&
        phoneBook[i].name.equals(targetName))
    

    【讨论】:

    • 你是巫师吗?哦,天哪,是的!它完美地工作。非常感谢!
    【解决方案2】:

    我想我找到了你的问题。

    if ( phoneBook[i] != null && phoneBook[i].name.equals( deleteName ) )
    

    这会检查条目是否为空,但不检查实际名称是否为空。

    应该是

    if ( phoneBook[i].name != null && phoneBook[i].name.equals( deleteName ) )
    

    如果不是

    phoneBook[5] = new PhoneEntry( null, null );
    

    你用过

    phoneBook[5] = null;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      相关资源
      最近更新 更多