gpt4 book ai didi

java - 抛出异常 - 并且代码进一步执行

转载 作者:行者123 更新时间:2023-12-01 17:55:00 24 4
gpt4 key购买 nike

遇到这样的情况 - 在 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,如果是这样,那么为什么在后端生成异常 - 以帮助开发过程?如何妥善应对?请指教。提前致谢。

最佳答案

您正在捕获异常,当您不重新抛出异常时,Java 运行时会认为它已被处理。如果您希望程序执行停止,那么您需要将异常传播给调用者。例如,在 checkAddress 中更改

} catch(Exception e) {
e.printStackTrace();
}

类似于

} catch(Exception e) {
e.printStackTrace();
throw e; // <-- re-throw the Exception
}

或者只需完全删除trycatch,然后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");
}
}

关于java - 抛出异常 - 并且代码进一步执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45777441/

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