Dipan Papaiya
Dipan Papaiya

Reputation: 39

java.lang.StackOverflowError in gson

While structuring my app in MVP Structure I had faced one problem, when I call the web services using Retrofit in response on success I pass the whole data into the json String so it will provoked me to do this.

My Log Cat:

 FATAL EXCEPTION: main java.lang.StackOverflowError
     at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:147)
     at java.lang.StringBuffer.append(StringBuffer.java:219)
     at java.io.StringWriter.write(StringWriter.java:147)
     at java.io.StringWriter.append(StringWriter.java:199)
     at java.io.StringWriter.append(StringWriter.java:30)
     at com.google.gson.stream.JsonWriter.beforeValue(JsonWriter.java:651)
     at com.google.gson.stream.JsonWriter.open(JsonWriter.java:325)
     at com.google.gson.stream.JsonWriter.beginObject(JsonWriter.java:308)
     at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:205)
     at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:145)
     at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125)
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
     at com.google.gson.internal.bind.ObjectTypeAdapter.write(ObjectTypeAdapter.java:107)
     at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
     at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:208)
     at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:145)
     at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125)
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
     at com.google.gson.internal.bind.ObjectTypeAdapter.write(ObjectTypeAdapter.java:107)
     at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)

Here is my Retrofit API call:

//API Call for Pitch
public void pitch() {
    services
        .getAPI()
        .pitchList()
        .enqueue(new Callback<PitchList_Res>() {
            @Override
            public void onResponse(Call<PitchList_Res> call, Response<PitchList_Res> response) {
                if (!response.body().getdATA().isEmpty()) {
                    Gson gson1=new Gson();
                    String json = gson1.toJson(response);
                    mListener.pitch(json);
                }
            }

            @Override
            public void onFailure(Call<PitchList_Res> call, Throwable t) {
                call.cancel();
                Toast.makeText(context, R.string.error, Toast.LENGTH_SHORT).show();
            }
        });
}

Here is the Main Activity where I'm getting the response:

//Response of Pitch
@Override
public void pitch(String response_pitch) {

    editor.putString(Preference_Data.PITCH_RESPONSE, response_pitch);
    editor.commit();
    PitchList_Res pitchList_res = gson.fromJson(response_pitch, PitchList_Res.class);
    pitchlist.addAll(pitchList_res.getdATA());

    for (int i = 0; i < pitchlist.size(); i++) {

        View pitchview = getLayoutInflater().inflate(
                R.layout.textviewlayout, null);
        final TextView tvtitle = (TextView) pitchview
                .findViewById(R.id.tv_title);

        String id = pitchlist.get(i).getpITCHTYPEID().toString();
        tvtitle.setId(Integer.valueOf(id));

        tvtitle.setText(pitchlist.get(0).getpITCHSHORT().toString());
        tvtitle.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                if (stPitchSelectionID != -1) {
                    findViewById(stPitchSelectionID)
                            .setBackgroundResource(
                                    R.drawable.btn_bg);
                }
                if (stPitchSelectionID == v.getId()) {
                    stPitchSelectionID = -1;
                    tvtitle.setBackgroundResource(R.drawable.btn_bg);
                    pitchid = "0";

                } else {
                    stPitchSelectionID = v.getId();
                    tvtitle.setBackgroundResource(R.drawable.btn_bg_select);

                    pitchid = String.valueOf(stPitchSelectionID)
                            .substring(1);

                }
            }
        });
    }
}

And from Setdefaultvalue() I am checking my response from activity:

public void Setdefaultvalue() {
    llpitchcontainer.removeAllViews();
    llbatresultcontainer.removeAllViews();
    llpitchresultcontainer.removeAllViews();
    llscoringcontainer.removeAllViews();
    etspeed.setText(65 + "");
    tvhh.setBackgroundResource(R.drawable.no_toggle);

    String response_pitch=pref.getString(Preference_Data.PITCH_RESPONSE,"");

   if (response_pitch.equalsIgnoreCase("")) {
        mainScoutPresenter.pitch();
       Log.e("Pitch_if","Pitch_if");
    } else {
           pitch(response_pitch);
           Log.e("Pitch_else", "Pitch_else");
   }
}

Here is my two Model Class:(PitchList_Res)

public class PitchList_Res implements Serializable {


    @SerializedName("DATA")
    @Expose
    private List<PitchList_Data> dATA = null;

    public List<PitchList_Data> getdATA() {
        return dATA;
    }

    public void setdATA(List<PitchList_Data> dATA) {
        this.dATA = dATA;
    }
}

PitchList_Data.java

public class PitchList_Data implements Serializable {

    @SerializedName("PITCHTYPEID")
    @Expose
    private Integer pITCHTYPEID;
    @SerializedName("PITCHFULL")
    @Expose
    private String pITCHFULL;
    @SerializedName("PITCHSHORT")
    @Expose
    private String pITCHSHORT;

    public Integer getpITCHTYPEID() {
        return pITCHTYPEID;
    }

    public void setpITCHTYPEID(Integer pITCHTYPEID) {
        this.pITCHTYPEID = pITCHTYPEID;
    }

    public String getpITCHFULL() {
        return pITCHFULL;
    }

    public void setpITCHFULL(String pITCHFULL) {
        this.pITCHFULL = pITCHFULL;
    }

    public String getpITCHSHORT() {
        return pITCHSHORT;
    }

    public void setpITCHSHORT(String pITCHSHORT) {
        this.pITCHSHORT = pITCHSHORT;
    }
}

Upvotes: 4

Views: 3168

Answers (1)

Jarnail Singh
Jarnail Singh

Reputation: 151

I was getting the same problem & found that error is due to the variables in the class of type Object.

I was parsing a java class object that contains inner objects some of which contains variable of type Object. Due to which Gson library was unable to parse that data.

I have removed Object type declaration for the variables and problem got resolved.

I think Gson library is unable to parse the java object to json if java object contains some variable that is of generic type(like Object Type in my case).

public class HatchRetailer {
    private int id;
    private String name;
    private String purchaseLink;
    private String purchaseLinkDirect;
    private String logo;
    private String currency;
    private double price;
    private String stockInfo;
    private int stockCount;
    private String sourceDate;
    private String businessId;

//  As per my understanding Gson library is not able to parse variable of type Object
//  private Object marketFocus;
//  private Object group;

//  Setters & Getters
}

Upvotes: 2

Related Questions