Index: trunk/src/org/openstreetmap/josm/gui/ExceptionDialogUtil.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/ExceptionDialogUtil.java	(revision 19215)
+++ trunk/src/org/openstreetmap/josm/gui/ExceptionDialogUtil.java	(revision 19216)
@@ -10,4 +10,5 @@
 import java.net.SocketException;
 import java.net.UnknownHostException;
+import java.nio.file.FileSystemException;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -142,4 +143,17 @@
                 ht("/ErrorMessages#NestedIOException")
         );
+    }
+
+    /**
+     * Explains a {@link IOException}
+     *
+     * @param e the exception
+     */
+    private static void explainIOException(Exception e) {
+        if (e instanceof FileSystemException && e.getMessage().contains("The device is not ready")) {
+            showErrorDialog(ExceptionUtil.explainException(e), tr("File System Exception"), null);
+        } else {
+            explainGeneric(e);
+        }
     }
 
@@ -493,4 +507,9 @@
             return;
         }
+        FileSystemException fileSystemException = ExceptionUtil.getNestedException(e, FileSystemException.class);
+        if (fileSystemException != null) {
+            explainIOException(fileSystemException);
+            return;
+        }
         explainGeneric(e);
     }
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImagesLoader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImagesLoader.java	(revision 19215)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImagesLoader.java	(revision 19216)
@@ -6,4 +6,5 @@
 import java.io.File;
 import java.io.IOException;
+import java.io.UncheckedIOException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -91,5 +92,12 @@
 
             ImageEntry e = new ImageEntry(f);
-            e.extractExif();
+            try {
+                e.extractExif();
+            } catch (UncheckedIOException uncheckedIOException) {
+                // We want to throw the actual IOException that is wrapped, not the unchecked IO exception.
+                // See #23866
+                Logging.trace(uncheckedIOException);
+                throw uncheckedIOException.getCause();
+            }
             File parentFile = f.getParentFile();
             entries.computeIfAbsent(parentFile != null ? parentFile.getName() : "", x -> new ArrayList<>()).add(e);
