Java 如何引发EmptyResultDataAccessException?

Java 如何引发EmptyResultDataAccessException?,java,database,spring,exception,jdbc,Java,Database,Spring,Exception,Jdbc,我的DAO实现中有以下方法: @Override public String getResultEntry(String arg1, String key, String date) throws SQLException, IOException { String res = ""; String sql = buildSQL(arg1, key, date); MapSqlParameterSource namedParameters = new MapSqlPar

我的DAO实现中有以下方法:

@Override
public String getResultEntry(String arg1, String key, String date) throws SQLException, IOException {
    String res = "";
    String sql = buildSQL(arg1, key, date);

    MapSqlParameterSource namedParameters = new MapSqlParameterSource();
    namedParameters.addValue("arg1", arg1);
    namedParameters.addValue("id", key);
    namedParameters.addValue("date", date);

    try {
        logger.info("getResultEntry is about to execute the following query:[" + sql + "]");

        Blob blob = namedParameterJdbcTemplate.queryForObject(sql, namedParameters, Blob.class);
        long blobLength = blob.length();
        byte[] bytes = blob.getBytes(1, (int)blobLength);

        logger.info("getResultEntry END");

        res = convertBytesToString(bytes);

    } catch (EmptyResultDataAccessException erdae) {
        logger.error("getResultEntry failed to execute the query due to exception! Return an empty string ", erdae);
        logger.info("getResultEntry END");

        res = "";
    }
    return res;

}
有时查询返回空结果,并抛出
EmptyResultDataAccessException
。我正在捕获它并返回一个空字符串。但是,我一直看到异常,之后执行被终止

例外情况:

org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
at org.springframework.dao.support.DataAccessUtils.requiredSingleResult(DataAccessUtils.java:71)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:179)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:191)
at com.ars.linking.mrretriever.dao.MRRetrieverDAOImpl.getResultEntry(MRRetrieverDAOImpl.java:82)
at com.ars.linking.mrretriever.exec.MRRetriver.processResults(MRRetriver.java:125)
at com.ars.linking.mrretriever.exec.MRRetriver.main(MRRetriver.java:81)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
logger.error("getResultEntry failed to execute the query due to exception! Return an empty string ", erdae);

我应该如何“正确”处理异常?(我不想重新引用它,只是吞下它并返回一个空字符串)

您正在显式地记录异常:

org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
at org.springframework.dao.support.DataAccessUtils.requiredSingleResult(DataAccessUtils.java:71)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:179)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:191)
at com.ars.linking.mrretriever.dao.MRRetrieverDAOImpl.getResultEntry(MRRetrieverDAOImpl.java:82)
at com.ars.linking.mrretriever.exec.MRRetriver.processResults(MRRetriver.java:125)
at com.ars.linking.mrretriever.exec.MRRetriver.main(MRRetriver.java:81)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
logger.error("getResultEntry failed to execute the query due to exception! Return an empty string ", erdae);
如果不想在日志中看到stacktrace,请删除第二个参数。最好删除整行,因为这不是错误,而且您已经有了
info
log条目


此异常不会终止代码的执行。查找终止原因,它位于别处,可能与返回的空字符串有关,也可能与返回的空字符串无关。

如果我没有错,您当前也在这样做,不是吗?您已捕获该异常,并且不允许它到达上一层。您还想实现什么?如果不想打印它,只需删除堆栈跟踪。我看到异常以某种方式潜入并终止流。我无法理解它是如何发生的(我接受了它)。记录异常不应终止执行。@BorisTreukhov aviad对我的回答的早期版本进行了评论,该版本没有解释他观察到的行为,即执行终止。@MarkoTopolnik,好的,太好了)