2015-11-26 48 views
3

我正在嘗試製作一個TravelCard類,該類還應檢查該卡是否仍然可用(未過期)。但我有這個錯誤如何在構造函數中設置到期日期?

未報告的異常ParseExeption;必須捕獲或宣佈該行

this.expirationDate = sdf.parse(expiry); 

如何設置在構造函數中的到期日被拋出

我從來沒有使用過日期,因爲有人可能會注意到。而且我在Java中是相當新的。

package something; 

import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 

public class TravelCard { 
    private double balance; 
    private SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 
    private Date expirationDate; 
    private Date today = Calendar.getInstance().getTime(); 

    public TravelCard(double balance, String expiry){ 
     sdf.setLenient(false); 
     this.balance = balance; 
     this.expirationDate = sdf.parse(expiry); 
    } 

    public void pay(double price){ 
     if (today.before(expirationDate)){ 
      if(this.balance >= price){ 
       this.balance -= price; 
      } 
      else { 
       System.out.println("Insufficient funds"); 
      } 
     } 
     else { 
      System.out.println("Card expired"); 
     } 
    } 

    public double getBalance(){ 
     return balance; 
    } 

} 
+0

'ParseException'是一個檢查異常。請閱讀[例外教程](https://docs.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html),並決定是否要抓住或拋出它。 – RealSkeptic

回答

1

這意味着,parse()方法拋出檢查異常,任一catch異常或throw

方式來捕獲異常:

public void TravelCard(double balance, String expiry){ 
     sdf.setLenient(false); 
     this.balance = balance; 
     try { 
      this.expirationDate = sdf.parse(expiry); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
    } 

方式拋出異常:

public void TravelCard(double balance, String expiry) throws ParseException{ 
0

編譯器是想告訴你,sdf.parse(expiry)可能會失敗。由於此方法(parse)顯式爲throws類型爲ParseException的例外,您必須將其置於try{..}catch(..){..}塊中或將throws聲明添加到構造函數中。

+0

好的,謝謝我的工作。你認爲哪種方法更聰明:嘗試捕捉或添加拋出聲明? – Dope

+0

通常取決於...如果要傳輸錯誤並向上遊採取糾正措施,請使用拋出。如果你真的可以糾正錯誤,請使用try/catch。在這種情況下,我會拋出它,並且在實例化此類型時使用try catch塊。 –

1

最好有一個構造函數接受Date參數(expirationDate)而不是String參數(expiry)。在調用TravelCard構造函數之前先解析String。如果無法解析到期字符串,則無法創建具有有效到期日期的TravelCard對象。

public class TravelCard { 
    private double balance; 
    private final Date expirationDate; 
    private final Date today = Calendar.getInstance().getTime(); 

    public TravelCard(final double balance, final Date expirationDate) { 
     this.balance = balance; 
     this.expirationDate = expirationDate; 
    } 

    // parsing the expiry String and then calling the constructor 
    public static TravelCard createTravelCard(final double balance, final String expiry) throws ParseException { 
     SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 
     sdf.setLenient(false); 
     Date expirationDate = sdf.parse(expiry) 
     return new TravelCard(balance, expiry); 
    } 

    // examples 
    TravelCard.createTravelCard(20.0, "26/11/2016"); // TravelCard created 
    TravelCard.createTravelCard(20.0, "36/11/2016"); // throws ParseException