0

对不起,如果这一切似乎很难理解,但我是编程新手,我看过几本书和网站,根据我的理解,我想做的应该是可行的。我正在做的任务是类调用类。在不将我所有的代码放在这里的情况下,我将尝试在不清楚的区域尽可能具体。空指针异常适用于以下特定代码行:

  if(CDList[i].getArtist().equals(artist) == true)

//CDList 是一个 CD 对象数组(在另一个类中创建)

//getArtist() 是 CD 类的一个方法,它返回一个字符串

//equals()中的艺术家是用户输入的Scanner对象,也是一个String

这个特定方法的重点是搜索数组 CDList 并将存储的艺术家字符串与扫描的艺术家字符串进行比较,然后对标题进行比较。如果找到,则将删除该数组部分的内容。如果有帮助,这是该方法的其余部分:

void delete()
{
   Scanner input = new Scanner(System.in);
   System.out.println("Enter artist and title to be deleted: ");
   String artist = input.nextLine();
   String title = input.nextLine();

for(int i = 0; i <= numOfCDs; i++)
{
   if(CDList[i].getArtist().equals(artist) == true)
   {
      for(int j = 0; j <= numOfCDs; j++)
      {
         if(CDList[j].getTitle().equals(title) == true)
         {
            System.out.println("Found CD: " + CDList[j].getArtist() + " " +                 
               CDList[j].getTitle());
            System.out.println("Would you like to delete it? Y/1 N/0 ");

        if(input.nextInt() == 1)
            {
               CDList[j] = null;
               numOfCDs--;
            }
         }
         else
            System.out.println("CD not found.");
      }
    }
    else
       System.out.println("CD not found.");
 }
}

对不起,这是其余的代码。只是觉得它太多了,我会忽略它。

光盘类:

package assignment3;
public class CD 
{
    public String artist;
    public String title;
    private tracklist listOfTracks = new tracklist();

CD(String artistName, String titleName)
{
    artist = artistName;
    title = titleName;
}

public String getArtist()
{
    return artist;
}

public String getTitle()
{
     return title;
}

public boolean addTrack(String trackInfo)
{
     boolean result = false;
     if(listOfTracks.add(trackInfo) == true)
         result = true;
     return result;
}

public int numTracks()
{
    int count = listOfTracks.count();
    return count;
}

public void display()
{
    System.out.println(" ");
    System.out.println(getArtist() + " : " + getTitle());
    listOfTracks.display(7);
}
}

轨道列表类:

package assignment3;
public class tracklist 
{
    public String[] tracks;
    public int numElements;

    tracklist()
    {
        tracks = new String[99];
        numElements = 0;
    }

    public boolean add(String track)
    {
        boolean result = true;
        int index = 0;

        while(tracks[index] != null)
        {
           index++;
        }    

        tracks[index] = track;
        numElements++;
        if(numElements > 99)
            result = false;
        return result;
    }

    public int count()
    {
        return numElements;
    }

    public void display(int indent)
    {
        for(int i = 1; i < numElements; i++)
        {
            System.out.print(i);
            if(i >= 10)
            {
                 for(int j = 0; j < (indent - 1); j++)
                 {
                     System.out.print(" ");
                 }
            } 
            else
            {
                 for(int j = 0; j < indent; j++)
                 {
                     System.out.print(" ");
                 }
            }
            System.out.println(tracks[i]);
         }
    }    
   }

CDList 类:

package assignment3;
import java.util.Scanner;
public class CDList 
{
   public int numOfCDs;
   private CD[] CDList;
   private int front,rear;

   CDList(int size)
   {
       CDList = new CD[size];
       numOfCDs = 0;
       front = 0;
       rear = size - 1;
   } 

   boolean add()
   {
       boolean result;
       Scanner input = new Scanner(System.in);
       System.out.println("Enter the Artist Name and CD Title: ");
       CD userCD = new CD(input.nextLine(), input.nextLine());
       System.out.println("Enter the number of tracks: ");
       int trackNumber = input.nextInt();
       System.out.println("Enter your track titles: ");

       for(int i = 0; i <= trackNumber; i++)
       {
           userCD.addTrack(input.nextLine());
       }

       if(rear == front)
           result = false;
       else
       {
           if(CDList[rear] != null)
           rear--;
           else
               CDList[rear] = userCD;
           result = true;
       }
       return result;
   }

   void delete()
   {
       Scanner input = new Scanner(System.in);
       System.out.println("Enter artist and title to be deleted: ");
       String artist = input.nextLine();
       String title = input.nextLine();

       for(int i = 0; i <= CDList.length - 1; i++)
       {
           if((CDList[i].getArtist().equals(artist)) &&    
             (CDList[i].getTitle().equals(title)))
           {
               System.out.println("Found CD of: " + CDList[i].getArtist() + " " +                 
                 CDList[i].getTitle());
               System.out.println("Would you like to delete it? Y/1 N/0 ");
               if(input.nextInt() == 1)
               {
                   CDList[i] = null;
                   numOfCDs--;
               }
           }
           else
               System.out.println("CD not found.");
       }
   }

