String.format使用exception.getMessage()作为格式

时间:2011-08-10 19:27:15

标签: java string exception-handling formatter

我在JAVA中有一个与String.format相关的问题。 我的HibernateDao类负责持久化实体,如果我有任何约束违规,将抛出异常。该消息包含一个%s,将用作上层的格式,因为我应该担心该层中的类型,因此无法识别我不能持久存在的对象。

public Entity persistEntity(Entity entity) {
    if (entity == null || StringUtils.isBlank(entity.getId()))
        throw new InternalError(CANNOT_INSERT_NULL_ENTITY);

    try {
        getHibernateTemplate().save(entity);
    } catch (DataAccessException e) {
        if (e.getCause() instanceof ConstraintViolationException)
            throw new HibernateDaoException("%s could not be persisted. Constraint violation.");
        throw new HibernateDaoException(e);
    }

    return entity;
}

然后在我的DaoHelper类中,我将捕获此异常并使用格式化消息抛出一个新异常。

//Correct Code
public Entity create(Entity object) throws MyException {
    try {
        return this.hibernateDao.persistEntity(object);
    } catch (HibernateDaoException he) {
        String format = he.getMessage();
        throw new MyException(String.format(format,object.getClass().getSimpleName()));
    }
}

我的问题是,为什么我不能直接在我的String.format方法中调用he.getMessage()?并且必须使用'tmp'变量...它只是不会替换字符串中的%s。

//What I wished to do, but I cant.
public Entity create(Entity object) throws MyException {
    try {
        return this.hibernateDao.persistEntity(object);
    } catch (HibernateDaoException he) {
        throw new MyException(String.format(he.getMessage(),object.getClass().getSimpleName()));
    }
}
提前谢谢。

1 个答案:

答案 0 :(得分:0)

应该关闭它,因为预期的行为是有效的。正如@Kal和@highlycaffeinated所评论的那样,直接调用getMessage()确实有效,我的构建必定会发生一些事情并且没有正确更新。但是现在消息确实正确显示。 感谢您的快速解答:)