【问题标题】:Getting ArrayOutOfBound on Java 8 [duplicate]在 Java 8 上获取 ArrayOutOfBound [重复]
【发布时间】:2016-06-30 21:03:58
【问题描述】:

我正在开发一个 Spring MVC 项目,但遇到了 ArrayOutOfBound 异常。如果这是 Java 7,那么我将没有问题,但由于它是 Java 8,而且我是新手,所以我不知道问题出在哪里。我已经搜索了大约两天,但没有运气。我将不胜感激。

现在越界是由ProjectService 类引起的,特别是 public Project find(Long projectId)....

现在我的服务等级是:

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.stereotype.Service;
import com.spring.project.model.Project;

@Service
public class ProjectService {

    private List<Project> projects = new LinkedList<>();

    public ProjectService(){
        Project javaProject = this.createProject("Java Project", "This is a Java Project");
        Project javascriptProject = this.createProject("Javascript Project", "This is a Javascript Project");
        Project htmlProject = this.createProject("HTML Project", "This is an HTML project");

        this.projects.addAll(Arrays.asList(new Project[]{javaProject,javascriptProject, htmlProject}));
    }

    public List<Project> findAll(){
        return this.projects;
    }

    public Project find(Long projectId){
        return this.projects.stream().filter(p -> {
            return p.getProjectId().equals(projectId);
        }).collect(Collectors.toList()).get(0);
    }

    private Project createProject(String title, String description){
        Project project = new Project();

        project.setName(title);
        project.setAuthorizedFunds(new BigDecimal("100000"));
        project.setAuthorizedHours(new BigDecimal("1000"));
        project.setDescription(description);
        project.setSponsor("NASA");
        project.setYear("2016");
        project.setSpecial(true);
        project.setType("single");

        return project;

    }

}

现在我的控制器看起来像这样:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.spring.project.services.ProjectService;

@Controller
@RequestMapping("/project")
public class ProjectController {


    @Autowired
    private ProjectService projectService;

    @RequestMapping(value="/{projectId}")
    public String findProject(Model model, @PathVariable("projectId") Long projectId){
        model.addAttribute("project", this.projectService.find(projectId));
        return "project";
    }

    @RequestMapping(value="/find")
    public String find(Model model){
        model.addAttribute("projects", this.projectService.findAll());
        return "projects";
    }
}

【问题讨论】:

  • 你喜欢冗余代码,是吗?代替Arrays.asList(new Project[]{x,y,z}),你可以写Arrays.asList(x,y,z).filter(p -&gt; { return p.getProjectId().equals(projectId); }),可以用.filter(p -&gt; p.getProjectId().equals(projectId))代替。如果您只对第一场比赛感兴趣,请使用findFirst() 而不是收集List 中的所有内容。

标签: java spring-mvc java-8


【解决方案1】:

没有堆栈跟踪很难判断,但这段代码看起来很可疑:

return this.projects.stream().filter(p -> {
    return p.getProjectId().equals(projectId);
}).collect(Collectors.toList()).get(0);

如果方法调用collect(Collectors.toList()) 返回一个空列表,那么获取空列表的第一个元素将导致 java.lang.IndexOutOfBoundsException。考虑使用 Streams#findFirst 返回 Optional 而不是 collect(Collectors.toList()).get(0) 会抛出异常。

【讨论】:

  • 当然,如果 OP 然后无条件地在 Optional 上调用 get(),它也无济于事。关键是处理找不到匹配项的可能性。但至少,findFirst() 效率更高。
  • 确实如此。我假设 OP 会阅读文档并处理此案例。
【解决方案2】:

问题在于过滤器中的 lambda 表达式。从过滤器中删除return 语句并尝试:

即您的代码非常冗长,应如下所示:

return this.projects.stream().filter(p -> p.getProjectId().equals(projectId)).findFirst().get();

当您尝试搜索不存在的 id 时,您将得到更有意义的 java.util.NoSuchElementExceptionget(0) 是你的java.lang.IndexOutOfBoundsException 的根本原因。

【讨论】:

  • 正如@Holger 解释的那样,在空Optional 上调用get() 将导致NoSuchElementException。您应该使用orElse/orElseGet 方法或使用isPresent() 检查是否存在,如果存在,则可以安全地调用get()
猜你喜欢
  • 2014-11-18
  • 1970-01-01
  • 2020-02-02
  • 2016-07-17
  • 2018-09-27
  • 2015-10-21
  • 1970-01-01
  • 2018-05-22
  • 2013-10-06
相关资源
最近更新 更多