Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 6286)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 6287)
@@ -121,6 +121,6 @@
             try {
                 addRecursiveFiles(files, selection);
-            } catch(NullPointerException npe) {
-                rememberError(tr("One of the selected files was null"));
+            } catch (IllegalStateException e) {
+                rememberError(e.getMessage());
             }
 
@@ -209,6 +209,7 @@
             }
 
-            if (nullFile)
-                throw new NullPointerException();
+            if (nullFile) {
+                throw new IllegalStateException(tr("One of the selected files was null"));
+            }
         }
 
Index: trunk/src/org/openstreetmap/josm/io/NmeaReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/NmeaReader.java	(revision 6286)
+++ trunk/src/org/openstreetmap/josm/io/NmeaReader.java	(revision 6287)
@@ -1,9 +1,7 @@
-//License: GPL. Copyright 2008 by Christoph Brill
-
+//License: GPL. See README for details.
 package org.openstreetmap.josm.io;
 
 import java.io.BufferedReader;
 import java.io.File;
-import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -15,4 +13,5 @@
 import java.util.Date;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.gpx.GpxData;
@@ -196,10 +195,10 @@
                 int c = rd.read();
                 if(c=='$') {
-                    ParseNMEASentence(sb.toString(), ps);
+                    parseNMEASentence(sb.toString(), ps);
                     sb.delete(0, sb.length());
                     sb.append('$');
                 } else if(c == -1) {
                     // EOF: add last WayPoint if it works out
-                    ParseNMEASentence(sb.toString(),ps);
+                    parseNMEASentence(sb.toString(),ps);
                     break;
                 } else {
@@ -210,6 +209,6 @@
             data.tracks.add(new ImmutableGpxTrack(currentTrack, Collections.<String, Object>emptyMap()));
 
-        } catch (IOException e) {
-            // TODO tell user about the problem?
+        } catch (Exception e) {
+            Main.warn(e);
         } finally {
             Utils.close(rd);
@@ -233,8 +232,9 @@
     // in the collection in the NMEAParserState object.
     // Returns true if the input made sence, false otherwise.
-    private boolean ParseNMEASentence(String s, NMEAParserState ps) {
+    private boolean parseNMEASentence(String s, NMEAParserState ps) throws IllegalDataException {
         try {
-            if (s.isEmpty())
-                throw new NullPointerException();
+            if (s.isEmpty()) {
+                throw new IllegalArgumentException("s is empty");
+            }
 
             // checksum check:
@@ -274,8 +274,9 @@
                         e[GPGGA.LONGITUDE.position]
                 );
-                if(latLon==null)
-                    throw new NullPointerException(); // malformed
-
-                if((latLon.lat()==0.0) && (latLon.lon()==0.0)) {
+                if (latLon==null) {
+                    throw new IllegalDataException("Malformed lat/lon");
+                }
+
+                if ((latLon.lat()==0.0) && (latLon.lon()==0.0)) {
                     ps.zero_coord++;
                     return false;
