【发布时间】:2020-10-06 10:10:21
【问题描述】:
这确实是一个奇怪的问题,但我真的想不出更好的方法来问这个问题。 我创建了一个名为 Brand 的类,当名称为 null 或为空时抛出无效名称异常,就像这样(仅构造函数):
public Brand(String name, String producer, String region) throws ExInvalidBrand {
if (name == null || name.equals("")) {
throw new ExInvalidBrand("Brand name cannot be empty or null!");
}
this.name = name;
this.producer = producer;
this.region = region;
}
现在我需要从中创建一个子类,它应该抛出相同的异常,但在抛出时,必须将其名称更改为“White Brand”。 子类的构造函数是:
public CommercialBrand(String name, String producer, String region) throws ExInvalidBrand{
super(name, producer, region);
}
正如我所看到的,我需要使用 super 关键字,所以我实际上继承了它们的变量。 当名称为空时,子类按预期抛出异常。
我知道的唯一方法是在主类中创建一个不要求名称的新构造函数,然后在子类中调用该构造函数,同时创建一个新的私有变量名称并尝试/捕获其中的异常。
可以用我现在的构造函数来完成吗?
这是一个非常奇怪的问题,我很乐意澄清任何关于此的问题。
编辑:我注意到我可能没有很好地解释自己。
想象一下我们有这个 psvm:
public static void main(String[] args) throws ExInvalidBrand {
Brand br = new Brand("brand1", "producer1", "region1"); //here an object is created with the name = brand1, producer = producer1 and region = region1
CommercialBrand cb = new CommercialBrand("brand1", "producer1" , "region1"); // same as above, but now from the subclass.
CommercialBrand cbWithNoName = CommercialBrand("", "producer1", "region1");
}
这就是我想要的。发生这种情况时,仍应创建对象 cbWithNoName,并在抛出异常时将其命名为“White Brand”。 在 super 之前的 try/catch 会很棒,像这样,如果这是可能的,那不是,据我所知。
public MarcaComercial(String name, String producer, String region) throws ExInvalidBrand{
try {
super(name, producer, region);
} catch (ExMarcaInvalida ex) {
super("WhiteBrand", producer, region);
}
}
【问题讨论】:
-
您到底想改变什么?异常文本?
-
在 Brand 类的构造函数中也使用名称而不是品牌属性
-
所以您想将
super(...)调用包装在try 块中?如果是这种情况,请参阅Why can't I use a try block around my super call? -
我要更改的是子类获得的名称。基本上,如果没有抛出异常,我想保持参数中的名称,但如果它确实抛出异常,我想让它成为“白色品牌”。对 super 的尝试是我的第一个想法,但据我所知,super 必须是构造函数获得的第一件事(编辑是一个简单的更正)
标签: java oop inheritance