Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取Java 8上的ArrayoutBound_Java_Spring Mvc_Java 8 - Fatal编程技术网

获取Java 8上的ArrayoutBound

获取Java 8上的ArrayoutBound,java,spring-mvc,java-8,Java,Spring Mvc,Java 8,我正在从事一个SpringMVC项目,我得到了一个绑定异常的数组。如果这是Java7,那么我就不会有问题,但是因为它是Java8,而且我是新手,所以我不知道问题出在哪里。我找了大约两天,但没有运气。我将非常感谢你的帮助 现在,越界是由ProjectService类引起的,特别是 公共项目findLong Projectd 现在我的服务级别是: import java.math.BigDecimal; import java.util.Arrays; import java.util.Linked

我正在从事一个SpringMVC项目,我得到了一个绑定异常的数组。如果这是Java7,那么我就不会有问题,但是因为它是Java8,而且我是新手,所以我不知道问题出在哪里。我找了大约两天,但没有运气。我将非常感谢你的帮助

现在,越界是由ProjectService类引起的,特别是 公共项目findLong Projectd

现在我的服务级别是:

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;

    }

}

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

return this.projects.stream().filter(p -> {
    return p.getProjectId().equals(projectId);
}).collect(Collectors.toList()).get(0);
如果方法调用collectCollectors.toList返回空列表,则获取空列表的第一个元素将导致java.lang.IndexOutOfBoundsException。考虑使用
返回的,而不是可能引发异常的collectCollectors.toList.get0。

问题在于筛选器中的lambda表达式。从筛选器中删除return语句,然后重试:

i、 e.您的代码非常冗长,应如下所示:

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

当您尝试搜索一个不存在的id时,您将得到更有意义的java.util.NoSuchElementException。get0是java.lang.IndexOutOfBoundsException的根本原因。

您喜欢冗余代码,是吗?代替Arrays.asListnew Project[]{x,y,z},您可以只编写数组。asListx,y,z和.filterp->{return p.getProjectId.EqualProjectId;},可以替换为.filterp->p.getProjectId.EqualProjectId;}。如果您只对第一个匹配感兴趣,请使用findFirst,而不是收集列表中的所有内容。当然,如果OP then无条件地调用get选项,则不会有任何帮助。关键是处理找不到匹配项的可能性。但至少,findFirst更有效。这是真的。我假设OP将阅读文档并处理这个案例。正如@Holger所解释的,调用get on empty Optional将导致NoTouchElementException。您应该使用orElse/orElseGet方法或使用isPresent检查是否存在,如果存在,则可以安全地调用get。
return this.projects.stream().filter(p -> p.getProjectId().equals(projectId)).findFirst().get();