此代碼片段正在使用 ExifInterface 讀取相機圖片 Exif 元資料:顯然,一張特定圖片沒有或無效的日期時間,并且 .getDateTime() 回傳 null。在代碼中,我將它分配給 long dt,這會導致如下所示的例外。當然,如果我在分配之前取消注釋空檢查,一切都很好。
所以,我有 1 個問題和 1 個教訓:
我假設 getDateTime() 真的是罪魁禍首。分配會導致這樣的例外嗎?
如您所見,有問題的行在 try/catch 中,但它沒有捕捉到它,因為我只捕捉到 IOException。當它更改為例外時,它捕獲了。
String latlong = ""; long dt = 0; ExifInterface exifInterface; try { exifInterface = new ExifInterface(pf.getAbsolutePath()); if (exifInterface != null) { float[] latLng = new float[2]; if (exifInterface.getLatLong(latLng)) { //file has exif latlong info //etc, latLng[0] is your latitute value and latLng[1] your longitude value latlong = latLng[0] "," latLng[1]; } //if (exifInterface.getDateTime() != null) dt = exifInterface.getDateTime(); picInfo.comments = exifInterface.getAttribute(ExifInterface.TAG_USER_COMMENT); } else { System.out.println(">>>>>>>>>>>>>ERROR: cameraPicTask.doInBackground"); System.out.println(">>>>>>>>>>>>>-----: null exifInterface for: " pf.getAbsolutePath()); } } catch (IOException e) { e.printStackTrace(); }
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
Process: com.example.mypics, PID: 7912
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$4.done(AsyncTask.java:415)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:920)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'long java.lang.Long.longValue()' on a null object reference
at com.example.mypics.PicsActivity$cameraPicTask.doInBackground(PicsActivity.java:211)
at com.example.mypics.PicsActivity$cameraPicTask.doInBackground(PicsActivity.java:185)
at android.os.AsyncTask$3.call(AsyncTask.java:394)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:920)
uj5u.com熱心網友回復:
它似乎exifInterface.getDateTime()回傳 a Long,在這種情況下,它回傳null。您將其分配給long dt其中涉及拆箱操作。編譯器通過呼叫它發出代碼以將其轉換Long為 a ,這會引發 NPE。您可以在堆疊跟蹤中看到它:longlongValue()
原因:java.lang.NullPointerException:嘗試在空物件參考上呼叫虛擬方法“long java.lang.Long.longValue()”
即使您將其分配給Long第一個:
Long dateTime = exifInterface.getDateTime();
long dt = dateTime;
它仍然需要將其拆箱,因此,是的,一個作業可以拋出一個NullPointerException.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/442418.html
上一篇:Postgres大表SelectQueryWithIn子句的最優索引選擇
下一篇:模擬拋出受包保護的例外
