Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在构造函数中设置过期日期?_Java - Fatal编程技术网

Java 如何在构造函数中设置过期日期?

Java 如何在构造函数中设置过期日期?,java,Java,我正在尝试创建一个TravelCard类,该类还应该检查该卡是否仍然有效(未过期)。但我有这个错误 未报告的异常ParseException;必须被抓住或宣布被抛出 在这一行 this.expirationDate = sdf.parse(expiry); 如何在构造函数中设置过期日期 有人可能会注意到,我以前从未使用过日期。而且我对Java还相当陌生 package something; import java.text.SimpleDateFormat; import java.util

我正在尝试创建一个TravelCard类,该类还应该检查该卡是否仍然有效(未过期)。但我有这个错误

未报告的异常ParseException;必须被抓住或宣布被抛出

在这一行

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;
    }

}
这意味着,
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{
引发异常的方法:

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{

编译器试图告诉您,
sdf.parse(expiry)
可能会失败。
因为此方法(
parse
)显式地创建类型为
ParseException
的异常必须将其放置在块中或将声明添加到构造函数中。

最好让构造函数接受日期参数(expirationDate)而不是字符串参数(Expiration)。并在调用TravelCard构造函数之前解析字符串。如果无法解析过期字符串,则无法创建具有有效过期日期的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 

ParseException
是选中的异常。请阅读这篇文章,然后决定你是想抓住它还是扔掉它。好的,谢谢,我让它工作了。您认为哪种方式更明智:尝试catch或添加throws声明?通常这取决于。。。如果要将错误转移到上游并采取纠正措施,请使用throws。如果确实可以纠正错误,请使用try/catch。在本例中,我将抛出它,并在实例化此类型时使用try-catch块。