2017-11-28 6 views
0

私はタブ付きのアプリケーションをタブとして持っています。アプリは約5歳です。このnullpointerはどうして起こりますか?

これは私が長い間持っていた同じコードですが、最後の数週間で、私は突然Googleのコンソールクラッシュログでnullpointersのカップルを持っています!

このコードでは、どのようにしてnullpointerが発生する可能性があるのか​​わかりません。誰かが私には見えないものを見ることができることを願っています。

private TextView switchSpace; 

@Override 
public void onActivityCreated(Bundle savedState) { 
    super.onActivityCreated(savedState); 
    initGUIComponents();   
    checkSpace(); 
} 

private void initGUIComponents() { 
    switchSpace = getView().findViewById(R.id.rightText);   
} 

private void checkSpace() { 
    if (shouldShowComponent) { 
     switchSpace.setText(textToShow); 
     switchSpace.setVisibility(View.VISIBLE); 
    } else { 
     switchSpace.setVisibility(View.GONE);//NULLPOINTER IN CONSOLE!! 
    } 
} 

スタックトレースは、それがnullポインタを起こしonActivityCreatedでcheckSpaceへの呼び出しだということを示しています。繰り返しますが、それはいつもうまくいっています、私は合計で3つのクラッシュしかありません。これはどうしたらできますか?

ポインタが大変感謝しています。

EDIT、スタックトレース:xyztabs.MainFragment.onActivityCreated(MainFragment.java:81)

でxyztabs.MainFragment.checkSpace(MainFragment.java:268)で

でandroid.support.v4 android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedStateでandroid.support.v4.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1442) で.app.Fragment.performActivityCreated(Fragment.java:2363) (FragmentManagerImpl.java :1740) android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1809) android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799) (android.support.v4.app)でandroid.support.v4.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2580) にあります。 FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:2367) android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:2

+0

これはあなたのタブ/ 'ViewPager'の最初の断片です。 (また、あなたは 'ViewPager'を使用していますか?)あなたはスタックトレースを投稿できますか? 'Fragment'は' Activity'が作成されたときに直接ロードされていますか?あるいは、 'Activity'が作成された後、ユーザー入力後に' Fragment'/sを作成しますか?いくつの「断片」がありますか? – payloc

+0

getView()の代わりにViewパラメータを使用してonViewCreatedでview.findViewByIdを実行します。 – Nepster

+0

Nepster、なぜ重要ですか? (正直な質問!)私は疑問を持っている、それは常にこのように見えたか、そうではない、と私は以前に問題がなかった。 – Mathias

答えて

0
  • shouldShowComponentが初期化されていますか?
  • setText(textToShow)に電話するとTextViewへのキャストがありませんか?
  • あなたは確かgetView().findViewById(R.id.rightText);です右のビューを返します(任意のすべてであれば?)
+0

最新のSDKでは、間違っていなければ、 'findViewById'は' <? 'View'の代わりにView>'を拡張します。キャストは必要ありません。それでも、 'NullPointerException'をトリガーしません... – payloc

+0

これについてはわかりませんが(あなたのケースではおそらく該当しません)、' View'を拡張するすべてのクラスが 'setText()'メソッドを持っているわけではありません。もしそうなら、潜在的にNPEにつながるだろうか? – ledwinder96

+0

@ lewinder96いいえ、コンパイラは文句を言うでしょうし、ビルドさせることさえできません。 'NullPointerException'は' RuntimeException'の型です。実行時に名前がついている通りです。 – payloc

0

すると、そのようなビューオブジェクトを作る:あなたのフラグメントのOncreateviewで

private TextView switchSpace; 
private View view; 

をそのようなあなたのテキストビューを初期化

その後、上の活動で作成し
 //in on create view 


     // initialize view 
     view=inflater.inflate(R.layout.yourfragment, container, false); 

     //find text view 
     switchSpace = (TextView)view.findViewById(R.id.rightText); 

     return view; 

は今まで何

行います0
  @Override 
      public void onActivityCreated(Bundle savedState) { 
      super.onActivityCreated(savedState); 

      checkSpace(); 
      } 
+0

setContentViewは 'onCreate() 'で実行されました - アクティビティのメソッド、いいえ? – ledwinder96

+0

彼は自分のコードに従って作成時にコンテンツビューを設定しませんでした。 –

+0

ああ、あなたは正しいです、私は気付かなかった –

0

getView()を使用して、そのIDでビューを接続しています。Fragmentのライフサイクルの文書によるとViewが膨張し、それが起こるとき、あなたのgetView()が実際にnullで、そのためgetView()される前にgetView()を呼び出すことができることは、IDを使用してTextViewを接続し、TextViewnullであることはできません。その後、nullというビュー上でアクションを実行しようとすると、exceptionが投げられます。だからTextViewのIDをOnCreatViewの内に入れて、膨らんだViewを使用してください。これは私の意見ですが、これは間違いかもしれませんが、これはなぜexceptionがいつも代わりにスローされなかった理由を説明します。

+0

それは考えても、 'getView()' 'null'を返す' initGUIComponents() 'の' NullPointerException'をトリガーしますが、OPはstack-traceが 'checkSpace( ) '。 – payloc

+0

必ずしもそうではありません。この場合について言えば、 'TextView'は' null'値を持つことができます。 'null'値を持つ' TextView'で何らかのアクション(この場合は 'Visibility'を変更しようとする)を行うだけで、例外がスローされます。 – Yupi

+0

申し訳ありません。あなたが 'getView()'によって返された値が 'null'であることを意味していると思いました。このような場合、 'null'参照からメソッドを呼び出すと、実際には' NPE'がトリガーされます。 – payloc

関連する問題