Android Studio部署TensorFlow Lite图像分类模型时数组越界报错求助
问题分析与解决方法
报错根本原因
- 无限循环导致数组越界:代码仅在循环外读取了一次文件行,循环内部未再次调用
bufferedReader.readLine(),导致line永远不为null,循环无限执行,cnt持续递增。 - 固定数组边界限制:
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
相关产品推荐
相关产品推荐

