Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法将文本文件读入数组并再次写入文本文件_Java - Fatal编程技术网

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:27‌​2)






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 
  }