2017-05-17 52 views
-1

我有3个类,Movie这是用来将Movie对象添加到MovieDatabase但它保持打印空。Java对象数组打印null?

当我添加2 Movies它像第一个Movie被删除,它打印null而不是。还有一种方法来检查数组中的位置是否为空,如果它为空则不打印?

这里是我Movie

public class Movie { 

    private String name; 
    private String director; 
    private double fileSize;    
    private int duration; 
    private int moviecount; 

    public Movie() 
    { 
     name = null; 
     director = ""; 
     fileSize = 0; 
     duration = 0; 
    } 

    public void setName(String newName) 
    { 
     name = newName; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public void setDirector(String newDirector) 
    { 
     director = newDirector; 
    } 

    public String getDirector() 
    { 
     return director; 
    } 

    public void setfileSize(double newfileSize) 
    { 
     fileSize = newfileSize; 
    } 

    public double getfileSize() 
    { 
     return fileSize; 
    } 

    public void setDuration(int newDuration) 
    { 
     duration = newDuration; 
    } 

    public int getDuration() 
    { 
     return duration; 
    } 

,在这里我MovieDatabase类:

public class MovieDatabase 
{ 
    private Movie[] mov; 
    private int i; 
    public int count=0; 

    public MovieDatabase() 
    { 
     mov = new Movie[4]; 
     i=0; 
    } 

    public void addData(String name, String director, double fileSize, int duration) 
    { 
     for(int i=0; i<4; i++) 
     mov[i] = new Movie(); 
     setData(mov[i],name,director,fileSize,duration); 
     i++; 
     count++; 
    } 
    private void setData(Movie m,String name, String director, double fileSize, int duration) 
    { 
      mov[i].setName(name); 
      mov[i].setDirector(director); 
      mov[i].setfileSize(fileSize); 
      mov[i].setDuration(duration); 
    } 
    public void printNames() 
    { 
     for (int i = 0; i < mov.length; i++) 
     { 
     System.out.println(mov[i].getName()); 
     } 

    } 
} 





import java.util.*; 
public class Interface { 
Scanner console = new Scanner(System.in); 
MovieDatabase m = new MovieDatabase(); 
private void run() 
{ 

int option; 



    do{ 
     System.out.print("Add Movie(0), Delete Movie(2),Show Movies(3),Movie Count(4) \n"); 
     option = console.nextInt(); 

     switch(option) 
     { 
      case 0: addMovie(); 
        break; 

      case 3: printMovies(); 
        break; 



     } 
    }   

     while(option!=9); 

} 
public static void main(String[] args){ 
Interface intFace = new Interface(); 
intFace.run(); 
} 

public void addMovie() 
{ 
    String name, director; 
    double fileSize; 
    int duration; 

    System.out.println("Movie Name: "); 
    name = console.next(); 
    System.out.println("Movie Director: "); 
    director = console.next(); 
    System.out.println("Movie File Size: "); 
    fileSize = console.nextDouble(); 
    System.out.println("Movie Duration: "); 
    duration = console.nextInt(); 
    System.out.print("Movie Added!"); 


    m.addData(name,director,fileSize,duration); 
} 
public void printMovies() 
{ 
    m.printNames(); 
} 

} 

我试图只包括相关的部分,但什么,我已经做了迄今有关居多。

+0

您可以检查该数组包含一个'null',但你在初始化你的'addData'空'Movie'对象。你还将'Movie'传递给'setData',但是你根本没有使用传入的对象,你只是直接访问数组。退后一步,想想当你添加数据时你想要发生什么(你可能不想创建很多空对象)。 – Kayaman

+2

addData()和printNames()隐藏*'MovieDatabase'类中的字段'i''中的'for'循环中的局部变量'i'。字段'i'总是'0',所以对'setData()'的调用总是更新第一个'Movie'对象,而其他3则全部为空名称。 – Andreas

回答

2

的问题是在这些线路

.... 
public void addData(String name, String director, double fileSize, int duration) 
{ 
    for(int i=0; i<4; i++) 
    mov[i] = new Movie(); 
    ... 
每一次你添加新的数据,你将在阵列的每个元素赋予新的电影对象删除所有以前的记录

。这将清除以前的所有数据。

您应该改为在MovieDatabase构造函数中移动这两行。或者更好的选择是在设置数据时初始化它们。

... 
public void addData(String name, String director, double fileSize, int duration) 
{ 
    setData(mov[i],name,director,fileSize,duration); 
    i++; 
    count++; 
} 
private void setData(Movie m,String name, String director, double fileSize, int duration) 
{ 
     mov[i] = new Movie(); //++ edit 
     mov[i].setName(name); 
     mov[i].setDirector(director); 
     mov[i].setfileSize(fileSize); 
     mov[i].setDuration(duration); 
} 
... 

也就是有没有办法来检查,如果阵列中的位置是空的,如果它是空不打印?

您可以在Movie类中创建一个方法,该方法检查此影片对象是否为空并返回适当的结果。现在

public class Movie { 
    ... 
    ... 
    public boolean isEmpty() { 
     if(
      this.name.isEmpty() && 
      this.director && 
      this.fileSize == 0 && 
      this.duration == 0 && 
      this.moviecount == 0 
     ) 
      return true; 
     else 
      return false; 
    } 
    ... 
    ... 
} 

可以通过这个电影对象是否为空或不使用:

if(mov[i].isEmpty()) { 
    //empty movie object 
    ... 
} 
+0

可能不会将它们移到构造函数中。初始化空对象没有用处。 – Kayaman

+0

@RamanSahasi在System.out.println(mov [i])获取空指针异常。的getName()); –

+0

@SamHoward可能是因为你没有设置所有4个对象,但打印所有的对象。如果是这种情况,那么你可能想在你的构造函数中初始化它们。或者更好的方法是在你的'printNames()'方法中简单地使用if(mov [i]!= null)System.out.println(mov [i] .getName());来检查它是否为null 。 –

0

setData你总是设置mov[0]值。类成员i将永远不会改变(循环变量隐藏它)。您不使用参数m来设置数据。

更改您的setData

m.setName(name); 
m.setDirector(director); 
m.setfileSize(fileSize); 
m.setDuration(duration);