1

ヌルであるIは、内部クラスとインナーインスタンスのコレクションを持つクラスがあります。他のクラスにおいて内部クラス参照は

public class Outer { 

    private List<Inner> items = new ArrayList<Inner>(); 

    ... 

    public List<Inner> getItems(){ 
     return this.items; 
    } 

    public int getOuterX() { 
     ... 
    } 
    ... 

    public class Inner { 
     ... 
     public int getInnerX(){  
      return Outer.this.getOuterX(); // this line throws the exception 
     } 
    } 
} 

をIはOuterのインスタンスの項目を反復処理とOuter.thisnullあるので

for (Outer.Inner item : outer.getItems()) { 
    item.getInnerX(); 
} 

NullPointerExceptiongetInnerX()の内側にスローされます。getInnerX() 1それぞれに呼び出します。

これがどうなるかわかりません。

EDIT:@Sotirios Delimanolisはを求め、私はエラーを再現することができなかったよう

私は例を準備していました。 私はその質問に含まれていないので、その何か。

私はretrofit2Outerというオブジェクトを使用していますが、サーバからの応答はjsonです。

Outerの項目属性がGSonコンバータの注釈を持っています

@SerializedName("items") 
@Expose 
private List<Inner> items = new ArrayList<Inner>(); 

外側にはコンストラクタ定義されていませんどちらもインナーを行います。ここで

は、スタックトレースです:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String 
com.example.server_comunication.datatypes.OrderResponse$Order.getStatus()' on a null object reference 
     at com.example.server_comunication.datatypes.OrderResponse$Order$Supply.forPlacement(OrderResponse.java:408) 
     at com.example.server_comunication.datatypes.OrderResponse$Order$Supply.getRemaining(OrderResponse.java:423) 
     at com.example.uiHelpers.UIFactoryPanels.drawPanelSuppliesEditor(UIFactoryPanels.java:142) 
     at com.example.OrderFragment.onCreateView(OrderFragment.java:85) 
     at android.app.Fragment.performCreateView(Fragment.java:2053) 
     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:894) 
     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 
     at android.app.BackStackRecord.run(BackStackRecord.java:833) 
     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452) 
     at android.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:483) 
     at android.support.v13.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:145) 
     at android.support.v4.view.ViewPager.populate(ViewPager.java:1177) 
     at android.support.v4.view.ViewPager.populate(ViewPager.java:1025) 
     at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1545) 
     at android.view.View.measure(View.java:17430) 
     at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727) 
     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463) 
     at android.view.View.measure(View.java:17430) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 
     at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:668) 
     at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:735) 
     at android.view.View.measure(View.java:17430) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 
     at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135) 
     at android.view.View.measure(View.java:17430) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 
     at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 
     at android.view.View.measure(View.java:17430) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 
     at android.view.View.measure(View.java:17430) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 
     at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 
     at android.view.View.measure(View.java:17430) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 
     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2560) 
     at android.view.View.measure(View.java:17430) 
     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001) 
     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1166) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1372) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
     at android.view.Choreographer.doFrame(Choreographer.java:550) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
+2

@daniel。これはバイトコード操作なしではバニラJavaでは不可能です。 Androidの何かがこれを引き起こしている可能性があります。パブロ、あなたは[MCVE]を提供できますか? –

+0

@SotiriosDelimanolis良い点は、それをロールバックしました。 –

+0

@SotiriosDelimanolis、私は例を取り上げています。ちょうど私がそれを掲示したように、私はエラーを再現することができませんでした(私はあまりにも単純化した)、私は新しい情報を追加しています。ありがとう。 – Pablo

答えて

4

レトロフィットはGsonとGsonチートを使用しています。 (この記事の執筆時点で)sun.misc.Unsafeクラスを使用して、クラスをallocateInstanceでインスタンス化します。これはコンストラクタをすべてスキップします。

内部クラスの場合は、any declared constructor will implicitly declare its first parameter as the enclosing type to represent the enclosing class' instanceです。 Gsonがその囲むクラスのインスタンスを作成する方法はありませんが、そうしてもそれは問題ではありません。 Gsonはコンストラクタを完全にスキップし、暗黙のOuter.this参照をnullとしています。

最も簡単な解決策は、デザインを変更して内部クラスを取り除くことです。また、カスタムデシリアライザを登録して使用することもできます。以下の記事に例があります。

関連記事:関連している:私は[アンドロイドタグ]が考える

+0

ありがとうございました。私は内部クラスを使用して、サーバーから来るjson構造データを照合します。私はあなたのように私のデザインを変更します。 – Pablo

関連する問題