传入方法并填充数据的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
相关产品推荐
相关产品推荐

