gpt4 book ai didi

java - 避免在每一行 try catch 的聪明方法

转载 作者:行者123 更新时间:2023-11-29 07:12:44 32 4
gpt4 key购买 nike

我目前正在处理 XML 文件,并且正在寻找一种更好的方法来很好地避免 try/catch block 。

事情是这样的。假设我有一个 XML 文件。

<A>
<BB>37</BB>
<CC>
<DDD>1</DDD>
</CC>
</A>

其实我把this变成一个对象,也就是说我可以做myXml.getA() 等等。

在我的代码中,我在这个对象中搜索了很多给定的元素,这意味着我有很多像

这样的行
int ddd = myXml.getA().getCC().getDDD();

问题是有些元素可能不存在,例如另一个 XML 元素可能只是这样:

<A'>
<BB'>37</BB'>
</A'>

因此,如果我尝试获取 ddd,getCC() 会引发一个 NullPointerException

最后,我最终是这样编码的:

int ddd;
try{
ddd = myXml.getA().getCC().getDDD();
}
catch (NullPointerException e){
ddd = 0;
}

这行得通,但代码变得非常难看。我正在寻找一种解决方案来拥有类似的东西

int ddd = setInt(myXml.getA().getCC().getDDD(), 0);

0 是默认值,以防方法引发异常。

有什么好的方法吗?

到目前为止,我找不到不引发错误的解决方案。

感谢您的帮助!

编辑: 只是不要获得与 XML 相关的答案。我展示了 xml 部分供大家理解问题。在我的代码中,我无法访问 XML,只能访问表示它的对象。

简而言之,我真正喜欢的是某种 isNull 方法来测试我的 getter。

最佳答案

这是使用 jaxb 的一种烦恼。在我的公司,我们对 jaxb 做了足够的工作,值得编写一个 xjc 插件,它生成每个 getter 的“安全”版本,保证为任何非平凡值返回非空值(在子对象并不真正存在)。

这是我们生成的模型实体的示例:

public class ExampleUser implements Serializable {
private final static long serialVersionUID = 20090127L;
@XmlAttribute
protected String name;
@XmlAttribute
protected String email;
public final static ExampleUser EMPTY_INSTANCE = new ExampleUser() {
private static final long serialVersionUID = 0L;
@Override
public void setName(java.lang.String value) { throw new UnsupportedOperationException(); }
@Override
public void setEmail(java.lang.String value) { throw new UnsupportedOperationException(); }
};

public String getName() {
return name;
}

public void setName(String value) {
this.name = value;
}

public String getEmail() {
return email;
}

public void setEmail(String value) {
this.email = value;
}
}

public class ExampleAccount implements Serializable {
private final static long serialVersionUID = 20090127L;
protected ExampleUser user;
@XmlElement(name = "alias")
protected List<String> aliases;
@XmlAttribute
protected String id;
@XmlAttribute
protected String name;
public final static ExampleAccount EMPTY_INSTANCE = new ExampleAccount() {
private static final long serialVersionUID = 0L;
@Override
public void setUser(com.boomi.platform.api.ExampleUser value) { throw new UnsupportedOperationException(); }
@Override
public List<String> getAliases() { return java.util.Collections.emptyList(); }
@Override
public void setId(java.lang.String value) { throw new UnsupportedOperationException(); }
@Override
public void setName(java.lang.String value) { throw new UnsupportedOperationException(); }
};

public ExampleUser getUser() {
return user;
}

public void setUser(ExampleUser value) {
this.user = value;
}

public List<String> getAliases() {
if (aliases == null) {
aliases = new ArrayList<String>();
}
return this.aliases;
}

public String getId() {
return id;
}

public void setId(String value) {
this.id = value;
}

public String getName() {
return name;
}

public void setName(String value) {
this.name = value;
}

public ExampleUser safeGetUser() {
return (getUser() != null) ? getUser() : ExampleUser.EMPTY_INSTANCE;
}
}

因此您可以编写这段代码而不用担心 NPE:

userEmail = account.safeGetUser().getEmail();

关于java - 避免在每一行 try catch 的聪明方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12319068/

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