2016-05-05 27 views
-2

私はカメラをミュートしてミュートを解除する簡単なアプリに取り組んでいます。はい、このアプリは多くの国で違法であるとわかりますが、私は試してみたい。そして、とにかく、物事が荒れてしまうと免責条項があります。ヌルオブジェクト参照を参照しようとしていますか?

開発中、私はSharedPreferencesを呼び出すときにこの問題に遭遇しました。これは私のコードが現在どのように策定されているかです。

  • MainActivity.java、すべてを初期化し、...
    • LegalProsecution.javaを呼び出し、first_runが設定されている場合は、ユーザーに警告しようとしている。.. LP.javaにfirst_run地位を与え
      • AppPreferences.javaハンドル。 AppPreferences.java

だから、私が持ってきた問題。ここでは、コードは次のようになります。

package ideaman924.camerasilencer; 

import android.content.Context; 
import android.content.SharedPreferences; 

public class AppPreference 
{ 
    SharedPreferences prefs; 

    public AppPreference(String buffer, Context context) 
    { 
     prefs = context.getSharedPreferences("ideaman924.camerasilencer.first_run", Context.MODE_PRIVATE); 
    } 

    public void storeSettings(String buffer, int num) 
    { 
     SharedPreferences.Editor editor = prefs.edit(); 
     editor.putInt(buffer, num); 
     editor.apply(); 
    } 

    public int loadSettings(String buffer) 
    { 
     return prefs.getInt(buffer,0); 
    } 
} 

これが私の最後通牒を与えているラインである:ここでは

 prefs = context.getSharedPreferences("ideaman924.camerasilencer.first_run", Context.MODE_PRIVATE); 

はlogcatからクラッシュログです:

私の推測から
05-05 10:10:33.233 9099-9099/ideaman924.camerasilencer E/AndroidRuntime: FATAL EXCEPTION: main 
Process: ideaman924.camerasilencer, PID: 9099 
Theme: themes:{} 
java.lang.RuntimeException: Unable to start activity ComponentInfo{ideaman924.camerasilencer/ideaman924.camerasilencer.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2434) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2504) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5458) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference 
at ideaman924.camerasilencer.AppPreference.<init>(AppPreference.java:12) 
at ideaman924.camerasilencer.LegalProsecution.<init>(LegalProsecution.java:11) 
at ideaman924.camerasilencer.MainActivity.onCreate(MainActivity.java:19) 
at android.app.Activity.performCreate(Activity.java:6251) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2387) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2504)  
at android.app.ActivityThread.-wrap11(ActivityThread.java)  
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347)  
at android.os.Handler.dispatchMessage(Handler.java:102)  
at android.os.Looper.loop(Looper.java:148)  
at android.app.ActivityThread.main(ActivityThread.java:5458)  
at java.lang.reflect.Method.invoke(Native Method)  
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

SharedPreferences prefsヌルオブジェクトを生成し、それを参照しようとしています。しかし、なぜ?なぜそれがヌルオブジェクトであろうか?また、私はprefsを初期化しようとしています。

ご協力いただければ幸いです。

EDIT1:cricket_007で述べたように、エラーが、LegalProsecution.javaであるように思える:

package ideaman924.camerasilencer; 

import android.app.Activity; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.support.v7.app.AlertDialog; 

public class LegalProsecution 
{ 
    private Context context; 
    public LegalProsecution(Context context) 
    { 
     this.context = context; 
    } 
    AppPreference appprefs = new AppPreference("settings",this.context); 
    public void warningShow() 
    { 
     if(appprefs.loadSettings("first_run") != 1) { 
      AlertDialog.Builder builder1 = new AlertDialog.Builder(context); 
      builder1.setTitle(context.getResources().getString(R.string.warning)); 
      builder1.setMessage(context.getResources().getString(R.string.warning_description)); 
      builder1.setCancelable(true); 

      builder1.setPositiveButton(
        context.getResources().getString(R.string.yes), 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          //Got promise from user, now setting first_run to 1 
          appprefs.storeSettings("first_run", 1); 
          dialog.cancel(); 
         } 
        } 
      ); 
      builder1.setNegativeButton(
        context.getResources().getString(R.string.no), 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          //Okay, cool, bye! No CS for you! 
          dialog.cancel(); 
          ((Activity) context).finish(); 
          System.exit(0); 
         } 
        } 
      ); 
      AlertDialog alert1 = builder1.create(); 
      alert1.show(); 
     } 
    } 
} 

すべての問題?そう

AppPreference appprefs; 

public LegalProsecution(Context context) 
{ 
    this.context = context; 
    this.appprefs = new AppPreference("settings", context); 
} 

よう

+5

実際には、 'context'はnullです。 –

+0

Oh god。 'prefs'は有罪ではないという意味ですか?しかし、なぜコンテキストがnullになるのでしょうか?それは、directlを渡された - ああ、分待ってください。すぐ戻ってくる。 – ideaman924

+0

これはエラーの内容です。 'nullのオブジェクト参照で' getSharedPreferences ...を呼び出そうとしました。 –

答えて

1

書き換えコンストラクタが呼び出されるまでthis.contextはnullになりますので。

+0

今すぐ実行...これがうまくいきたい! – ideaman924

+0

それはまだ*コンテキスト*が何であるかは不明です。それはヌルかもしれない –

+0

それは働いて、ありがとう!今私はコンストラクタを捜す必要があります...愚かな私。 – ideaman924

関連する問題