Android应用程序在模拟器中崩溃

时间:2012-10-25 10:02:50

标签: java android nullpointerexception

我是Android应用开发者的新手。我写了一个从网上获取圣经读物的应用程序。我编写了单独的Java类来获取读数,我测试了它并且它工作正常。但是当我尝试在我的Android应用程序中使用它时,我的应用程序崩溃并停止工作。我从日志中了解到它抛出一个空指针异常,但我不知道如何解决这个问题。我也检查了互联网,我找不到一个确切的解决方案。我正在附加与我的应用程序相关的日志和文件。任何人都可以通过我的代码,并解决修复错误的问题。我代表我感谢您的时间,并提前多多感谢。

10-25 09:49:23.243: E/AndroidRuntime(620): FATAL EXCEPTION: main
10-25 09:49:23.243: E/AndroidRuntime(620): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mgocsm/com.mgocsm.EveningKymthaPrayers}: java.lang.NullPointerException: println needs a message
10-25 09:49:23.243: E/AndroidRuntime(620):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
10-25 09:49:23.243: E/AndroidRuntime(620):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
10-25 09:49:23.243: E/AndroidRuntime(620):  at android.app.ActivityThread.access$600(ActivityThread.java:130)
10-25 09:49:23.243: E/AndroidRuntime(620):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
10-25 09:49:23.243: E/AndroidRuntime(620):  at android.os.Handler.dispatchMessage(Handler.java:99)
10-25 09:49:23.243: E/AndroidRuntime(620):  at android.os.Looper.loop(Looper.java:137)
10-25 09:49:23.243: E/AndroidRuntime(620):  at android.app.ActivityThread.main(ActivityThread.java:4745)
10-25 09:49:23.243: E/AndroidRuntime(620):  at java.lang.reflect.Method.invokeNative(Native Method)
10-25 09:49:23.243: E/AndroidRuntime(620):  at java.lang.reflect.Method.invoke(Method.java:511)
10-25 09:49:23.243: E/AndroidRuntime(620):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-25 09:49:23.243: E/AndroidRuntime(620):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-25 09:49:23.243: E/AndroidRuntime(620):  at dalvik.system.NativeStart.main(Native Method)
10-25 09:49:23.243: E/AndroidRuntime(620): Caused by: java.lang.NullPointerException: println needs a message
10-25 09:49:23.243: E/AndroidRuntime(620):  at android.util.Log.println_native(Native Method)
10-25 09:49:23.243: E/AndroidRuntime(620):  at android.util.Log.d(Log.java:138)
10-25 09:49:23.243: E/AndroidRuntime(620):  at com.mgocsm.BibleReader.getVerses(BibleReader.java:44)
10-25 09:49:23.243: E/AndroidRuntime(620):  at com.mgocsm.EveningKymthaPrayers.onCreate(EveningKymthaPrayers.java:25)
10-25 09:49:23.243: E/AndroidRuntime(620):  at android.app.Activity.performCreate(Activity.java:5008)
10-25 09:49:23.243: E/AndroidRuntime(620):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
10-25 09:49:23.243: E/AndroidRuntime(620):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
10-25 09:49:23.243: E/AndroidRuntime(620):  ... 11 more

EveningKymthaPrayers.java (Activitiy from where I call the Java class to fetch readings)
=========================

public class EveningKymthaPrayers extends Activity {
    AssetManager am;
    FileReader f;
    TextView kymtha_prayer;
    BibleReader bible;
    //ReadingList rl = new ReadingList();
    @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.evening_kymtha);        
        am = getAssets();
        f = new FileReader(am,"kymtha.txt");               
        kymtha_prayer = (TextView) findViewById(R.id.show_kymtha);    
        kymtha_prayer.setMovementMethod(new ScrollingMovementMethod());
        bible = new BibleReader("John 3:16-17");
        kymtha_prayer.setText(bible.getVerses());        
        //kymtha_prayer.setText(f.readFile());
        //kymtha_prayer.setText(setText);                          
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

BibleReader.java (用于获取圣经经文的Java课程)

public class BibleReader {
    public static final String  URL="http://labs.bible.org/api/?passage=";
    String verse;   
    String logName = "BibleReader";
    String line;
    StringBuilder recText;
    private static final int BUFFER_SIZE = 1024 * 10;    
    private final byte[] dataBuffer = new byte[BUFFER_SIZE];

    public BibleReader(String verse) {
        // TODO Auto-generated constructor stub
        this.verse = verse; 
        this.verse = this.verse.toString().replaceAll(" ", "%20");      
    }

    public String getVerses() 
    {
        String body = null;
        try{        
            URL url = new URL(URL+this.verse);
            URLConnection con = url.openConnection();
            InputStream in = con.getInputStream();
            String encoding = con.getContentEncoding();
            encoding = encoding == null ? "UTF-8" : encoding;
            ByteArrayOutputStream baos = new ByteArrayOutputStream();   
            int len = 0;
            while ((len = in.read(dataBuffer)) != -1) {
                baos.write(dataBuffer, 0, len);
            }   
            body = new String(baos.toByteArray(), encoding);
            Log.d(logName, "Fetched Verse"+body);
        }
        catch(Exception e){
            Log.d(logName, e.getMessage());
        }               
        return body.toString();     
    }

}

AndroidMainfest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mgocsm"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".DailyPrayers" android:label="@string/app_name"></activity>        
        <activity android:name=".EveningPrayers" android:label="@string/app_name"></activity>
        <activity android:name=".EveningKymthaPrayers" android:label="@string/app_name"></activity> 
    </application>  
</manifest>

MainActivity.java

public class MainActivity extends Activity {


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public void onClick(View v){
        switch(v.getId()){
        case R.id.daily_prayers:
            startActivity(new Intent(getApplicationContext(),DailyPrayers.class));
            break;
        }

    }

}

DailyPrayers.java

public class DailyPrayers extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.daily_prayers);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    public void onClick(View v){
        switch(v.getId()){
        case R.id.home:
            startActivity(new Intent(getApplicationContext(),MainActivity.class));
            break;
        case R.id.evening_prayers:
            startActivity(new Intent(getApplicationContext(),EveningPrayers.class));
            break;
        }
    }
}

EveningPrayers.java

public class EveningPrayers extends Activity {

    @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.evening_prayers);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public void onClick(View v){
        switch(v.getId()){
        case R.id.kymtha_evening:
            startActivity(new Intent(getApplicationContext(),EveningKymthaPrayers.class));          
            break;
        case R.id.sleeba_evening:
            break;
        }
    }

}

4 个答案:

答案 0 :(得分:1)

您尝试打印的正文为空值。请先检查您是否收到正文中的任何值。

答案 1 :(得分:0)

你在这个地方登录的是什么:com.mgocsm.BibleReader.getVerses(BibleReader.java:44)  ? 你可能正在通过Null。

答案 2 :(得分:0)

在您的清单中添加此权限

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

 body = new String(baos.toByteArray(), encoding);
            Log.d(logName, "Fetched Verse"+body);

你的Body获得空值,这就是你的日志给出nullpointer异常的原因

答案 3 :(得分:0)

我在你的代码中注意到了什么:

  • bible.getVerses()正在返回 null
  • 似乎 INTERNET 权限未包含在AndroidManifest.xml文件中

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

  • 不要在主线程上进行Web调用。相反,您可以使用AsyncTaskAsyncTaskLoader
  • 而不是使用:

this.verse = this.verse.toString().replaceAll(" ", "%20");

您必须使用:

String webURL = URLEncoder.encode("your web url", "utf-8");