Java 没有抛出异常
Java Exception is not thrown
我写了一个用户注册服务,如果用户已经存在,它应该抛出一个异常。这是注册方法的代码:
public User register(User user, String role) throws UserExistsException{
boolean userExists = existUserInDB(user);
if(userExists) {
logger.info("Yes, this user exists!");
throw new UserExistsException("This user already exists in database!");
}
try {
String encryptedPassword = getEncryptedPassword(user.getPassword(), getSalt(user));
user.setPassword(encryptedPassword);
Role userRole;
if (role == null){
TypedQuery<Role> query = entityManager.createQuery(
"SELECT r "+
"FROM Role r "+
"WHERE rolename = 'User'", Role.class);
userRole = query.getSingleResult();
} else {
TypedQuery<Role> query = entityManager.createQuery(
"SELECT r "+
"FROM Role r "+
"WHERE rolename = '"+role+"'", Role.class);
userRole = query.getSingleResult();
}
user.getRoles().add(userRole);
userRole.getUsers().add(user);
entityManager.persist(userRole);
entityManager.persist(user);
} catch (NoSuchAlgorithmException | NoSuchProviderException e) {
logger.warning("CryptAPI faild: " + e.getMessage());
}
return user;
}
日志记录确认 existUserInDB 方法 returns 是正确的布尔值。给定的用户存在于数据库中。但是永远不会抛出异常。
我的应用程序中有很多自己实现的异常,它们都被正确抛出和捕获。除了这一个。有人可以帮我解决这个问题吗?
这是我调用注册方法的代码。
public String register() {
regUser.setEmail(this.emailAdd);
try {
userService.register(regUser, userRole);
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Der Benutzer wurde erfolgreich registriert.", null));
context.getExternalContext().getFlash().setKeepMessages(true);
} catch (UserExistsException e) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Der Benutzer ist bereits registriert!", null));
}
curSession.setCurrentUser(regUser);
init();
return "home.xhtml?faces-redirect=true";
}
这里是异常的 class 定义:
public class UserExistsException extends Exception {
private static final long serialVersionUID = -9218609941894034576L;
public UserExistsException(){
super();
}
public UserExistsException(String message){
super(message);
}
}
问题可能出在下面这行,它不会做你想要的正确事情。
catch (UserExistsException e) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Der Benutzer ist bereits registriert!", null));
}
你可以检查这里执行的代码是这样的:
catch (UserExistsException e) {
System.out.println(">>>>>>>>>>>>>>>>>>");
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Der Benutzer ist bereits registriert!", null));
}
如果打印出该行,则表示已抛出异常。但是其余的代码没有做你想做的事情。
在以上所有的帮助下,我能够解决它。问题不是抛出的异常。抱歉,标题不正确。问题是我在调用方法的 return 语句中的重定向。所以我的 FacesMessage 丢失了。我在 catch 子句中用以下几行修复了它:
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Der Benutzer existiert bereits.", null));
context.getExternalContext().getFlash().setKeepMessages(true);
感谢上面所有的人,指引我走上正确的道路。
我写了一个用户注册服务,如果用户已经存在,它应该抛出一个异常。这是注册方法的代码:
public User register(User user, String role) throws UserExistsException{
boolean userExists = existUserInDB(user);
if(userExists) {
logger.info("Yes, this user exists!");
throw new UserExistsException("This user already exists in database!");
}
try {
String encryptedPassword = getEncryptedPassword(user.getPassword(), getSalt(user));
user.setPassword(encryptedPassword);
Role userRole;
if (role == null){
TypedQuery<Role> query = entityManager.createQuery(
"SELECT r "+
"FROM Role r "+
"WHERE rolename = 'User'", Role.class);
userRole = query.getSingleResult();
} else {
TypedQuery<Role> query = entityManager.createQuery(
"SELECT r "+
"FROM Role r "+
"WHERE rolename = '"+role+"'", Role.class);
userRole = query.getSingleResult();
}
user.getRoles().add(userRole);
userRole.getUsers().add(user);
entityManager.persist(userRole);
entityManager.persist(user);
} catch (NoSuchAlgorithmException | NoSuchProviderException e) {
logger.warning("CryptAPI faild: " + e.getMessage());
}
return user;
}
日志记录确认 existUserInDB 方法 returns 是正确的布尔值。给定的用户存在于数据库中。但是永远不会抛出异常。 我的应用程序中有很多自己实现的异常,它们都被正确抛出和捕获。除了这一个。有人可以帮我解决这个问题吗?
这是我调用注册方法的代码。
public String register() {
regUser.setEmail(this.emailAdd);
try {
userService.register(regUser, userRole);
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Der Benutzer wurde erfolgreich registriert.", null));
context.getExternalContext().getFlash().setKeepMessages(true);
} catch (UserExistsException e) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Der Benutzer ist bereits registriert!", null));
}
curSession.setCurrentUser(regUser);
init();
return "home.xhtml?faces-redirect=true";
}
这里是异常的 class 定义:
public class UserExistsException extends Exception {
private static final long serialVersionUID = -9218609941894034576L;
public UserExistsException(){
super();
}
public UserExistsException(String message){
super(message);
}
}
问题可能出在下面这行,它不会做你想要的正确事情。
catch (UserExistsException e) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Der Benutzer ist bereits registriert!", null));
}
你可以检查这里执行的代码是这样的:
catch (UserExistsException e) {
System.out.println(">>>>>>>>>>>>>>>>>>");
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Der Benutzer ist bereits registriert!", null));
}
如果打印出该行,则表示已抛出异常。但是其余的代码没有做你想做的事情。
在以上所有的帮助下,我能够解决它。问题不是抛出的异常。抱歉,标题不正确。问题是我在调用方法的 return 语句中的重定向。所以我的 FacesMessage 丢失了。我在 catch 子句中用以下几行修复了它:
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Der Benutzer existiert bereits.", null));
context.getExternalContext().getFlash().setKeepMessages(true);
感谢上面所有的人,指引我走上正确的道路。