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

时间:2017-08-20 00:30:54

标签: java exception

面对这种情况 - 在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,如果是,那么为什么在后端生成异常 - 以帮助开发过程?如何胜任处理? 请告诉我。 提前谢谢。

4 个答案:

答案 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
}

只需完全删除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");
    }
}

答案 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");
    }
}