This is the line where the failure occurs.
offsetDuration = duration - (offsets.containsKey(freq) ? offsets.get(freq) : 0l);
The values ββI got by catching an Exception
and dropping the variables,
long offsetDuration = 0; long duration = 391144; TreeMap<Long, Long> offsets = {0=4024974.0, 1036800=8588.0, 1190400=88216.0, 1267200=49763.0, 1497600=87476.0, 1574400=7469.0, 1728000=54553.0, 1958400=60512.0, 2265600=246942.0, 300000=390779.0, 422400=39945.0, 652800=55204.0, 729600=46829.0, 883200=19191.0, 960000=23888.0} long freq = 300000;
The TreeMap<Long, Long> offsets
parsed from a json file using the following code.
@NonNull public static TreeMap<Long, Long> getOffsets(Context context) throws CpuStateException { File file = getOffsetsFile(context); TreeMap<Long, Long> map; try { String s = Files.toString(file, Charsets.UTF_8).trim(); Gson gson = new GsonBuilder().create(); Type type = new TypeToken<TreeMap<Long, Long>>(){}.getType(); map = gson.fromJson(s, type); } catch (IOException e) { throw new CpuStateException("Failed to read offsets!"); } if (map == null) throw new CpuStateException("Failed to read offsets!"); return map; }
After studying the code many times, I canβt determine the situation when this code can cause
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long at java.lang.Long.compareTo(Long.java:32) at java.util.TreeMap.find(TreeMap.java:277) at java.util.TreeMap.findByObject(TreeMap.java:351) at java.util.TreeMap.containsKey(TreeMap.java:182) at com.vibhinna.library.engine.CpuStates.getCpuData(CpuStates.java:96) at com.vibhinna.library.engine.CpuStates.getBarData(CpuStates.java:162)
Any ideas?
Updates 1: json is generated like this:
public static void offsetTimers(TreeMap<Long, Long> offsets, Context context) throws CpuStateException { Gson gson = new GsonBuilder().create(); String json = gson.toJson(offsets); File file = getOffsetsFile(context); try { OutputStreamWriter outputStream = new OutputStreamWriter(new FileOutputStream(file), "UTF-8"); outputStream.write(json); outputStream.flush(); outputStream.close(); } catch (IOException e) { throw new CpuStateException("Failed to save offsets!"); } }
Update 2 . I canβt even reproduce it even in the original application, an accident is rare and only less than 1% of clients are reported.
Update 3
offset class: class java.lang.String value: 1036800 offset class: class java.lang.String value: 1190400 offset class: class java.lang.String value: 1267200 offset class: class java.lang.String value: 1497600 offset class: class java.lang.String value: 1574400 offset class: class java.lang.String value: 1728000 offset class: class java.lang.String value: 1958400 offset class: class java.lang.String value: 2265600 offset class: class java.lang.String value: 300000 offset class: class java.lang.String value: 422400 offset class: class java.lang.String value: 652800 offset class: class java.lang.String value: 729600 offset class: class java.lang.String value: 883200 offset class: class java.lang.String value: 960000
json:
{ "0":256093, "300000":105045, "422400":9677, "652800":10443, "729600":8868, "883200":3951, "960000":7323, "1036800":18668, "1190400":34938, "1267200":17151, "1497600":11018, "1574400":1173, "1728000":22881, "1958400":21076, "2265600":66501 }