前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Kotlin】Kotlin 与 Java 互操作 ③ ( Kotlin 中处理 Java 异常 | Java 中处理 Kotlin 异常 | @Throws 注解处理异常 | 函数类型互相操作 )

【Kotlin】Kotlin 与 Java 互操作 ③ ( Kotlin 中处理 Java 异常 | Java 中处理 Kotlin 异常 | @Throws 注解处理异常 | 函数类型互相操作 )

作者头像
韩曙亮
发布于 2023-03-30 11:12:58
发布于 2023-03-30 11:12:58
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

文章目录

一、Kotlin 中处理 Java 异常


1、Java 中异常操作

Java 函数中 抛出 异常 , 如果 在 Java 中调用该 抛出异常 的函数 , 则 必须处理该异常 , 否则编译时就会报

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Unhandled exception: Xxx.XxException

错误信息 ;

抛出异常代码示例 : 在该代码的 exceptionDemo 函数中 , 抛出了 IOException 异常 , 在 Java 中调用 exceptionDemo 函数时 , 必须处理该函数抛出的 IOException 异常 , 否则在编译时会报错 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.IOException;

public class JavaMethod {

    public void exceptionDemo() throws IOException {
        throw new IOException();
    }

    public static void main(String[] args) {
        JavaMethod javaMethod = new JavaMethod();
        javaMethod.exceptionDemo();
    }
}

上述代码 , 在 编译时报错

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Unhandled exception: java.io.IOException

因此 , 在 Java 代码中 , 正确的操作是 , 先使用 try catch 代码块捕获该异常 , 然后处理异常 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.IOException;

public class JavaMethod {

    public void exceptionDemo() throws IOException {
        throw new IOException();
    }

