2017-07-04 58 views
-2

我剛剛開始學習Java,在編寫/試驗一個簡單的程序時遇到了一些問題。Getter返回'0'值;沒有傳遞對象?

這是從類VDC調用getter,getDateDifference()的方法iM。

public static void iM() { 

    VDC answer = new VDC(); 
    long theAnswer = answer.getDateDifference(); 
    System.out.println(theAnswer); 

    } 

打印出一個零。

這是VDC類。

public class VDC { 



public static long dateDifference; 

    public static void main(String[] args) { 
     VDC.dateDifference(); 
     System.out.println(dateDifference); 
    } 

    public static void dateDifference() throws ParseException{ 

     String pattern = "dd/MM/yyyy/HH/mm"; 
     SimpleDateFormat format = new SimpleDateFormat(pattern); 
     Date startDate = format.parse("22/06/2017/15/00"); 
     System.out.println("Start Date: " + startDate); 

     Date dNow = new Date(); 
     System.out.println("Current date is: " + dNow); 
     long diff = dNow.getTime() - startDate.getTime(); 
     dateDifference = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS); 
    } 

    public long getDateDifference() { 
     return dateDifference; 
    } 

    public void setDateDifference(long dateDifference) { 
     VDC.dateDifference = dateDifference; 
    } 
} 

我相當肯定,我寫setter和正確吸氣劑,並在Eclipse中運行VDC.java給我dateDifference的正確值。但是,如果我嘗試運行寫入iM方法的類,則dateDifference返回值0.

在Google搜索太久後,我認爲我的問題可能是實例dateDifference未設置爲傳遞的來自類VDC的dateDifference(對不起,如果我混淆了任何人)。

我試圖將我在其他SOF問題中發現的應用程序應用於我的程序,但是我發現我無法這樣做。我如何確保getDateDifference()在另一個類中返回正確的值(而不是0)?

(我很抱歉,如果這是一個壞的問題,我只是我無法申請我找到了解決我的問題)

+4

在你調用'iM()'方法中的getter之前,你在哪裏調用setter?如果你從不設定日期差異,你會如何期望它不是0值? –

+1

只是一個提示 - 有一個字段和一個同名的方法只能導致可怕的混淆。也許'calculateDateDifference'會是這個方法的一個更好的名字。 –

+0

@HovercraftFullOfEels感謝您的幫助。只是爲了澄清,是因爲我正在創建一個dateDifference變量的新實例,而不是實際使用VDC.java中的dateDifference變量,我得到0而不是正確的值? – mattimias

回答

2

dateDifference是靜態方法dateDifference()初始化靜態變量。

您從來不會在iM()方法中調用該方法,因此它不會被初始化。

在另一方面,當你運行VDC類的main,你叫VDC.dateDifference()它初始化變量。

也就是說,擁有返回/修改靜態變量的實例getter/setter方法是一個壞主意。或者使getDateDifference()setDateDifference()爲靜態方法,或使dateDifference爲非靜態變量。

這裏是一個可能的實現,可以使感:

public static void iM() { 
    VDC answer = new VDC(); 
    answer.computeDateDifference(); // initialize the instance variable 
    long theAnswer = answer.setDateDifference(); // get its value 
    System.out.println(theAnswer); 
} 

public class VDC { 

    private long dateDifference; 

    public void computeDateDifference() throws ParseException { 

     String pattern = "dd/MM/yyyy/HH/mm"; 
     SimpleDateFormat format = new SimpleDateFormat(pattern); 
     Date startDate = format.parse("22/06/2017/15/00"); 
     System.out.println("Start Date: " + startDate); 

     Date dNow = new Date(); 
     System.out.println("Current date is: " + dNow); 
     long diff = dNow.getTime() - startDate.getTime(); 
     this.dateDifference = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS); 
    } 

    public long getDateDifference() { 
     return dateDifference; 
    } 

    public void setDateDifference(long dateDifference) { 
     this.dateDifference = dateDifference; 
    } 
} 
0

你永遠不調用既不setDateDifference也不dateDifference。 所以,你需要改變你的iM

public static void iM() { 
    try { 
     VDC.dateDifference(); 
     long theAnswer = answer.getDateDifference(); 
     System.out.println(theAnswer); 
    catch (ParseException e) { 
     ... 
    } 
} 

因爲你的方法是靜態的,你不需要創建VDC一個實例。