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

调用BlobDownloadHeaders.getContentLength()返回null引发空指针异常

Azure Blob下载时NullPointerException排查与解决

异常成因分析

从报错栈信息可以明确:BlobDownloadHeaders.getContentLength()返回了null,后续调用longValue()拆箱时触发了NullPointerException。这种问题通常出现在以下场景:

  • 目标Blob是零字节空文件:Azure Blob存储对空Blob返回的HTTP响应中,Content-Length头可能缺失,旧版SDK没处理这种null情况
  • Azure Storage SDK版本存在缺陷:早期12.x系列的部分SDK版本,在处理空Blob的下载响应时,未对getContentLength()的返回值做null校验,直接执行拆箱操作引发异常

解决办法

1. 升级Azure Storage Blob SDK到最新稳定版

Azure官方已经在后续版本中修复了该空指针问题,建议将依赖升级到12.25.x及以上的稳定版。以Maven为例,更新pom.xml中的依赖:

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-storage-blob</artifactId>
    <version>12.25.1</version>
</dependency>

2. 提前校验Blob属性,处理空Blob场景

在执行下载前,先检查Blob是否存在并获取其大小,若为零字节则直接返回空数组,避免进入下载流程触发异常:

@Override 
public byte[] getBlobAsByteArray(String customerId, String docTypeId, String fileName, boolean isUser) { 
    String blobName = formBlobName(customerId, docTypeId, fileName); 
    BlobClient blobClient = configureBlobClient(blobName, isUser, false); 
    
    if (!blobClient.exists()) {
        throw new MSSNotFoundException("Blob not found for docTypeId: "+docTypeId);
    }
    
    BlobProperties properties = blobClient.getProperties();
    if (properties.getBlobSize() == 0) {
        return new byte[0];
    }
    
    try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { 
        blobClient.downloadStream(outputStream); 
        return outputStream.toByteArray(); 
    } catch (Exception e) { 
        throw new MSSNotFoundException("Failed to download blob for docTypeId: "+docTypeId, e.getMessage()); 
    } 
}

3. 改用更健壮的downloadContent() API

SDK提供的downloadContent() API内置了对空Blob的处理逻辑,会直接返回空的byte数组,无需手动处理null情况,代码更简洁:

@Override 
public byte[] getBlobAsByteArray(String customerId, String docTypeId, String fileName, boolean isUser) { 
    String blobName = formBlobName(customerId, docTypeId, fileName); 
    BlobClient blobClient = configureBlobClient(blobName, isUser, false); 
    
    try {
        BlobDownloadContentResponse response = blobClient.downloadContent();
        return response.toBytes();
    } catch (Exception e) { 
        throw new MSSNotFoundException("Failed to download blob for docTypeId: "+docTypeId, e.getMessage()); 
    } 
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:35:53