Java 无法将文本文件读入数组并再次写入文本文件
这是我的全部密码。 我想做一个简单的程序,可以读取 文本文件并将其放入数组,然后将其写入 相同的文本文件, 还可以添加和删除现有的输入和我的输入 问题 删除和编写部分似乎不起作用,在运行代码时只有空白文本文件 这些是我选择退出后的错误Java 无法将文本文件读入数组并再次写入文本文件,java,Java,这是我的全部密码。 我想做一个简单的程序,可以读取 文本文件并将其放入数组,然后将其写入 相同的文本文件, 还可以添加和删除现有的输入和我的输入 问题 删除和编写部分似乎不起作用,在运行代码时只有空白文本文件 这些是我选择退出后的错误 java.lang.NullPointerException at ContactList.writer(ContactList.java:51) at ContactListDriver.main(ContactListDriver.java:73) at
java.lang.NullPointerException at ContactList.writer(ContactList.java:51) at
ContactListDriver.main(ContactListDriver.java:73) at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at
java.lang.reflect.Method.invoke(Unknown Source) at
edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
public class Contact {
//Each contact stores the name, phone number, and email address
private String name;
private String number;
private String email;
public Contact(String name, String number, String email)
{
this.name = name;
this.number = number;
this.email = email;
}
public String getName()
{
return name;
}
public String getNumber()
{
return number;
}
public String getEmail()
{
return email;
}
public void setName(String name)
{
this.name = name;
}
public void setNumber(String number)
{
this.number = number;
}
public void setEmail(String email)
{
this.email = email;
}
}
类来处理输入
import java.io.*;
import java.lang.*;
import java.util.*;
public class ContactList {
public Contact[] myContacts;
public static final int MAX = 100;
private int numContacts;
public ContactList()
{
myContacts = new Contact[MAX];
numContacts = 0;
}
public void addContact(String name, String number, String email)
{
Contact c = new Contact(name, number, email);
myContacts[numContacts] = c;
numContacts++;
}
public void deleteContact(String name)
{
for ( int i = 0; i <= numContacts-1 ; i++){
if( name == myContacts[i].getName())
{
myContacts[i] = null;
break;
}
}
numContacts--;
}
public void writer(){
String x = "MyContacts.txt";
try {
PrintWriter outputs = new PrintWriter(x);
for( int i=0; i < myContacts.length; i++)
{
Contact c = myContacts[i];
if(c!=null){ // check if c is null before writing to file
outputs.println(""+c.getName()+" "+c.getNumber()+" "+c.getName());
outputs.flush();
}
}
outputs.close();
}catch (IOException e) {
e.printStackTrace();
}
catch(NullPointerException ex){
}
}
public void displayContacts()
{
int i;
for(i=0; i < myContacts.length; i++)
{
Contact c = myContacts[i];
if(null != c){
System.out.println("Name: " + c.getName());
System.out.println("Number: " + c.getNumber());
System.out.println("Email: " + c.getEmail());
System.out.println("------------------------------------");
}
}
}
}
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
您已经声明并初始化了最大大小的
Contact
数组。但是,似乎您还没有初始化元素。i、 在下面的代码中,e.c为空
Contact c = myContacts[i];
outputs.println(""+c.getName()+" "+c.getNumber()+" "+c.getName());
outputs.flush();
myContacts[i]
应返回一个Contact
实例。正如Meno所说,代码中还有很多其他问题。在编写代码时,您必须始终涵盖所有可能的场景。您的代码存在许多问题,因此很难确定从何处开始
第一:您的public void delete contact(字符串名称)
-方法已损坏。它使用==而不是equals()来比较字符串。更糟糕的是:它会在数组中间创建空指针,这将导致writer()方法出现问题
第二:为什么要使用数组?您应该使用java.util.ArrayList
,它提供了用于添加、获取和删除联系人的现成实现
第三:如果您缺少文本文件,您可能会因为缺少路径而忽略它,因此您不知道在哪里查找此文件。因此,请为文件名添加完整路径
第四:如果调用scanner.nextLine(),我也会使用scanner.hasNextLine()而不是scanner.hasNext()
既然您说过不允许使用ArrayList,那么您应该研究它的源代码,尤其是删除元素的源代码。它不仅使数组bucket为空,而且还将以下所有元素向后移动一个索引,以便在元素计数给出索引之前不会有任何空间隔。deleteContact()方法中的两个中断实际上是不必要的。我看到的一个问题是: 您有一个额外的
中断代码>函数中的语句deleteContact(字符串名称)
public void writer(){
String x = "MyContacts.txt";
try {
PrintWriter outputs = new PrintWriter(x);
for( int i=0; i < myContacts.length; i++)
{
Contact c = myContacts[i];
if(c!=null){ // check if c is null before writing to file
outputs.println(""+c.getName()+" "+c.getNumber()+" "+c.getName());
outputs.flush();
}
}
outputs.close();
}catch (IOException e) {
e.printStackTrace();
}
catch(NullPointerException ex){ // Or just catch the NPE
}
和String
比较name==myContacts[i].getName()
应该是name.equals(myContacts[i].getName())
最重要的是,您需要修复联系人列表
类。它将新元素插入到最后一个索引中,并使用名称在任何位置删除
例如,假设联系人列表中有三个元素,分别位于0、1和2索引处。因此numContacts
设置为3
现在,联系人列表
包含以下元素:
[0]C0、[1]C1、[2]C2、[3]空,
然后,如果删除索引为0的联系人(设置为null
),则numContacts
设置为2。
现在,联系人列表
包含以下元素:
[0]null、[1]C1、[2]C2、[3]null、
将向索引2添加一个新的insert,它将覆盖C2值
最简单的解决方案是使用ArrayList
而不是数组
正如其他人所提到的,还有几个问题需要解决,但在我看来,以上是最重要的。问题是。。。。?包括这个part@Abdul这有什么问题?你有什么错误吗??还是例外??让我们知道如果有任何是的,删除和写入部分似乎不工作,只有空白的文本文件,当我运行代码>>>这是错误后,我选择退出。sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)sun.reflect.NativeMethodAccessorImpl.invoke(未知源)的ContactListDriver.main(ContactListDriver.java:73)的ContactList.writer(ContactList.java:51)异常在Edu.St.C.Drjava .Mult.Cyp.javaCypult.RunCu命令(JavaCypult.java:272)中调用(未知源),您应该真正考虑使用<代码> ARARYLIST/<代码>代替数组。这将允许您避免数组中的空索引。每次添加联系人时,只需add(new contact())
,您的arrayList大小将自动增加。我也需要它,但我的老师不允许。我不建议第二个补丁捕获NPE。我们不应该使用异常来控制程序流,请参阅Blochs Effective Java。@MenoHochschild如果程序员知道代码中NPE背后的原因,那么他/她可以处理它。@AJ。再次感谢。呵呵:D
public void deleteContact(String name)
{
for ( int i = 0; i <= numContacts-1; i++){
if( name.equals( myContacts[i].getName()))// string comparison uses equals();
{
myContacts[i] = null;
numContacts--; // this line should be inside of if condition
break;
}
// break; No need of breaking the loop here
}
}
public void writer(){
String x = "MyContacts.txt";
try {
PrintWriter outputs = new PrintWriter(x);
for( int i=0; i < myContacts.length; i++)
{
Contact c = myContacts[i];
if(c!=null){ // check if c is null before writing to file
outputs.println(""+c.getName()+" "+c.getNumber()+" "+c.getName());
outputs.flush();
}
}
outputs.close();
}catch (IOException e) {
e.printStackTrace();
}
catch(NullPointerException ex){ // Or just catch the NPE
}