2012-10-02 1 views
1

실제로 프로젝트를 시작하기 전에 안드로이드 개발의 기본 원칙을 생각해 볼 수있는 연습을하고 싶었습니다. 나는 현재 ChipCount 클래스를 가지고 있는데, 플레이어가 가지고있는 칩의 양을 저장하고 로딩하는 일을 처리 할 것이다. 클래스는 또한 일반적으로 칩의 양을 추적 할 책임이 있습니다. 나는 또한 ChipCount을 활용하려고 MainActivity을 가지고 있지만, 충돌안드로이드 액티비티 내에서 외부 클래스 사용

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); 
     } 
    } 

} 

다음과 같이

ChipCount 클래스는 현재 보인다.

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();으로 결정했습니다.

왜 이렇게하면 프로그램이 중단되고 어떻게 해결할 수 있습니까? 여기

는 로그 캣입니다 :

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();을 사용해보십시오.

NB : 또한 앞으로 충돌이 발생하면 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; 초기화 적이없는, 소위 때가 null이며, NullPointerException를 발생시킵니다.

코드에 ChipCount chips = new ChipCount();과 같은 코드가 있어야합니다.

관련 문제