【发布时间】:2019-01-26 16:27:21
【问题描述】:
以下代码引发 NullPointerException,我不知道为什么。如果有人能指出我的错误,那将不胜感激。
来自 MainActivity 的代码,错误在第 4 行:
private void init(){
this.createClassifier();
this.takePhoto();
}
private void createClassifier(){
try {
classifier = ImageClassifierFactory.create(
getAssets(),
Constants.GRAPH_FILE_PATH,
Constants.LABELS_FILE_PATH,
Constants.IMAGE_SIZE,
Constants.GRAPH_INPUT_NAME,
Constants.GRAPH_OUTPUT_NAME);
}catch (IOException e) {
Log.e("MainActivity", e.getMessage());
}
}
private Classifier classifier;
...
private final void classifyAndShowResult(final Bitmap croppedBitmap){
runInBackground((new Runnable(){
public final void run(){
Result result = classifier.recognizeImage(croppedBitmap);
showResult(result);
}
}));
}
有不同的方法调用 init(),所以我不知道为什么分类器没有被初始化。
结果类:
public class Result {
private String result;
private float confidence;
public Result(String result, float confidence) {
this.result = result;
this.confidence = confidence;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public float getConfidence() {
return confidence;
}
public void setConfidence(float confidence) {
this.confidence = confidence;
}
}
分类器接口:
public interface Classifier {
Result recognizeImage(Bitmap bitmap);
和发起的recognizeImage:
public Result recognizeImage(Bitmap bitmap){
preprocessImageToNormalizedFloats(bitmap);
classifyImageToOutputs();
PriorityQueue outputQueue = new PriorityQueue(getResults());
Object queue = outputQueue.poll();
return (Result)queue;
}
错误代码是:java.lang.NullPointerException: Attempt to invoke interface method 'classifier.Result classifier.Classifier.recognizeImage(android.graphics.Bitmap)' on an null object reference
ImageClassifier 构造函数:
public ImageClassifier(String inputName, String outputName, long imageSize, List labels, int[] imageBitmapPixels, float[] imageNormalizedPixels, float[] results, TensorFlowInferenceInterface tensorFlowInference) {
this.inputName = inputName;
this.outputName = outputName;
this.imageSize = imageSize;
this.labels = labels;
this.imageBitmapPixels = imageBitmapPixels;
this.imageNormalizedPixels = imageNormalizedPixels;
this.results = results;
this.tensorFlowInference = tensorFlowInference;
}
ImageClassifierFactory 类:
public class ImageClassifierFactory {
public final static Classifier create(AssetManager assetManager, String graphFilePath, String labelsFilePath, int imageSize, String inputName, String outputName) throws IOException {
List labels = getLabels(assetManager, labelsFilePath);
ImageClassifier im = new ImageClassifier(inputName, outputName, (long)imageSize, labels, new int[imageSize * imageSize], new float[imageSize * imageSize * COLOR_CHANNELS], new float[labels.size()], new TensorFlowInferenceInterface(assetManager, graphFilePath));
return im;
}
}
【问题讨论】:
-
听起来
classifier是null。你在哪里定义它? -
我将它定义为MainActivity顶部的“私有分类器分类器”。我已经看过这个问题,但我似乎不知道如何解决这个问题。
-
那你在哪里初始化
classifier?NullPointerException总是意味着同样的事情。您正在尝试使用尚未初始化的变量(因此是null)。