Tomcat выбрасывает исключение java.lang.IndexOutOfBoundsException - PullRequest
1 голос
/ 20 апреля 2019

Я запускаю простой веб-проект. В одном из моих сервлетов я получаю параметры пользователя из формы и запускаю метод getIf моего класса UserDao, который возвращает всех пользователей из базы данных, которые соответствуют некоторому условию.

Вот код кода getIf:

@Override
    public synchronized List<User> getIf(User user) {
        List<User> users = new ArrayList<>();

        users = getAll();

        int num = users.size();

        System.out.println(num);

        for (int i = 0; i < num; i++) {

            User potentialUser = users.get(i);

            boolean result = true;

            if (user.getUsername() != null && !user.getUsername().equals(potentialUser.getUsername())) {
                result = false;
            } else if (user.getPassword() != null && !user.getPassword().equals(potentialUser.getPassword())) {
                result = false;
            } else if (user.getFirstName() != null && !user.getFirstName().equals(potentialUser.getFirstName())) {
                result = false;
            } else if (user.getLastName() != null && !user.getLastName().equals(potentialUser.getLastName())) {
                result = false;
            } else if (user.getUserType() != null && !user.getUserType().equals(potentialUser.getUserType())) {
                result = false;
            } else if (user.getAge() != null && !user.getAge().equals(potentialUser.getAge())) {
                result = false;
            }

            if (!result) {
                users.remove(potentialUser);
            }

        }

        return users;
    }

Когда я запускаю этот сервлет, отправляя форму, я получаю эту ошибку:

 java.lang.IndexOutOfBoundsException: Index: 13, Size: 12
    at java.util.ArrayList.rangeCheck(ArrayList.java:657)
    at java.util.ArrayList.get(ArrayList.java:433)
    at com.model.databasePackage.implementations.UserDao.getIf(UserDao.java:205)
    at com.web.servlets.SearchServiceServlet.doPost(SearchServiceServlet.java:55)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

код сервлета, который обрабатывает запрос, выглядит следующим образом: пакет com.web.servlets;

import com.model.databasePackage.implementations.UserDao;
import com.model.objects.User;
import com.model.objects.User_Type;
import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SearchServiceServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public SearchServiceServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     * response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

        response.setContentType("txt/html");

        UserDao dao = (UserDao) getServletContext().getAttribute("userDao");

        //Reading parameters
        String first_name = request.getParameter("first_name");
        String last_name = request.getParameter("last_name");
        Integer age = null;

        try {
            age = Integer.valueOf(request.getParameter("age"));
        } catch (NumberFormatException ex) {

        }

        //if the parameters is empty string,then its variable is set to null.
        first_name = first_name.equals("") ? null : first_name;
        last_name = last_name.equals("") ? null : last_name;

        User userEq = new User.UserBuilder(null, null, age, new User_Type("User"), first_name, last_name).build();

        List<User> users = dao.getIf(userEq);

        System.out.println(users.size());

        response.sendRedirect("search.html");

    }

}

Я использую maven, tomcat 9 и netbeans для запуска этого проекта.

1 Ответ

4 голосов
/ 20 апреля 2019

Не изменяйте то, что вы повторяете. Вот простое решение, которое отслеживает пользователей для удаления и удаляет их после завершения итерации.

@Override
public synchronized List<User> getIf(User user) {
    List<User> users = new ArrayList<>();

    users = getAll();

    int num = users.size();

    System.out.println(num);

    List<User> toRemove = new ArrayList<>();

    for (int i = 0; i < num; i++) {

            User potentialUser = users.get(i);

            boolean result = true;

            if (user.getUsername() != null && !user.getUsername().equals(potentialUser.getUsername())) {
                result = false;
            } else if (user.getPassword() != null && !user.getPassword().equals(potentialUser.getPassword())) {
                result = false;
            } else if (user.getFirstName() != null && !user.getFirstName().equals(potentialUser.getFirstName())) {
                result = false;
            } else if (user.getLastName() != null && !user.getLastName().equals(potentialUser.getLastName())) {
                result = false;
            } else if (user.getUserType() != null && !user.getUserType().equals(potentialUser.getUserType())) {
                result = false;
            } else if (user.getAge() != null && !user.getAge().equals(potentialUser.getAge())) {
                result = false;
            }

            if (!result) {
                toRemove.add(user);
            }


        }

        toRemove.forEach(u -> users.remove(u));

        return users;
}

Есть лучший способ сделать это:

@Override
public synchronized List<User> getIf(User user) {
    List<User> users = getAll();

    return users.stream().filter(potentialUser -> {
            boolean result = true;

            if (user.getUsername() != null && !user.getUsername().equals(potentialUser.getUsername())) {
                result = false;
            } else if (user.getPassword() != null && !user.getPassword().equals(potentialUser.getPassword())) {
                result = false;
            } else if (user.getFirstName() != null && !user.getFirstName().equals(potentialUser.getFirstName())) {
                result = false;
            } else if (user.getLastName() != null && !user.getLastName().equals(potentialUser.getLastName())) {
                result = false;
            } else if (user.getUserType() != null && !user.getUserType().equals(potentialUser.getUserType())) {
                result = false;
            } else if (user.getAge() != null && !user.getAge().equals(potentialUser.getAge())) {
                result = false;
            }

            return result;
           }).collect(Collectors.toList());
}
...