-2

私は初心者のAndroidアプリ開発者です。オンラインから聖書の朗読を取得するアプリケーションを作成しました。読み取り値を取得するための別の Java クラスを作成し、テストしたところ、正常に動作しています。しかし、Android アプリでそれを使用しようとすると、アプリがクラッシュして動作しなくなりました。ログから、null ポインター例外がスローされていることがわかりましたが、それを修正する方法がわかりません。私もインターネットをチェックしましたが、これに対する正確な解決策が見つかりません。私のアプリケーションに関連するログとファイルを以下に添付します。誰かが私のコードを調べて、エラーの修正に光を当てることができますか? 私に代わって時間を割いていただき、ありがとうございます。

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

4 に答える 4

1

印刷しようとしている本文が値として null を取得しています。最初に、本文に値が含まれているかどうかを確認してください。

于 2012-10-25T10:09:56.713 に答える
0

この場所で何を記録していますか: com.mgocsm.BibleReader.getVerses(BibleReader.java:44) ? あなたはおそらくNullを渡しています。

于 2012-10-25T10:07:35.513 に答える
0

この権限をマニフェストに追加します

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

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

あなたの体はnull値を取得しているため、urログでnullpointer例外が発生しています

于 2012-10-25T10:09:44.610 に答える
0

あなたのコードで気づいたこと:

  • bible.getVerses()nullを返しています
  • AndroidManifest.xml ファイルにINTERNETパーミッションが含まれていないようです

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

  • メイン スレッドで Web 呼び出しを行わないでください。AsyncTask代わりに、またはを使用できますAsyncTaskLoader
  • 使用する代わりに:

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

以下を使用する必要があります。

String webURL = URLEncoder.encode("your web url", "utf-8");
于 2012-10-25T10:10:17.573 に答える