我遇到了一个让我大吃一惊的错误,所以我想和你核实一下这是否有意义。。。
Item := Songs.Items[Index] as TJSONObject;
ThisTrack := Item.Values['track'] as TJSONObject;
if (Assigned(ThisTrack)) then Begin;
End;
Songs
是TJSONArray
,Item
和ThisTrack
是TJSONObject
。
如果CCD_ 6不包含"0";轨道";,上面的代码在第2行抛出一个CCD_ 7异常。
这是我第一次看到这个,我很确定,我有";NIL AS<某事>quot;过去有很多。
这是特定于JSON类的问题吗?
解决方法真的如下吗?
ThisTrack: TJSONValue;
Item := Songs.Items[Index] as TJSONObject;
ThisTrack := Item.Values['track'];
If Assigned(ThisTrack) then Begin;
Tracks := (ThisTrack as TJSONObject).Values['uri'].Value);
如果找不到请求的子级,TJSONObject.Values[]
属性将返回一个nil
指针。
如果给定nil
指针,则as
运算符不会引发异常,它将返回nil
指针。因此,无论是否强制转换,在访问可能存在或不存在的对象之前,仍然需要检查nil
。
关于ERangeError
异常,您无法在Item.Values['track'] as TJSONObject
表达式上得到该错误,正如您所指出的那样。但是,如果Index
超出了界限,则可以从Songs.Items[Index]
表达式中获得它。
此外,您在Begin
之后有一个错误的;
,您需要删除它。