2017-02-05 2 views
1

У меня возникла проблема при создании классификатора. Мой существующий путь к нему вызывает NullPointerException. Я работаю с OpenCV 2.4.11 в Eclipse. ОС - Windows, поэтому я добавил еще одну обратную косую черту между папками. Когда я вставляю путь с одиночными обратными косыми чертами в файловом проводнике, он корректно открывает XML-файл. Мой код выглядит следующим образом:NullPointerException по существующему пути

 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 
     System.out.println("\nRunning FaceDetector"); 
     String path = "C:\\Users\\Juergen\\OpenCV\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml"; 
     System.out.println("path:" + path); 
     CascadeClassifier faceDetector = new CascadeClassifier(FaceDetector.class.getResource(path).getPath()); 

Выход:

Running FaceDetector 

    path:C:\Users\Juergen\OpenCV\opencv\sources\data\haarcascades\haarcascade_frontalface_alt.xml 
    Exception in thread "main" java.lang.NullPointerException 
     at FaceDetector.main(FaceDetector.java:24) 

код основан на следующих instruction.

Любые идеи о том, почему выбрано исключение NullPointerException, оцениваются.

Благодаря

+0

'getResource()' может возвращать 'null' и вызывать' getPath() ', что даст вам' NullPointerException'. – QBrute

+0

, но почему он обернулся? если файл существует. Я проверю это, если (новый файл (путь) .exists()) –

ответ

0

Когда мы смотрим на API Wi Java найти это:

https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getResource-java.lang.String-

Перед делегацией, абсолютное имя ресурса строится по заданному имени ресурса с использованием этого алгоритма:

  • Если имя начинается с символа '/' ('\ u002f'), то абсолютное имя ресурса равно t его часть названия следует за «/».
  • В противном случае абсолютное имя следующего вида:

    modified_package_name/имя

Поэтому вы должны добавить '/' перед вашим абсолютным путем:

String path = "/C:\\Users\\Juergen\\OpenCV\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml"; 

И вы также должны избавиться от разделителя файлов Windows. Java понимает файл отделитель Unix и знает, как обращаться с этим в системе окон:

String path = "/C:/Users/Juergen/OpenCV/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml"; 

Я заменил мою строку на Вашем, ничего не изменилось. Все равно получите исключение NullPointerException. Проверка

if (!new File(path).exists()) { throw new FileNotFoundException("Yikes!");} 

не бросают какие-либо исключений - Jürgen K

Тогда из *.class.getResource(path) вы получаете URL и от URL «s getPath() метода вы получите String, который должен наиболее вероятно, будет то же самое как исходная строка.

Вы пытались использовать его напрямую (с ведущим «/»)?

+0

Спасибо за вашу идею. Я заменил свою строку твоей, ничего не изменилось.Все равно получите исключение NullPointerException. Проверка if (! New File (путь) .exists()) { throw new FileNotFoundException ("Yikes!"); } не выбрасывает исключение –

+0

@ Тимоти: да использование ведущего '/' вообще не помогло –

Смежные вопросы