java - parseDouble 为非空变量抛出 NullPointerException

标签 java android eclipse nullpointerexception


我很想得到第二只眼睛的帮助,因为我一直在努力确定我的代码有什么问题。

在 Eclipse IDE 中,我试图实现一个 Google map Activity ,该 Activity 从 Assets 文件夹 (/assets/mmsi.txt) 中的文件中读取 seaship MMSI 代码,并将 map 标记添加到它们各自的位置。我可以使用 BufferedReader 类从该文件中读取,但在使用 Double.parseDouble 将生成的 String 行转换为 double 时遇到问题功能。

LogCat 检测到以下问题。

01-23 17:59:11.672: E/AndroidRuntime(18242): FATAL EXCEPTION: main
01-23 17:59:11.672: E/AndroidRuntime(18242): java.lang.RuntimeException: Unable to resume activity {com.aquamet.saramap/com.aquamet.saramap.MainActivity}: java.lang.NullPointerException
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3128)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.app.ActivityThread.access$2300(ActivityThread.java:125)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.os.Looper.loop(Looper.java:123)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.app.ActivityThread.main(ActivityThread.java:4627)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at java.lang.reflect.Method.invokeNative(Native Method)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at java.lang.reflect.Method.invoke(Method.java:521)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:876)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at dalvik.system.NativeStart.main(Native Method)
01-23 17:59:11.672: E/AndroidRuntime(18242): Caused by: java.lang.NullPointerException
01-23 17:59:11.672: E/AndroidRuntime(18242):    at com.aquamet.saramap.MainActivity.getMMSI(MainActivity.java:173)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at com.aquamet.saramap.MainActivity.setupRegion(MainActivity.java:136)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at com.aquamet.saramap.MainActivity.onResume(MainActivity.java:82)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1149)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.app.Activity.performResume(Activity.java:3827)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3118)
01-23 17:59:11.672: E/AndroidRuntime(18242):    ... 12 more

换句话说,下面的代码中似乎存在 NullPointerException:

private double[] getMMSI() throws IOException {
        AssetManager am = this.getAssets();
        double[] mmsi = null;
        BufferedReader br = null;

        try {
            InputStream  file_stream = am.open("mmsi.txt");
            br = new BufferedReader(new InputStreamReader(file_stream));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        String line;
        for (int i=0; (line = br.readLine()) != null; i++) {
                // Following line seems to be the problem (line 173).
                mmsi[i] = Double.parseDouble(line);
        }

        try {
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
}

但是,在调试时变量 line 实际上不是空的! (对不起,没有足够的图像代表) Debugging Screenshot

另一个 SO 用户遇到了非常相似的问题,但他的变量似乎没有正确初始化。 parseDouble throwing Null Pointer in my code [closed]

最佳答案

Double.parseDouble 不是问题。你的任务是:

double[] mmsi = null;
...
// mssi is still null...
mmsi[i] = Double.parseDouble(line);

您永远不会为 mmsi 分配非空值,因此当您尝试写入它时会出现错误。如果您想进一步证明这一点,请将您的代码拆分为:

double tmp = Double.parseDouble(line);
mmsi[i] = tmp;

您会看到异常发生在第二 行,而不是第一行。

鉴于您不知道需要多少行,我建议您改用ArrayList:

List<Double> mmsi = new ArrayList<Double>();
...
mmsi.add(Double.valueOf(line));

编辑:此外,您应该在 finally block 中关闭您的文件。目前,如果在您阅读时抛出异常,您将让文件保持打开状态。 IMO,您当前的 catch block 实现不如只抛出异常有用。

关于java - parseDouble 为非空变量抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14488611/

相关文章:

java - 用 Java 动画绘制连续复杂的图像

java - 找不到符号—符号: method lastIndexOf(java.lang.String) location: class java.util.Scanner

java - 为什么 java.util.concurrent.TimeUnit.convert 抛出 AbstractMethodError 而不是抽象

java - 如何对 Android Studio 中动态创建的多个按钮执行 onclick 操作

android - 我可以将我的 apk 上传到 SD 卡而不是内部存储吗?

java - getResourceAsStream() 在 Eclipse 中返回 null,但并不总是返回 null

java - 从纯客户端调用远程 EJB(RMI over IIOP)时如何传播 JAAS Subject

android - 对于想要使用 .NET 的移动开发人员来说,Mono 是一个不错的选择吗?

javascript - 为什么我在其中输入内容后我的引文就消失了?

java - eclipse 代码模板 - 缩进