【发布时间】:2017-08-20 00:30:53
【问题描述】:
遇到这种情况——在main方法中,调用了一个子方法,它检查对象,在这个子方法中抛出异常(列表中的对象之一为NULL)。但是main方法的代码还是继续执行! 示例代码:
@Transactional
public boolean addCompany(List<Company> companies, List<Address> addresses) throws Exception{
checkAddress(addresses);
try{
for(int i = 0; i < companies.size(); i++){
if(findCompany(companies.get(i).getId()) == null && !isExistsCompany(companies.get(i))){
companies.get(i).setAddress(addresses.get(i));
this.em.persist(companies.get(i));
}
}
}catch(Exception e){
return false;
}
return true;
}
public void checkAddress(List<Address> addresses) throws Exception{
try{
if(addresses == null)
throw new Exception(Thread.currentThread().getStackTrace()[2].getClassName() + "." + Thread.currentThread().getStackTrace()[2].getMethodName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName() + ": Invalid parameter: list is null");
for(Address a : addresses)
if(a == null)
throw new Exception(Thread.currentThread().getStackTrace()[2].getClassName() + "." + Thread.currentThread().getStackTrace()[2].getMethodName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName() + ": Invalid list item: object is null");
}catch(Exception e){
e.printStackTrace();
}
}
在这方面,出现了几个问题: - 为什么代码不会停止? - 作为一种选择,现在是否有必要通过将 checkAddress 方法的类型从 void 更改为 boolean 并在 main 方法中处理 true/false 来摆脱这种情况? - 如何在前端正确处理此类错误 - 文本是否向前端发送异常或仅处理代码 500,如果是,那么为什么在后端生成异常 - 以帮助开发过程?如何胜任处理? 请指教。 提前致谢。
【问题讨论】:
-
我知道你说这是示例代码,但我觉得有必要指出整个
getStackTrace()[n]的东西是个坏主意,不仅是出于可读性和性能原因,还因为允许 JVM 删除堆栈帧。更好的做法是将类名和方法名作为字符串参数传递,例如certain Logger methods do。 -
如果没有getStackTrace(),我怎么能得到当前类和方法的名字传给Logger呢?
-
checkAddress 不应尝试获取该信息。调用者应该将它们作为参数传递。就像我链接的 Logger 方法一样。