【Android 排错第二例】UnsupportedOperationException

时间:2022-06-28 09:26:08

虽然这个bug的最终在于Can’t convert to dimension: type=0x3的问题上,但分析思路上,是怎样一步一步缩小范围,找到真正的错误。
错误是:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.work.gongchenglion/com.work.gongchenglion.ui.ResultActivity}: java.lang.UnsupportedOperationException: Can’t convert to dimension: type=0x3

分析1:
我们习惯从前开始排除错误,因为前面的Exception是后面的基类,网上的资料更多,而且符合我们的行为习惯。
但是最后的提示,比如“Can’t convert to dimension: type=0x3”,往往有手术刀般的精准,切中问题。
但很显然,最初我无法理解“Can’t convert to dimension: type=0x3”的含义,或者不知道type 0x3代表的是什么错误。于是我整理所有有效的信息,猜测真正的理解是什么?
(“Can’t convert to dimension: type=0x3”的含义是“无法转化为尺寸,标号为0x3的bug类型”)

分析2:
LogCat里的信息:
1、java.lang.RuntimeException: Unable to start activity ComponentInfo{com.work.gongchenglion/com.work.gongchenglion.ui.ResultActivity}: java.lang.UnsupportedOperationException: Can’t convert to dimension: type=0x3
2、at android.app.Activity.setContentView(Activity.java:1835)
抓住有效信息:
1)、Unable to start activity ComponentInfo:
无法打开activity组件。这里可能是Manifest.xml未声明或声明错误的问题(可能是声明的组件的路径问题),此时我没有忙于尝试修改,简单地用树形图标记一下。因为我们目标是弄清楚“Can’t convert to dimension: type=0x3”的含义。
2)、UnsupportedOperationException:
操作不支持的错误。同上,这里也有许多可能比如当前SDK版本不支持某些过时的组件或者API。此时由上,我觉得可能是这个原因,某个组件过时。依然标记。
3)、Can’t convert to dimension:
不能转化到尺寸。这里我怀疑是我定义在dimens.xml的尺寸出现错误。某个尺寸缺失或者冲突。这里我花了好长时间去检查,事实上,确实理解错误。
4)、at android.app.Activity.setContentView(Activity.java:1835):
很明显布局的问题。将注意力局限在调用该方法的xml文件上。
5)、type=0x3:
问过度娘,中文网上唯一的“type=0x3”类型的错误,在java文件中,得到某个属性通过getResourceId得到某个资源。很明显和信息4矛盾。不过在这里我清楚“dimension”确实是尺寸,但指的是系统从资源文件得到的尺寸。
也就意味着“Can’t convert to dimension”是不能正确的从xml资源文件中得到尺寸。

因此我把注意力集中在某个用错的API,和尺寸有关,于是发现 android:layout_marginTop=”strings/layout_margin”,使用strings复用尺寸信息是不允许的,在这里String类不能转化Int类。必须用demens。