面对这种情况 - 在main方法中,调用一个子方法来检查对象,并在此子方法中抛出异常(列表中的一个对象为NULL)。但主要方法的代码仍在继续执行! 示例代码:
@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,如果是,那么为什么在后端生成异常 - 以帮助开发过程?如何胜任处理? 请告诉我。 提前谢谢。
答案 0 :(得分:2)
当您不重新抛出Java运行时认为已处理的Exception
时,您捕获 Exception
(s)。如果您希望程序执行停止,则需要Exception
(s)传播给调用者。例如,在checkAddress
更改
} catch(Exception e) {
e.printStackTrace();
}
类似
} catch(Exception e) {
e.printStackTrace();
throw e; // <-- re-throw the Exception
}
或只需完全删除try
和catch
,然后Exception
会自动抛给调用方。此外,在Java 8+中,您可以使用Stream
。像,
public void checkAddress(List<Address> addresses) throws Exception {
if (addresses == null) {
StackTraceElement[] ste = Thread.currentThread().getStackTrace();
throw new Exception(ste[2].getClassName() + "."
+ ste[2].getMethodName() + "." + ste[1].getMethodName()
+ ": Invalid parameter: list is null");
}
if (addresses.stream().anyMatch(a -> a == null)) {
StackTraceElement[] ste = Thread.currentThread().getStackTrace();
throw new Exception(ste[2].getClassName() + "."
+ ste[2].getMethodName() + "." + ste[1].getMethodName()
+ ": Invalid list item: object is null");
}
}
答案 1 :(得分:1)
e.printStackTrace();
此行禁止异常,导致代码继续而不是失败。它会打印堆栈跟踪,这可能会使它看起来像抛出的异常,但它没有比那条线更远。
你几乎从不想使用printStackTrace()
,你应该正确处理你想要的异常,或者只是让异常传播给你方法的调用者。
答案 2 :(得分:1)
您需要从try
方法中移除catch
.. checkAddress()
块。这样,从checkAddress()
内部抛出的任何异常都会传播给它的调用者。
在addCompany()
方法中,在checkAddress()
.. try
内调用catch
方法并在那里处理异常。
当checkAddress()
抛出异常时,代码执行将跳转到catch块。
答案 3 :(得分:0)
试试这个:
public void checkAddress(List<Address> addresses) throws Exception{
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");
}
}
关于线程的所有内容是什么?疯狂的代码。
首先不允许任何人将空实例添加到List中。
我可能这样写:
public void checkAddresses(List<Address> addresses) {
if (addresses == null) throw new IllegalArgumentException("Address List cannot be null");
for (Address a : addresses) {
if (a == null) throw new IllegalArgumentException("Address cannot be null");
}
}