   void SortArtist()
   {
       CD temp = new CD(" ", " ");
       for(int i = 0; i < numOfCDs; i++)
           if(CDList[i].getArtist().compareTo(CDList[i + 1].getArtist()) < 0)
           {
               temp = CDList[i];
               CDList[i] = CDList[i + 1];
               CDList[i + 1] = temp;
           }
   }

   void SortTitle()
   {
       CD temp = new CD(" ", " ");
       for(int i = numOfCDs; i > 0; i--)
       {
           int x = 0;
           for(int j = 1; j <= i; j++)
           {
               if(CDList[i].getTitle().compareTo(CDList[i + 1].getTitle()) < 0)
                   x = j;
           }
           temp = CDList[x];
           CDList[x] = CDList[i];
           CDList[i] = temp;
       }
   }

   void Display()
   {
      for(int i = 0; i <= numOfCDs; i++)
      {
          while(CDList[i] == null)
              i++;
          CDList[i].display();
      }
   }

   int size()
   {
       return numOfCDs;
   }
}
4

5 回答 5

4
if(CDList[i].getArtist().equals(artist) == true)

如果您获得 NPE,以下是可能性:

  1. CDList一片空白
  2. CDList[i]一片空白
  3. CDLIst[i].getArtist()返回空
  4. Artist覆盖equals()并具有导致 NPE 的错误,但在这种情况下,NPE 将指向equals().

您没有显示该类Artist,因此我们可以查看它是否会覆盖equals(),并且还没有发布堆栈跟踪,因此我们可以确切地看到抛出异常的位置。

正如其他人评论的那样,这== true是多余的。

于 2013-03-12T03:01:30.610 回答
0

这里有很多问题。

您的 NPE 的直接原因是内部循环通过将 CD 分配给 来从列表中“删除”CD null,然后外部循环尝试在您刚刚删除的位置测试 CD。既然是null,那么您将尝试调用null.getArtist()哪些 NPE。

首先要注意的是,您只需要一个循环。循环体应该测试您正在查看的 CD 是否具有相同的标题和艺术家...

接下来要注意的是,摆脱额外的循环是不够的。如果delete()多次调用该方法,则第二次调用可能会遇到null第一次调用产生的条目......并且您将像以前一样获得 NPE。null测试应在尝试获取标题/艺术家信息之前检查 a ;例如

CD cd = cdList[i];
if (cd != null && 
    cd.getArtist().equals(artist) &&
    cd.getTitle().equals(title)) {
    // ...
}

在这一点上,一个设计问题变得明显。null数组中的这些值是个坏主意。有三个修复:

  • 您可以通过创建一个小一个元素的新数组来删除 CD... 并复制到所有 CD 上,除了您要删除的那张。

  • 您可以添加一个cdListSize字段,并安排它为您提供列表中有效条目的数量。然后(这是重要的一点),当您从列表中删除一个条目时,将当前最后一个条目移动到已删除条目所在的位置并减少cdListSize. 如果您始终如一地这样做,null条目将全部位于末尾,您可以从零迭代cdListSize - 1以获取非空条目。

  • 最重要的是,使用 aList而不是数组来表示 CD 列表。API 提供了一种在给定位置删除条目的List方法。该方法确实将其删除...它不只是将其设置为null.

最后,您可能需要退后一步,看看更大的应用程序。是否应该保留 CD 列表?例如,当您的应用程序重新启动时它仍然可用?它可能很大吗?例如太大而无法放入内存?您可能想要对 CD 列表进行复杂的查询吗?所有这些都表明您应该使用数据库而不是内存数据结构。

(但是,对于您刚刚添加的额外代码,很明显这超出了您的分配范围。)

于 2013-03-12T03:38:45.107 回答
0

我建议使用LinkedList<CD>orArrayList<CD>代替CD[].

这将允许您轻松删除项目,如下所示:

LinkedList<CD> cdList = new LinkedList<CD>();
// add items with cdList.add(...);
Iterator<CD> cdListIterator = cdList.iterator();

// Loop while the list still contains elements.
while (cdListIterator.hasNext()) {
    CD thisCd = iterator.next();
    // do some operation on the cd to tell whether you want to delete it
    // for example:
    if (thisCd.getArtist().equals(artist) && thisCd.getTitle().equals(title)) {
        iterator.remove(); // it's that simple
        // Don't have to mess with `cdCount--` or anything.
    }
}

而且,正如一些人所评论的,您不需要a.equals(b) == true; 你可以使用a.equals(b).

于 2013-03-12T03:01:46.083 回答
0

if 条件没有任何问题。它是你的循环有问题。使用单个 for 循环:

for(int i = 0; i <= numOfCDs; i++)
{
   if(CDList[i].getArtist().equals(artist) && CDList[i].getTitle().equals(title))
   {
       System.out.println("Found CD: " + CDList[j].getArtist() + " " + CDList[j].getTitle());
       System.out.println("Would you like to delete it? Y/1 N/0 ");
       if(input.nextInt() == 1)
            {
               CDList[i] = null;
               // do not do numOfCDs-- here
            }
   }
}
于 2013-03-12T03:05:16.803 回答
0

找到了!谢谢你们的评论,我确实做了一些你们会推荐的改变。问题在于 CDList[i] 为空。刚刚实现了一个 if(CDList[i] == null) 然后继续;谢谢你的意见。——</p>

于 2013-03-12T14:48:56.073 回答