2012-10-02 46 views
1

在我開始研究項目之前,我想練習我認爲的Android開發基本原理。我目前有一個ChipCount職業,負責保存和加載玩家可能擁有的籌碼量。該班還將負責跟蹤籌碼總數。在Android活動中使用外部類

ChipCount類目前看起來如下:

package com.example.parceltest; 

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import android.content.Context; 

public class ChipCount { 

    private int number_of_chips; 
    Context file_context; 

    public ChipCount() { 
     loadChips(); 
    } 

    public void setChips(int chips) { 
     this.number_of_chips = chips; 
    } 

    public int getChips() { 
     return number_of_chips; 
    } 

    public void saveChips() { 
     String filename = "chipsave"; 
     String save_string = String.valueOf(number_of_chips); 

     try { 
      FileOutputStream output = file_context.getApplicationContext().openFileOutput(filename, Context.MODE_PRIVATE); 
      output.write(save_string.getBytes()); 
      output.close(); 
     } catch(IOException e) { 

     } 

    } 

    public void loadChips() { 
     String filename = "chipsave"; 
     String chip_count = ""; 

     try { 
      FileInputStream input = file_context.getApplicationContext().openFileInput(filename); 
      input.read(chip_count.getBytes()); 
     } catch(IOException e) { 
      this.setChips(500); 
     } 
    } 

} 

我也有試圖利用ChipCountMainActivity但它崩潰。

package com.example.parceltest; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    ChipCount chips = new ChipCount(); 

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

     TextView number_of_chips = (TextView) findViewById(R.id.number_of_chips); 
     int chip = chips.getChips(); 
     //number_of_chips.setText("500"); 
    } 

} 

通過評論不同的行,我已經確定問題在行int chip = chips.getChips();

爲什麼這會使程序崩潰,我怎麼可能修復它。

這裏是logcat的:

10-01 22:51:06.958: I/Process(28051): Sending signal. PID: 28051 SIG: 9 
10-01 22:51:26.669: D/AndroidRuntime(28106): Shutting down VM 
10-01 22:51:26.669: W/dalvikvm(28106): threadid=1: thread exiting with uncaught exception (group=0x40b7c300) 
10-01 22:51:26.669: E/AndroidRuntime(28106): FATAL EXCEPTION: main 
10-01 22:51:26.669: E/AndroidRuntime(28106): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.parceltest/com.example.parceltest.MainActivity}: java.lang.NullPointerException 
10-01 22:51:26.669: E/AndroidRuntime(28106): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1983) 
10-01 22:51:26.669: E/AndroidRuntime(28106): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
10-01 22:51:26.669: E/AndroidRuntime(28106): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
10-01 22:51:26.669: E/AndroidRuntime(28106): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
10-01 22:51:26.669: E/AndroidRuntime(28106): at android.os.Handler.dispatchMessage(Handler.java:99) 
10-01 22:51:26.669: E/AndroidRuntime(28106): at android.os.Looper.loop(Looper.java:137) 
10-01 22:51:26.669: E/AndroidRuntime(28106): at android.app.ActivityThread.main(ActivityThread.java:4745) 
10-01 22:51:26.669: E/AndroidRuntime(28106): at java.lang.reflect.Method.invokeNative(Native Method) 
10-01 22:51:26.669: E/AndroidRuntime(28106): at java.lang.reflect.Method.invoke(Method.java:511) 
10-01 22:51:26.669: E/AndroidRuntime(28106): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
10-01 22:51:26.669: E/AndroidRuntime(28106): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-01 22:51:26.669: E/AndroidRuntime(28106): at dalvik.system.NativeStart.main(Native Method) 
10-01 22:51:26.669: E/AndroidRuntime(28106): Caused by: java.lang.NullPointerException 
10-01 22:51:26.669: E/AndroidRuntime(28106): at com.example.parceltest.ChipCount.loadChips(ChipCount.java:45) 
10-01 22:51:26.669: E/AndroidRuntime(28106): at com.example.parceltest.ChipCount.<init>(ChipCount.java:15) 
10-01 22:51:26.669: E/AndroidRuntime(28106): at com.example.parceltest.MainActivity.<init>(MainActivity.java:9) 
10-01 22:51:26.669: E/AndroidRuntime(28106): at java.lang.Class.newInstanceImpl(Native Method) 
10-01 22:51:26.669: E/AndroidRuntime(28106): at java.lang.Class.newInstance(Class.java:1319) 
10-01 22:51:26.669: E/AndroidRuntime(28106): at android.app.Instrumentation.newActivity(Instrumentation.java:1053) 
10-01 22:51:26.669: E/AndroidRuntime(28106): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974) 
10-01 22:51:26.669: E/AndroidRuntime(28106): ... 11 more 
+0

嘗試在「由......引起:......」行後雙擊第一行,它會帶你到哪一行導致你NPE。 – toantran

回答

2

你永遠不會初始化chips。因此它是null,所以你不能訪問它的方法。

而不是ChipCount chips;,請嘗試:ChipCount chips = new ChipCount();

注意:另外,將來如果發生崩潰,請發佈LogCat錯誤。在這種情況下,這是一個相對簡單的修復方法,但這些日誌可能在將來是必要的。

編輯

此外,你永遠不通過你的ChipCount對象file_context參數。當您在loadChips();中調用它時,這會使file_contextnull

試試這個:

public class MainActivity extends Activity { 

    ChipCount chips; // Don't initialize here, on second thought 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     chips = new ChipCount(this); // Initialize here; and pass it `this`, which is an Activity, and also a Context 

     TextView number_of_chips = (TextView) findViewById(R.id.number_of_chips); 
     int chip = chips.getChips(); 
     //number_of_chips.setText("500"); 
    } 

} 

,然後在你的構造爲ChipCount,接受Context參數,然後做file_context = newContext;

+0

即使在更改該行後,應用程序仍會在啓動時關閉。 – lafferjm

+0

它不應該。如果是,它是一個不同的錯誤代碼。小心編輯您的第一篇文章與編輯的代碼和LogCat輸出? – Eric

+0

@lafferjm我已更新我的答案,以解決您發佈的日誌。 – Eric

1

你從未初始化ChipCount chips;,所謂當它爲空,並提出了NullPointerException

你需要在你的代碼中有類似ChipCount chips = new ChipCount();的東西。

相關問題