有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在方法中处理RuntimeException的更好方法是什么?

我听说处理运行时异常并不总是一个好的实践。我实现了一个方法,该方法将产品评级作为参数,如果当前产品对象具有此评级,它将返回一个ProductDTO对象。我发现使方法按预期工作的唯一方法是使用运行时异常。但根据Joshua Bloch的说法,在控制流中使用异常是一个非常糟糕的主意

有没有办法改进方法的逻辑

public ProductDTO findByRating(int productRating) {
    ProductDTO productDTO = new ProductDTO();
    if (productRating == this.avgRating()) {
        productDTO.setProductName(productName);
        productDTO.setProductsLeftForSale(productsLeftForSale());
        productDTO.setAvgRating(avgRating());
        productDTO.setTotalVotes(reviews.size());
        return productDTO;
    } else {
        throw new RuntimeException(String.format("No Product found with the rating: %s", productRating));
    }
}

List<ProductDTO> productDTOList = new ArrayList<>();    
        int rating = 5;
        for (BaseProduct product : products) {
            try {
                ProductDTO productDTO = product.findByRating(rating);
                if (productDTO != null) {
                    productDTOList.add(productDTO);
                }
            } catch (RuntimeException e) {
                e.printStackTrace();
            }
        }

共 (1) 个答案

  1. # 1 楼答案

    也许看起来好一点:

    import java.util.List;
    import java.util.Optional;
    import java.util.stream.Collectors;
    
    ...
    
    public Optional<ProductDTO> findByRating(int rating) {
        return this.avgRating() == rating ? Optional.of(createDTO()) : Optional.empty();
    }
    
    private ProductDTO createDTO() {
        ProductDTO productDTO = new ProductDTO();
        productDTO.setProductName(productName);
        productDTO.setProductsLeftForSale(productsLeftForSale());
        productDTO.setAvgRating(avgRating());
        productDTO.setTotalVotes(reviews.size());
        return productDTO;
    }
    
    public List<ProductDTO> findProductsByRating(int rating) {
        return products.stream()
                .map(product -> product.findByRating(rating))
                .filter(Optional::isPresent)
                .map(Optional::get)
                .collect(Collectors.toList());
    }