gpt4 book ai didi

java - JSONObject.toString(int) 如何抛出 JSONException?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:42:12 31 4
gpt4 key购买 nike

我在 JSONObject.toString(int) 中注意到了这一点文档

Throws: JSONException - If the object contains an invalid number.

如果事先进行了 NaN/Infinity 检查(在解析时和在 .put("blah", Double.NAN) 之类的语句中),对象怎么可能包含无效数字?哪些语句会抛出该异常?

我还在文档中读到 .toString()没有 args 不会抛出任何东西,所以我认为异常可能与作为参数传递的整数有关;但即使是零、负数或 Integer.MAX/MIN_VALUE,它仍然有效。

那么什么时候应该期望 .toString(int) 抛出异常以及应该如何处理呢?

最佳答案

toString()方法不会抛出异常,因为它必须覆盖 java.lang.Objectpublic void toString() 方法的签名。在 org.json.JSONObject 中,通用 toString() 方法实际上失败了,因为源代码是:

/**
* Make a JSON text of this JSONObject. For compactness, no whitespace is
* added. If this would not result in a syntactically correct JSON text,
* then null will be returned instead.
* <p>
* Warning: This method assumes that the data structure is acyclical.
*
* @return a printable, displayable, portable, transmittable representation
* of the object, beginning with <code>{</code>&nbsp;<small>(left
* brace)</small> and ending with <code>}</code>&nbsp;<small>(right
* brace)</small>.
*/
public String toString() {
try {
return this.toString(0);
} catch (Exception e) {
return null;
}
}

这个方法依赖于toString(int)方法,如果它抛出异常,它会捕获它并返回null。

根据toString(int) 的描述,当org.json.JSONObject 的其中一个元素中有一个无效数字时抛出异常;但是查看代码可能会因为其他原因抛出此异常。

当您使用 toString(int) 时,堆栈跟踪最终调用 write() 方法来解析对象本身,对于来自 json 的某些转换可能会抛出异常字符串对象:

static final Writer writeValue(Writer writer, Object value,
int indentFactor, int indent) throws JSONException, IOException {
if (value == null || value.equals(null)) {
writer.write("null");
} else if (value instanceof JSONObject) {
((JSONObject) value).write(writer, indentFactor, indent);
} else if (value instanceof JSONArray) {
((JSONArray) value).write(writer, indentFactor, indent);
} else if (value instanceof Map) {
new JSONObject((Map<String, Object>) value).write(writer, indentFactor, indent);
} else if (value instanceof Collection) {
new JSONArray((Collection<Object>) value).write(writer, indentFactor,
indent);
} else if (value.getClass().isArray()) {
new JSONArray(value).write(writer, indentFactor, indent);
} else if (value instanceof Number) {
writer.write(numberToString((Number) value));
} else if (value instanceof Boolean) {
writer.write(value.toString());
} else if (value instanceof JSONString) {
Object o;
try {
o = ((JSONString) value).toJSONString();
} catch (Exception e) {
throw new JSONException(e);
}
writer.write(o != null ? o.toString() : quote(value.toString()));
} else {
quote(value.toString(), writer);
}
return writer;
}

但是,如果正如您在问题(和@Carlos Rodriguez 的评论)中所说,所有检查都是在创建对象时执行的,那么 toString(int) 方法可能从未抛出异常。

希望对你有帮助

关于java - JSONObject.toString(int) 如何抛出 JSONException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32073494/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com