    public static void main(String[] args) {
        JavaMethod javaMethod = new JavaMethod();
        try {
            javaMethod.exceptionDemo();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

该代码编译通过 , 没有在编译时报错 ;

2、Kotlin 中调用 Java 抛出异常函数

Kotlin 代码中调用上述 函数 , 可以不需要 强制处理 抛出的异常 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun main() {
    var javaMethod = JavaMethod()
    javaMethod.exceptionDemo()
}

虽然在编译时没有抛出异常 , 但是 执行时 , 还是会抛出异常 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Exception in thread "main" java.io.IOException
	at JavaMethod.exceptionDemo(JavaMethod.java:6)
	at HelloKt.main(Hello.kt:3)
	at HelloKt.main(Hello.kt)

3、分析 Kotlin 字节码信息

查看 该 Kotlin 的字节码数据 , 在 快速搜索 中 , 搜索 " Show Kotlin Bytecode " 选项 ,

在 " Kotlin Bytecode " 页面 , 点击顶部的 " Decompile " 按钮 , 将字节码数据反编译成 Java 代码 ;

在反编译后的 Java 代码中 , 存在 编译时 错误 ;

4、Kotlin 中捕获异常

在 Kotlin 中可以 使用 try…catch 代码块 , 捕获 Java 异常 ;

代码示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.IOException

fun main() {
    var javaMethod = JavaMethod()
    try {
        javaMethod.exceptionDemo()
    } catch (e: IOException) {
        println("Catch IOException")
    }
}

执行结果 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Catch IOException

二、Java 中处理 Kotlin 异常


1、Kotlin 方法中抛出异常处理

在 Kotlin 的 函数 中 , 抛出异常 ;

如果 在 Kotlin 中 调用 抛出异常 的 Kotlin 函数 , 直接使用 try catch 代码块捕获并处理该异常即可 ;

代码示例 : 在 Kotlin 代码中的 kotlinException 函数抛出了 IOException 异常信息 ,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.IOException

class KotlinMethod {
    fun kotlinException(){
        throw IOException()
    }
}

fun main() {
    try {
        KotlinMethod().kotlinException()
    } catch (e: IOException) {
        println("Catch IOException")
    }
}

执行结果 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Catch IOException

2、Java 中调用 Kotlin 异常方法

在 Java 中 , 直接调用 Kotlin 抛出异常的函数 , 运行时报错 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class JavaMethod {
    public static void main(String[] args) {
        new KotlinMethod().kotlinException();
    }
}

如果 使用 try…catch… 代码块 强行捕获 Kotlin 函数中抛出的异常 , 会出现编译时错误 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.IOException;

public class JavaMethod {
    public static void main(String[] args) {
        try {
            new KotlinMethod().kotlinException();
        } catch (IOException e) {
            System.out.println("Catch IOException");
        }
    }
}

编译时报错信息 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Exception 'java.io.IOException' is never thrown in the corresponding try block

3、使用 @Throws 注解注明异常

如果 要在 Java 中处理 Kotlin 抛出的异常 , 那么 在 Kotlin 抛出异常的函数 , 必须使用 @Throws 注解注明异常 ;

在 @Throws 注解中 , 传入 Class 字节码类即可 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Throws(IOException::class)

Kotlin 代码如下 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.IOException

class KotlinMethod {
    @Throws(IOException::class)
    fun kotlinException(){
        throw IOException()
    }
}

fun main() {
    try {
        KotlinMethod().kotlinException()
    } catch (e: IOException) {
        println("Catch IOException")
    }
}

Java 代码如下 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.IOException;

public class JavaMethod {
    public static void main(String[] args) {
        try {
            new KotlinMethod().kotlinException();
        } catch (IOException e) {
            System.out.println("Catch IOException");
        }
    }
}

运行结果如下 :

三、Kotlin 与 Java 之间的函数类型互操作


1、Java 调用 Kotlin 中的 匿名函数解决方案

Kotlin 中 普通函数 , 函数类型变量 , 匿名函数 都可以互相调用 , 这是 Kotlin 的语法特性 ;

但是 在 Java 中 , 只有从 JDK1.8 之后才支持 Lambda 表达式 , 因此在 Java 语言中不能直接调用 匿名函数 ;

Kotlin 为了解决上述问题 , 提供了 FunctionN 接口 处理上述问题 , N 的取值范围是 0 ~ 22 ;

  • Function0 表示 函数有 0 个参数 ;
  • Function1 表示 函数有 1 个参数 ;
  • Function22 表示 函数有 22 个参数 ;

每个 FunctionN 接口 都提供了一个 invoke 函数 ,

调用 该 invoke 函数 ,

在函数中传入参数 ,

即可执行对应的 匿名函数 ;

2、Kotlin 中 匿名函数代码示例

在 Kotlin 中 , 定义了 函数类型变量 , 下面的 KotlinMethod 类中 , 定义了 lambda 类型成员 , 该成员是 函数类型变量 ,

  • 该 函数类型变量的 函数的类型是 (String)->Unit ;
  • 该 函数类型变量的 值 是一个 匿名函数 / Lambda 表达式 / 闭包 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class KotlinMethod {
    val lambda = {
        name: String ->
        println("name : $name")
    }
}

fun main() {
    KotlinMethod().lambda("Tom")
}

在 Kotlin 中 , 可以 直接将 函数类型变量 当做函数使用 , KotlinMethod().lambda("Tom") 将其作为 函数名 , 传入参数 , 即可调用该函数 ;

3、Java 中 调用 Kotlin 匿名函数代码示例

在 Java 中 , 从 获取的是 kotlin.jvm.functions.Function1 类型的变量 , 调用其 invoke 函数 , 即可 执行该 Kotlin 的函数类型变量对应的函数 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class JavaMethod {
    public static void main(String[] args) {
        KotlinMethod kotlinMethod = new KotlinMethod();
        kotlinMethod.getLambda().invoke("Jerry");
    }
}

kotlin.jvm.functions.Function1 类型的原型如下 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface Function1<in P1, out R> : Function<R> {
    /** Invokes the function with the specified argument. */
    public operator fun invoke(p1: P1): R
}

执行结果如下 :

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Kotlin】Kotlin 函数总结 ( 具名函数 | 匿名函数 | Lambda 表达式 | 闭包 | 内联函数 | 函数引用 )
默认参数值 : Kotlin 语言 中的 函数参数 , 可以 在定义时 指定参数默认值 ;
韩曙亮
2023/03/30
2.4K0
【Kotlin】Kotlin 函数总结 ( 具名函数 | 匿名函数 | Lambda 表达式 | 闭包 | 内联函数 | 函数引用 )
【Kotlin】Kotlin 与 Java 互操作 ① ( 变量可空性 | Kotlin 类型映射 | Kotlin 访问私有属性 | Java 调用 Kotlin 函数 )
在 Java 语言 中 , 任何 引用类型变量 都可以为 空 null ; Java 中 八种 基本数据类型 变量 的 默认值 为 0 或 false ;
韩曙亮
2023/03/30
1.6K0
【Kotlin】Kotlin 与 Java 互操作 ① ( 变量可空性 | Kotlin 类型映射 | Kotlin 访问私有属性 | Java 调用 Kotlin 函数 )
Android面试题之Kotlin和Java之间互操作
AntDream
2024/06/13
980
Android面试题之Kotlin和Java之间互操作
你知道吗,Java中的受查和非受查异常,其实并不存在区别……
博主在文章中提到Java中的受查异常和非受查异常之间的区别在JVM的世界中实际上并不存在。传统理念认为继承自java.lang.RuntimeException的异常是非受查异常,其他异常则是受查异常。然而,通过比较JVM字节码层面的代码表示,发现无论是受查异常还是非受查异常,在JVM字节码中并没有实质差别。此外,文章也讨论了Kotlin语言对于受查异常的规避,通过Kotlin编写的类似Java代码可以正常运行且不需要显式捕获异常。最后,文章提到Java中的受查异常机制存在争议,而Kotlin作为一种新的JVM语言,避免了这一问题。
HikariLan贺兰星辰
2024/04/04
1370
【Kotlin】空安全总结 ( 变量可空性 | 手动空安全管理 | 空安全调用操作符 | 非空断言操作符 | 空合并操作符 | 空指针异常处理 | 先决条件函数判空 )
在 Java 语言 编写的程序中 , 出现最多的崩溃就是 NullPointerException 空指针异常 ,
韩曙亮
2023/03/30
1.9K0
【Kotlin】空安全总结 ( 变量可空性 | 手动空安全管理 | 空安全调用操作符 | 非空断言操作符 | 空合并操作符 | 空指针异常处理 | 先决条件函数判空 )
kotlin--与Java互操作
我们可以直接使用 "= " 对Java属性进行赋值了,对于受保护的属性,Java类需要实现对应的get、set方法 Java:
aruba
2021/12/06
5300
Kotlin与Java互操作
互操作就是在Kotlin中可以调用其他编程语言的接口,只要它们开放了接口,Kotlin就可以调用其成员属性和成员方法,这是其他编程语言所无法比拟的。同时,在进行Java编程时也可以调用Kotlin中的API接口。
xiangzhihong
2022/11/30
3.6K0
《JavaSE-第十三章》之异常体系
现实生活中当人的出现了一些毛病,可能就会出现发烧,感冒之类的问题。而我们写的程序也是如此,程序在执行的过程中难免出现一些奇奇怪怪的问题。因此,在java中这些在程序运行中发生的不正常的行为被称为异常。
用户10517932
2023/10/07
1850
《JavaSE-第十三章》之异常体系
【Kotlin】函数 ⑨ ( Kotlin 语言中的闭包概念 | Java 语言中函数作为参数的替代方案 )
匿名函数 就是 Lambda 表达式 , 同时也是 闭包 , 三者的是相同的概念 ;
韩曙亮
2023/03/30
1.1K0
【Kotlin】函数 ⑨ ( Kotlin 语言中的闭包概念 | Java 语言中函数作为参数的替代方案 )
《Kotin 极简教程》第10章 Kotlin与Java互操作
在前面的章节中,我们已经学习了Kotlin的基础语法、类型系统、泛型与集合类、面向对象与函数式编程等主题,在上一章中我们还看到了Kotlin提供的轻量级并发编程模型:协程的相关内容。
一个会写诗的程序员
2018/08/17
2K0
第33节:Java面向对象中的异常
Exception:RuntimeException为空指针异常,数组下标越界异常,算数异常,类型转换异常等,IO异常(IOException),SQL异常(SQLException)。
达达前端
2019/07/03
6110
第33节:Java面向对象中的异常
Java面向对象中的异常
Exception:RuntimeException为空指针异常,数组下标越界异常,算数异常,类型转换异常等,IO异常(IOException),SQL异常(SQLException)。
达达前端
2022/04/29
6800
Java面向对象中的异常
kotlin基础--匿名函数、闭包
如果我们要在Java方法中传入一个回调函数,需要定义一个接口,并使用new关键字实例化匿名类实现该方法:
aruba
2021/12/06
7160
Java异常详解
异常类Throwable有两个子类:Error(不能处理的错误)和Exception(可处理的异常),我们平常所说的异常指的是Exception;
訾博ZiBo
2025/01/06
1530
Java异常详解
kotlin基础--字符串操作、数字类型、标准库函数
substring函数支持IntRange类型参数,使用until创建的范围遵循左闭右开
aruba
2021/12/06
4890
kotlin基础--字符串操作、数字类型、标准库函数
throws 与 throw
/* * 有些时候,我们是可以对异常进行处理的,但是又有些时候,我们根本就没有权限去处理某个异常。 * 或者说,我处理不了,我就不处理了。 * 为了解决出错问题,Java针对这种情况,就提供了另一种处理方案:抛出。 * * 格式: *    throws 异常类名 *    注意:这个格式必须跟在方法的括号后面。 * * 注意: *    尽量不要在main方法上抛出异常(因为这样就没有意义了)。 *    但是我讲课为了方便我就这样做了(将来实际开发中是弹出页面)。 * * 小结: *    编译期异常的抛出,将来调用者必须处理。 *    运行期异常的抛出,将来调用可以不用处理,也可以处理(像处理编译期异常那样处理)。。 */
黑泽君
2018/10/11
8350
Kotlin实战【五】Kotlin中的异常
Kotlin中的异常处理与Java或者其他语言中的处理方式相似。一个函数可以以正常方式结束,或者当错误发生的时候抛出异常。函数调用者捕获这个异常并处理它;如果没有,异常重新在调用栈向上抛。
先知先觉
2019/03/04
2.2K0
kotlin基础--null安全、异常、先决条件
使用Java时,我们需要大量的判断一个变量是否为null,否则使用是会抛出NullPointer异常。 而kotlin使用null给一个变量赋值时,在编译时,就会报错,来防止发生这种异常
aruba
2021/12/06
5640
kotlin基础--null安全、异常、先决条件
【Java】异常处理:从基础到进阶
在编程中,异常(Exception)是指程序在运行过程中程序的错误或者意外情况,它会导致程序的控制流发生改变。通常,异常发生时程序会停止正常执行,直到找到能够处理该异常的代码或者终止程序的执行。
Yui_
2025/01/27
1860
From Java To Kotlin:空安全、扩展、函数、Lambda很详细,这次终于懂了
Kotlin 出自于捷克一家软件研发公司 JetBrains ,这家公司开发出很多优秀的 IDE,如 IntelliJ IDEA、DataGrip 等都是它的杰作,包括 Google 官方的 Android IDE -- Android Studio ,也是 IntelliJ IDEA 的插件版。
Seachal
2023/05/20
1.3K0
From Java To Kotlin:空安全、扩展、函数、Lambda很详细,这次终于懂了
推荐阅读
相关推荐
【Kotlin】Kotlin 函数总结 ( 具名函数 | 匿名函数 | Lambda 表达式 | 闭包 | 内联函数 | 函数引用 )
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档