【问题标题】:Translating Java class to Kotlin将 Java 类转换为 Kotlin
【发布时间】:2019-09-05 20:29:34
【问题描述】:

我正在使用 Java 库 Volley 来处理我的网络请求。 对于 POST,我想使用 JsonArrayRequest 类,但我注意到由于 JSON 数组内部转换为带有 toString() 的字符串,JSON 数组中出现的所有斜杠都被转义,因此输出字符串为 "\/"而不是"/"。 由于我的 JSON 数组包含带有斜杠的字符串,我复制并粘贴了原始的 JsonArrayRequest 类,将其重命名并添加了.replaceAll("\\\\",""),以便从toString() 生成的字符串中删除所有反斜杠。 它可以正常工作。

这是Java代码:

public class MyJsonArrayRequest extends JsonRequest<JSONArray> {
    public MyJsonArrayRequest(
            String url, Listener<JSONArray> listener, @Nullable ErrorListener errorListener) {
        super(Method.GET, url, null, listener, errorListener);
    }

    public MyJsonArrayRequest(
            int method,
            String url,
            @Nullable JSONArray jsonRequest,
            Listener<JSONArray> listener,
            @Nullable ErrorListener errorListener) {
        super(
                method,
                url,
                jsonRequest.toString().replaceAll("\\\\",""),
                listener,
                errorListener);
    }

    @Override
    protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString =
                    new String(
                            response.data,
                            HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));
            return Response.success(
                    new JSONArray(jsonString), HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    }
}

但是,由于我在我的项目中使用 Kotlin,我更喜欢将 Java 代码转换为 Kotlin 代码(我知道 Java 类可以很好地与 Kotlin 配合使用,这只是一种偏好和一些练习,可以更好地理解 Kotlin)。

这是 Kotlin 代码:

open class MyJsonArrayRequest2: JsonRequest<JSONArray>{
    constructor(url: String, listener: Listener<JSONArray>, errorListener: ErrorListener):
        super(Method.GET, url, null, listener, errorListener)

    constructor(method: Int, url: String, jsonRequest: JSONArray, listener: Listener<JSONArray>, errorListener: ErrorListener):
        super(method, url, jsonRequest.toString().replace("\\\\",""), listener, errorListener)

    override fun parseNetworkResponse(response: NetworkResponse?): Response<JSONArray>{
        try{
            val jsonString = String(response!!.data, Charset.forName(HttpHeaderParser.parseCharset(response.headers)));
            return Response.success(JSONArray(jsonString), HttpHeaderParser.parseCacheHeaders(response));
        }catch (e: UnsupportedEncodingException){
            return Response.error(ParseError(e));
        }catch (je: JSONException){
            return Response.error(ParseError(je));
        }
    }
} 

如果我现在运行我的应用程序(它编译时没有错误或警告),所有请求都使用MyJsonArrayRequest2 而不是MyJsonArrayRequest,我会收到kotlin.KotlinNullPointerException 错误。

编辑: 我现在明白了:使用Java类时响应不为空,但使用Kotlin类时响应为空。 出现的问题是可能导致这种差异的类之间的差异是什么?

我还检查了从 Java 到 Kotlin 的自动翻译,但除了自动翻译使用 replaceAll() 而不是 replace() 并且省略了一些 !!? 之外,我没有发现很多差异。然而,replaceAll() 我得到了一个“未解析的引用”错误,我在某处读到 Kotlin 的 replace() 与 Java 的 replaceAll() 相同。

【问题讨论】:

  • 您想知道为什么会出现空指针异常吗?

标签: java kotlin android-volley


【解决方案1】:

您的responsenull 的形式返回,当您使用!! 调用它时,您向编译器保证它会有一个值。既然没有,你会得到NullPointerException

如果要验证,请尝试使用?访问response中的数据,然后打印结果。

【讨论】:

  • 我明白了。所以基本的问题是:为什么使用 Java 类的响应不为空,而使用 Kotlin 类的响应为空?这两个类的区别在哪里?
  • 如果不看周围的代码我就不会知道。我要做的是在两个类中打印请求并比较它们以查看有什么不同
  • 这不应该影响响应返回为 null 的事实,但是在 Java 代码中标记为 @Nullable 的某些地方,您应该将 ? 放在 Kotlin 中的类型上.
【解决方案2】:

使用this在线将任何java代码转换为kotlin代码(select optioncovert from java)

【讨论】:

    猜你喜欢
    • 2018-11-26
    • 1970-01-01
    • 2023-03-03
    • 2021-08-16
    • 2021-02-03
    • 2019-03-12
    • 1970-01-01
    • 2020-11-01
    • 2021-07-24
    相关资源
    最近更新 更多