What is user defined or custom exception in java?
- User defined exceptions is concrete class extending exceptions like Exception, RuntimeException etc.
- Create an unchecked exception by extending RuntimeException class in java
- In our application, sometimes we would like to pass custom information to exception.
- User defined exceptions are used to handle application specific inputs.
- e.g. If we unable to find any user from database, we would like to pass input user id, while throwing exception. (refer UserNotFoundException in trailing code)..
- We will take an example to create unchecked or custom exception.
Program – create user defined or custom runtime exception.
1.) UserNotFoundException Class (Custom exception class)
- Create a custom runtime exception class extending RuntimeExcception class.
- UserNotFoundException is unchecked exception.
- We have overloaded different constructors to demonstrate custom exception class.
package org.learn.exception;
public class UserNotFoundException extends RuntimeException {
private static final long serialVersionUID = 13216733298798717L;
private final String userId;
public UserNotFoundException(String message, String userId) {
super(message);
this.userId = userId;
}
public UserNotFoundException(String message, Throwable error, String userId) {
super(message, error);
this.userId = userId;
}
public UserNotFoundException(Throwable e, String userId) {
super(e);
this.userId = userId;
}
public String getUserId() {
return userId;
}
}
2.) UserDao Class (throwing UserNotFoundException if user does not exists):
- UserDao class simulating database operations.
- We have created the hashmap simulate database, to store user objects.
- We will perform some CRUD operations with UserDao class.
- If we unable to find user in database, we will throw UserNotFoundException.
package org.learn.dao;
import org.learn.exception.UserNotFoundException;
import org.learn.model.User;
import java.util.HashMap;
import java.util.Map;
public class UserDao {
@SuppressWarnings("serial")
private Map<String, User> databaseUser = new HashMap<String, User>() {
{
put("1", new User("1", "Angelina", 35, "Cambodia", "Female"));
put("2", new User("2", "Brad", 46, "Shawnee", "Male"));
put("3", new User("3", " Jennifer", 41, "LA", "Female"));
put("4", new User("4", "Justin", 38, " Washington", "Male"));
put("5", new User("5", "Marcel ", 42, "Cambodia", "Male"));
}
};
public User getUserById(String id) {
if (!isUserExists(id)) {
throw new UserNotFoundException("User does not exists in database", id);
}
return databaseUser.get(id);
}
public User update(String id, User user) {
if (!isUserExists(id)) {
throw new UserNotFoundException("Update failed, User does not exist", id);
}
return databaseUser.put(id, user);
}
public User delete(String id) {
if (!isUserExists(id)) {
throw new UserNotFoundException("User does not exists in database", id);
}
return databaseUser.remove(id);
}
private boolean isUserExists(String id) {
return databaseUser.containsKey(id);
}
}
3.) User Class:
- User class representing the POJO of user.
package org.learn.model;
public class User {
private String id;
private String name;
private int age;
private String city;
private String gender;
public User() {
}
public User(String id, String name, int age, String city, String gender) {
this.id = id;
this.name = name;
this.age = age;
this.city = city;
this.gender = gender;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", city='" + city + '\'' +
", gender='" + gender + '\'' +
'}';
}
public String getId() {
return id;
}
}
4.) UserService Class (catching exceptions thrown by Dao):
- UserService class act as client of UserDao class, we are performing db operations in UserService class.
- We are catching the UserNotFoundException in-case user does not exist in database.
package org.learn.client;
import org.learn.dao.UserDao;
import org.learn.exception.UserNotFoundException;
import org.learn.model.User;
public class UserService {
public static void main(String[] args) {
UserDao userDao = new UserDao();
String id = "1";
// Get user by id 1
User user = userDao.getUserById(id);
System.out.printf("1. Got user with id %s is :%s\n", id, user);
System.out.printf("2. Delete user with id %s\n", id);
user = userDao.delete(id);
// Get user by id 1, which does not exist
try {
user = userDao.getUserById(id);
System.out.printf("3. Got user with id %s is :%s", id, user);
} catch (UserNotFoundException e) {
System.out.printf("3. Unable to get user, userId=%s, message:%s\n", e.getUserId(), e.getMessage());
}
// delete user by id 10, which does not exist
id = "20";
try {
user = userDao.delete(id);
System.out.printf("4. deleted user with id %s is :%s", id, user);
} catch (UserNotFoundException e) {
System.out.printf("4. Unable to delete user, userId=%s, message:%s\n", e.getUserId(), e.getMessage());
}
// delete user by id 10, which does not exist
id = "1";
try {
user = userDao.update(id, null);
System.out.printf("5. update user with id %s is :%s", id, user);
} catch (UserNotFoundException e) {
System.out.printf("5. Unable to update user, userId=%s, message:%s\n", e.getUserId(), e.getMessage());
}
}
}
Output: custom or user defined runtime exception
1. Got user with id 1 is :User{name='Angelina', age=35, city='Cambodia', gender='Female'}
2. Delete user with id 1
3. Unable to get user, userId=1, message:User does not exists in database
4. Unable to delete user, userId=20, message:User does not exists in database
5. Unable to update user, userId=1, message:Update failed, User does not exist