Ahmet K
Ahmet K

Reputation: 813

Error by using Gson class [STACKOVERFLOW ERROR]

Im wanted to save a object from my class which has the package names etc. . So I tried to find a solution to save this object through SharedPreferences and found out that I can make this Object to a JSON String with the Gson class. But the first try failed. Im getting a Error by converting it . I also debugged step by step and found the line :

String jsonapp = gson.toJson(installed_apps);

Here's the whole code :

    List<PackageInfo> apps;
    List<AppInfo> installed_apps;
    ...
            apps = getPackageManager().getInstalledPackages(0);
            installed_apps = new ArrayList<AppInfo>();  

              for(int i=0;i<apps.size();i++) 
                {
                                PackageInfo p = apps.get(i); 
                                AppInfo newInfo = new AppInfo();
                                newInfo.appname = p.applicationInfo.loadLabel(getPackageManager()).toString();
                                newInfo.pname = p.packageName;
                                newInfo.versionName = p.versionName;
                                newInfo.versionCode = p.versionCode;
                                newInfo.icon = p.applicationInfo.loadIcon(getPackageManager());
                                installed_apps.add(newInfo);
                 }

                Gson gson = new Gson();
                String jsonapp = gson.toJson(installed_apps);

And here is my class :

class AppInfo {
        String appname = "";
        String pname = "";
        String versionName = "";
        int versionCode = 0;
        Drawable icon;

        public String get_appname () {
            return appname;
        }
    };

Crash Report :

11-25 20:20:20.911: E/AndroidRuntime(21989): FATAL EXCEPTION: main
11-25 20:20:20.911: E/AndroidRuntime(21989): Process: com.ronssoft.JewE_lite, PID: 21989
11-25 20:20:20.911: E/AndroidRuntime(21989): java.lang.StackOverflowError
11-25 20:20:20.911: E/AndroidRuntime(21989):    at java.lang.Class.isArray(Class.java:1118)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:331)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:355)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:117)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.Gson.getAdapter(Gson.java:356)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
11-25 20:20:20.911: E/AndroidRuntime(21989):    at com.google.gson.internal.bind.R

Why do I get this error and whats the solution for it ? Any ideas ? Thank You !

Upvotes: 0

Views: 873

Answers (2)

JstnPwll
JstnPwll

Reputation: 8685

Are you serializing the Drawable? I'm not positive but it seems like this could be causing your problem. Have you tried removing the Drawable field from your class?

I would save the Drawable as an image to the file system and save a string representation of its path.

Upvotes: 2

Ivan Wooll
Ivan Wooll

Reputation: 4323

Your loop condition for(int i=0;i<apps.size();i++) says "loop through this list until you get to the end of it". Inside the loop you are adding items to the list so that you never actually reach the end of it hence the stackoverflow.

In Java when you declare a loop in this way the function apps.size() gets called each time the loop iterates. It's good practice to first of all declare an integer and assign it the value of the array length and then loop through the array this way. Not only does this mean that you are guaranteed to only loop through the list a finite number of times but it also encourages you to write code more efficiently. An example of the loop would be

    int size = apps.size();
    for(int i=0;i<size;i++) {
    do stuff.....
    }

Upvotes: 0

Related Questions