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

Android Studio部署TensorFlow Lite图像分类模型时数组越界报错求助

问题分析与解决方法

报错根本原因

  1. 无限循环导致数组越界:代码仅在循环外读取了一次文件行,循环内部未再次调用bufferedReader.readLine(),导致line永远不为null,循环无限执行,cnt持续递增。
  2. 固定数组边界限制:labels数组初始化长度为1001,索引范围是0-1000,当cnt增加到1001时,访问labels[1001]触发ArrayIndexOutOfBoundsException。

修复步骤

1. 修复文件读取循环

在while循环内部必须读取下一行,避免无限循环:

try {
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(getAssets().open("label.txt")));
    String line = bufferedReader.readLine();
    while (line != null) { 
        labels[cnt] = line;
        cnt++;
        // 读取下一行,终止循环的关键
        line = bufferedReader.readLine();
    }
    bufferedReader.close();
} catch (IOException e) {
    e.printStackTrace();
}

2. 避免数组越界

推荐使用动态集合ArrayList代替固定长度数组,无需提前确定元素数量:

// 替换原数组初始化代码
List<String> labelsList = new ArrayList<>();

try {
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(getAssets().open("label.txt")));
    String line = bufferedReader.readLine();
    while (line != null) { 
        labelsList.add(line);
        line = bufferedReader.readLine();
    }
    bufferedReader.close();
} catch (IOException e) {
    e.printStackTrace();
}

// 如需数组可随时转换
String[] labels = labelsList.toArray(new String[0]);

若坚持使用固定数组,需添加边界判断:

String[] labels = new String[1001]; 
int cnt = 0;

try {
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(getAssets().open("label.txt")));
    String line = bufferedReader.readLine();
    while (line != null && cnt < labels.length) { 
        labels[cnt] = line;
        cnt++;
        line = bufferedReader.readLine();
    }
    bufferedReader.close();
} catch (IOException e) {
    e.printStackTrace();
}

其他潜在问题修复

1. 按钮绑定错误

代码中capture按钮绑定了错误的ID,需修正为布局中相机按钮的真实ID:

capture = findViewById(R.id.buttonCapture);

2. 空Bitmap判断

点击预测按钮前,需判断用户是否已选择/拍摄图片,避免空指针异常:

predict.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (bitmap == null) {
            result.setText("请先选择或拍摄图片");
            return;
        }
        // 原预测逻辑代码
    }
});

3. 预测结果显示优化

当前getMax返回索引,需对应到分类标签名称:

// 优化getMax方法,确保逻辑严谨
int getMax(float[] arr){
    int maxIndex = 0;
    float maxValue = arr[0];
    for (int i = 1; i < arr.length; i++){
        if (arr[i] > maxValue) {
            maxValue = arr[i];
            maxIndex = i;
        }
    }
    return maxIndex;
}

// 预测时显示分类名称
int maxIndex = getMax(outputFeature0.getFloatArray());
if (maxIndex < labelsList.size()) {
    result.setText(labelsList.get(maxIndex));
} else {
    result.setText("未知分类");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:31:04