gpt4 book ai didi

java - 不能在子类的构造函数中抛出异常

转载 作者:行者123 更新时间:2023-12-02 15:49:52 25 4
gpt4 key购买 nike

我创建了 3 个类:品牌类 (Marca)、商业品牌类 (MarcaCommercial)(它是品牌类的子类)和异常类 (ExMarcaInvalida)(如果在品牌构造函数中启动的属性之一为空)。我想在我的子类构造函数中捕获此异常并声明它并在捕获此异常时使用 setter 方法。但是,我不能这样做,因为我无法在第一行以外的任何地方启动父类(super class)的值。有没有办法捕捉异常并做我想做的事?将所有 3 个类构造函数留在下面。

public Marca(String nome, String produtor, String regiao) 
throws ExMarcaInvalida {
this.nome = nome;
this.produtor = produtor;
this.regiao = regiao;
if(nome.isEmpty() || nome.isBlank()){
throw new ExMarcaInvalida("Nome invalido");
}
}
public MarcaComercial(String rotulo, String email, 
String num, String nome,String produtor, String regiao)
throws ExMarcaInvalida {
try{
super(nome, produtor, regiao); //ISSUE HERE
this.rotulo = rotulo;
this.email = email;
this.num = num;
}
catch(ExMarcaInvalida e){
setRotulo("Marca Branca");
throw new ExMarcaInvalida("Marca Invalida");
}
}

public class ExMarcaInvalida extends Exception{
public ExMarcaInvalida(String msg){
super(msg);
}
}

最佳答案

Can't throw exception in constructor of subclass

问题不在于您不能抛出异常。

真正的问题是您无法捕获在构造函数的super 调用中抛出的异常...在构造函数本身中。 super 调用必须是构造函数的第一条语句,这意味着它不能在 try ... catch 中。

如果确实需要捕获异常,需要使用工厂方法创建对象;例如

public MarcaComercial makeMarcaComercial(...) {
try {
return new MarcaComercial(...);
} catch (ExMarcaInvalida ex) {
// This will catch the exception whether it is thrown by
// the Marca constrictor or the MarcaComercial constructor
//
// Now we can throw a new exception or return a different object.
}
}

但即使使用工厂方法,您也无法“修复”并返回您创建的原始对象。工厂方法无法访问该对象。

基本上,Java 会阻止您返回父类(super class)初始化失败的实例。这将是一个 splinter 的抽象,即使它的修复是有意义的。子类需要了解父类(super class)实现的私有(private)细节。无论如何...Java 不允许。


(实际上,我能想到一些可怕的方法来颠覆这个......但我不会描述它们以防有人认为它们可能是个好主意。)

关于java - 不能在子类的构造函数中抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72891279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com