You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传入方法并填充数据的List在外部作用域为何为空?

问题:List引用传递后外部日志无输出

我编写了如下代码:

private void updateTrackPositionForImages(ImageService imageService, String documentId, LambdaLogger logger, List<EnhancedSpeechmark> speechmarks) {
        List<ImageDetail> imagesByDocumentId = new ArrayList<>();
        try {
            imageService.getImagesByDocumentId(documentId, imagesByDocumentId, logger);

        } catch (Exception e) {
            logger.log("difficult exception: " + e.getMessage());
            logger.log("stack trace");
            logger.log(e.getStackTrace().toString());
        }
        logger.log("after get query");
        logger.log(imagesByDocumentId.toString());

        updateImageTrackPosition(speechmarks, imagesByDocumentId, logger);
        logger.log("out of updateImageTrackPosition");
        imageService.saveOrUpdateImageRecords(documentId, imagesByDocumentId, logger);
    }



    public void getImagesByDocumentId(String documentId, List<ImageDetail> imagesByDocumentId, LambdaLogger logger) {
        if (documentId == null || documentId.trim().isEmpty()) {
            logger.log("DocumentId is null or empty");
            return; // Or throw an exception as per your error handling policy
        }

        try {
            // Configure the query with the partition key condition
            QueryConditional queryConditional = QueryConditional
                    .keyEqualTo(Key.builder().partitionValue(documentId).build());

            logger.log("Querying for DocumentId: " + documentId);

            // Perform the query using the enhanced client
            imagesTable.query(queryConditional).stream()
                    .forEach(page -> imagesByDocumentId.addAll(page.items()));
            logger.log("Query successful. Items found: " + imagesByDocumentId.size());

            logger.log(imagesByDocumentId.toString());
        } catch (DynamoDbException e) {
            logger.log("Error retrieving images for documentId " + documentId + ": " + e.getMessage());
            // Log additional details from the exception if needed
        }
    }

在getImagesByDocumentId()方法内执行logger.log(imagesByDocumentId.toString()),能正常输出内容:

[ImageDetail{documentId='2b820dad-4cf4-4a21-b243-8c0b840f56a2', id='null', trackPosition=0, url='null', name='null', width=1920.0, height=938.0}, ImageDetail{documentId='2b820dad-4cf4-4a21-b243-8c0b840f56a2', id='null', trackPosition=1, url='null', name='null', width=1256.0, height=483.0}, ImageDetail{documentId='2b820dad-4cf4-4a21-b243-8c0b840f56a2', id='null', trackPosition=2, url='null', name='null', width=333.0, height=133.0}, ImageDetail{documentId='2b820dad-4cf4-4a21-b243-8c0b840f56a2', id='null', trackPosition=3, url='null', name='null', width=1104.0, height=830.0}, ImageDetail{documentId='2b820dad-4cf4-4a21-b243-8c0b840f56a2', id='null', trackPosition=4, url='null', name='null', width=1600.0, height=965.0}, ImageDetail{documentId='2b820dad-4cf4-4a21-b243-8c0b840f56a2', id='null', trackPosition=5, url='null', name='null', width=1266.0, height=362.0}, ImageDetail{documentId='2b820dad-4cf4-4a21-b243-8c0b840f56a2', id='null', trackPosition=6, url='null', name='null', width=1443.0, height=890.0}, ImageDetail{documentId='2b820dad-4cf4-4a21-b243-8c0b840f56a2', id='null', trackPosition=7, url='null', name='null', width=1833.0, height=1077.0}, ImageDetail{documentId='2b820dad-4cf4-4a21-b243-8c0b840f56a2', id='null', trackPosition=8, url='null', name='null', width=1443.0, height=890.0}]

但在updateTrackPositionForImages()方法中执行相同的日志语句却无输出。我知道List是按引用传递,外部作用域应该能看到更新后的值,请问这是为什么?


排查方向
  • 检查LambdaLogger的日志机制
    Lambda日志存在缓冲上传机制,如果函数在日志刷新前就结束,部分日志可能无法同步到CloudWatch。可以尝试在日志语句后添加logger.flush()(若SDK支持),或检查函数执行时长是否过短。另外,确认日志级别配置,是否当前log()方法的级别低于函数配置的阈值被过滤。
  • 验证后续代码是否执行
    先确认logger.log("after get query")是否有输出:如果这条日志也没有,说明try-catch块后的代码未执行。检查catch块是否捕获了异常并输出了异常日志,排查getImagesByDocumentId是否抛出了非DynamoDbException的异常。
  • 确认List状态
    在imagesByDocumentId.toString()前临时添加logger.log("List size: " + imagesByDocumentId.size()),验证列表是否被意外清空或修改。虽然代码中两行日志间无其他操作,但可排除线程干扰或隐式修改的可能性。
  • 排查日志截断
    CloudWatch单条日志有大小限制(默认256KB),虽然内部已输出相同内容,但可通过打印列表大小排除截断导致的空显示问题。

内容的提问来源于stack exchange,提问作者C96

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:05:35