2017-05-17 53 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);