在Android中使用Scanner从文件读取NullPointerException?

时间:2014-07-28 07:56:37

标签: java android file java.util.scanner

我有一个Geoid值的文件,我正在尝试阅读它。我试过评论一些代码,然后测试并发现在readFile()方法中发生了NullPointerException,我不明白为什么。

Geoid.java:

import java.util.Scanner;
import java.io.*;

import android.app.Activity;
import android.content.Context;

public class Geoid extends Activity{

    Scanner openGeoid;

    String[] geoidStr = new String[1040000];
    double[] geoid = new double[1040000];

    double lat;
    double longi;
    int geoidIndex;

    public void getLatLong(double latIn, double longIn){
        lat = (-(Math.round(latIn * 4) / 4 + 90) + 180) * 4;
        if(longIn >= 0){
            longi = (Math.round(longIn * 4) / 4) * 4;
        }
        if(longIn < 0){
            longi = (Math.round(longIn * 4) / 4 + 360) * 4;
        }
    }

    public void openFile(){
        try{
            openGeoid = new Scanner(getResources().openRawResource(R.raw.geoid));
        }catch(Exception e){
            ;
        }
    }

    public double readFile(){

        for(int c = 0;openGeoid.hasNext();c++){     
            geoidStr[c] = openGeoid.next();
            geoid[c] = Double.parseDouble(geoidStr[c]);     
        }   

        geoidIndex = (int)Math.round(lat * 1441 + longi);
        return geoid[geoidIndex];

    }

    public void closeFile(){    
        openGeoid.close();  
    }
}

MainActivity.java的getOffSet方法:

 public double getOffSet(double lat, double longi){

        Geoid geo = new Geoid();
        geo.getLatLong(lat, longi);
        geo.openFile();
        double offset = geo.readFile();
        geo.closeFile();
        return offset;

    }

2 个答案:

答案 0 :(得分:2)

Geoid geo = new Geoid();

你永远不应该使用new运算符来实例化Activity,因为Activity遵循自己的生命周期,并且Activity&#39之后可以使用getResources ;调用onStart,如果您实际通过Activity启动了Intent,则会调用onStart。如果您只是为了getResources而需要一个活动,请在方法的签名中添加一个额外的参数。一个Context对象,例如

答案 1 :(得分:0)

openFile方法似乎发生了异常,因此openGeoid变量未实现。

openFile中,你不应该在没有做任何事情的情况下捕捉异常。