- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用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 还很陌生,数组、方法之类的东西对我来说仍然很困惑。如果需要更多信息等,请询问,您将收到。话虽如此,任何帮助和解释都值得赞赏和欢迎。谢谢!
最佳答案
检查 name 是否不为 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].name
为null
时,它会导致NullPointerException
调用.equals()
关于它。您还可以在 .name
上添加 null
测试,但随后您需要另一个 &&
,例如
if (phoneBook[i] != null && phoneBook[i].name != null &&
phoneBook[i].name.equals(targetName))
关于java - 来自空数组单元的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27476901/
我已经为使用 JGroups 编写了简单的测试。有两个像这样的简单应用程序 import org.jgroups.*; import org.jgroups.conf.ConfiguratorFact
我有一个通过 ajax 检索的 json 编码数据集。我尝试检索的一些数据点将返回 null 或空。 但是,我不希望将那些 null 或空值显示给最终用户,或传递给其他函数。 我现在正在做的是检查
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Why does one often see “null != variable” instead of “
嗨在我们公司,他们遵循与空值进行比较的严格规则。当我编码 if(variable!=null) 在代码审查中,我收到了对此的评论,将其更改为 if(null!=variable)。上面的代码对性能有影
我正在尝试使用 native Cordova QR 扫描仪插件编译项目,但是我不断收到此错误。据我了解,这是代码编写方式的问题,它向构造函数发送了错误的值,或者根本就没有找到构造函数。那么我该如何解决
我在装有 Java 1.8 的 Windows 10 上使用 Apache Nutch 1.14。我已按照 https://wiki.apache.org/nutch/NutchTutorial 中提
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: what is “=null” and “ IS NULL” Is there any difference bet
Three-EyedRaven 内网渗透初期,我们都希望可以豪无遗漏的尽最大可能打开目标内网攻击面,故,设计该工具的初衷是解决某些工具内网探测速率慢、运行卡死、服务爆破误报率高以及socks流
我想在Scala中像在Java中那样做: public void recv(String from) { recv(from, null); } public void recv(String
我正在尝试从一组图像补丁中创建一个密码本。我已将图像(Caltech 101)分成20 X 20图像块。我想为每个补丁创建一个SIFT描述符。但是对于某些图像补丁,它不返回任何描述符/关键点。我尝试使
我在验证器类中自动连接的两个服务有问题。这些服务工作正常,因为在我的 Controller 中是自动连接的。我有一个 applicationContext.xml 文件和 MyApp-servlet.
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭10 年前。 问题必须表现出对要解决的问题的最低程度的了解。告诉我们您尝试过做什么,为什么不起作用,以
大家好,我正在对数据库进行正常的选择,但是 mysql_num_rowsis 为空,我不知道为什么,我有 7 行选择。 如果您发现问题,请告诉我。 真的谢谢。 代码如下: function get_b
我想以以下格式创建一个字符串:id[]=%@&stringdata[]=%@&id[]=%@&stringdata[]=%@&id[]=%@&stringdata[]=%@&等,在for循环中,我得到
我正在尝试使用以下代码将URL转换为字符串: NSURL *urlOfOpenedFile = _service.myURLRequest.URL; NSString *fileThatWasOpen
我正在尝试将NSNumber传递到正在工作的UInt32中。然后,我试图将UInt32填充到NSData对象中。但是,这在这里变得有些时髦... 当我尝试将NSData对象中的内容写成它返回的字符串(
我正在进行身份验证并收到空 cookie。我想存储这个 cookie,但服务器没有返回给我 cookie。但响应代码是 200 ok。 httpConn.setRequestProperty(
我认为 Button bTutorial1 = (Button) findViewById(R.layout.tutorial1); bTutorial1.setOnClickListener
我的 Controller 中有这样的东西: model.attribute("hiringManagerMap",hiringManagerMap); 我正在访问此 hiringManagerMap
我想知道如何以正确的方式清空列表。在 div 中有一个列表然后清空 div 或列表更好吗? 我知道这是一个蹩脚的问题,但请帮助我理解这个 empty() 函数:) 案例)如果我运行这个脚本会发生什么:
我是一名优秀的程序员,十分优秀!