使用 'as' 运算符转换 Nil TJSONValue 时出错
Error when casting Nil TJSONValue using 'as' operator
我偶然发现了一个让我大吃一惊的错误,所以我想问问你这是否有意义...
Item := Songs.Items[Index] as TJSONObject;
ThisTrack := Item.Values['track'] as TJSONObject;
if (Assigned(ThisTrack)) then Begin;
End;
Songs
是 TJSONArray
,Item
和 ThisTrack
是 TJSONObject
。
如果 Item
不包含“track”,上面的代码会在第 2 行抛出一个 ERangeError
异常。
这是我第一次看到这个,我非常确定,我过去有很多“NIL AS ”。
这是 JSON-class 的具体问题吗?
解决方法真的如下吗?
ThisTrack: TJSONValue;
Item := Songs.Items[Index] as TJSONObject;
ThisTrack := Item.Values['track'];
If Assigned(ThisTrack) then Begin;
Tracks := (ThisTrack as TJSONObject).Values['uri'].Value);
如果找不到请求的 child,TJSONObject.Values[]
属性 return 是一个 nil
指针。
如果给定一个 nil
指针,as
运算符不会引发异常,它将 return 一个 nil
指针。因此,无论您是否投射,在访问可能存在或可能不存在的 object 之前,您仍然需要检查 nil
。
关于 ERangeError
异常,您无法在 Item.Values['track'] as TJSONObject
表达式中得到该错误,正如您所指出的那样。但是如果 Index
超出范围,你可以从 Songs.Items[Index]
表达式中得到它。
此外,您在 Begin
之后有一个错误的 ;
,您需要将其删除。
我偶然发现了一个让我大吃一惊的错误,所以我想问问你这是否有意义...
Item := Songs.Items[Index] as TJSONObject;
ThisTrack := Item.Values['track'] as TJSONObject;
if (Assigned(ThisTrack)) then Begin;
End;
Songs
是 TJSONArray
,Item
和 ThisTrack
是 TJSONObject
。
如果 Item
不包含“track”,上面的代码会在第 2 行抛出一个 ERangeError
异常。
这是我第一次看到这个,我非常确定,我过去有很多“NIL AS
这是 JSON-class 的具体问题吗?
解决方法真的如下吗?
ThisTrack: TJSONValue;
Item := Songs.Items[Index] as TJSONObject;
ThisTrack := Item.Values['track'];
If Assigned(ThisTrack) then Begin;
Tracks := (ThisTrack as TJSONObject).Values['uri'].Value);
如果找不到请求的 child,TJSONObject.Values[]
属性 return 是一个 nil
指针。
如果给定一个 nil
指针,as
运算符不会引发异常,它将 return 一个 nil
指针。因此,无论您是否投射,在访问可能存在或可能不存在的 object 之前,您仍然需要检查 nil
。
关于 ERangeError
异常,您无法在 Item.Values['track'] as TJSONObject
表达式中得到该错误,正如您所指出的那样。但是如果 Index
超出范围,你可以从 Songs.Items[Index]
表达式中得到它。
此外,您在 Begin
之后有一个错误的 ;
,您需要将其删除。