【问题标题】:How to change a parameter if a class exception is thrown in a subclass java如果子类java中抛出类异常,如何更改参数
【发布时间】: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


【解决方案1】:

您可以在CommercialBrand 构造函数中对super() 的调用中使用三元运算符。

public CommercialBrand(String name, String producer, String region) throws Exception {
    super((name == null || name.equals("") ? "WhiteBrand" : name), producer, region);
}

【讨论】:

  • 如果 OP 不想重复名称检查,可以将其移至基类中的单独方法,该方法将检查名称有效性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 2018-07-08
相关资源
最近更新 更多