Python工程师Java之路(d)异常

本文深入探讨了异常处理机制,包括异常的概念、体系、种类及如何在Java、Python和Scala中进行异常捕获与抛出。文章通过具体示例介绍了如何使用try、catch、finally等关键字来处理不同类型的异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

异常(exception)

程序在执行过程中,出现的非正常的情况,如果不处理将导致JVM的非正常停止

注意
异常≠语法错误,例如:int a = "a";
异常≠逻辑代码错误,例如:求a与b求和写成了a-b

体系

根类:java.lang.Throwable
根类下两个子类:java.lang.Errorjava.lang.Exception

平常所说的异常指java.lang.Exception

  • Error

    • 严重错误
    • 无法通过处理的错误
    • 只能事先避免(好比绝症)
    • 例如:StackOverflowErrorOutOfMemoryError
  • Exception

    • 异常
    • 其它因编程错误或偶然的外在因素导致的一般性问题
    • 程序员可以通过代码的方式纠正(好比感冒)
    • 例如:空指针访问、试图读取不存在的文件、网络连接中断、数组角标越界

种类

编译时期异常:在编译时期检查异常,若没有处理异常就会编译失败(如:文件找不到异常)
运行时期异常:在运行时期检查异常,运行异常不会被编译器检测到

代码

Java异常处理的五个keyword:try、catch、finally、throw、throws

捕获异常

Java

class Division {
    static int method(int a, int b) {
        try {
            return a / b;
        } catch (ArithmeticException ae) {
            System.out.println(ae);
            return -0;
        } catch (Exception e) {
            System.out.println(e);
            return -0;
        } finally {
            System.out.println("finally");
        }
    }
}

public class Hello {
    public static void main(String[] args) {
        System.out.println(Division.method(9, 0));
    }
}

打印结果

java.lang.ArithmeticException: / by zero
finally
0

public class Hello {
    static int division(int a, int b) {
        try {
            return a / b;
        } catch (ArithmeticException ae) {
            ae.printStackTrace();  // 异常追迹
            return 0;
        } finally {
            System.out.println("finally");
        }
    }

    public static void main(String[] args) {
        System.out.println(division(9, 0));
    }
}

printStackTrace异常追迹

Python(扩展)

def method(a, b):
    try:
        return a / b
    except ZeroDivisionError as e:
        print('except')
        return e
    finally:
        print('finally')

print(method(2, 0))
"""
打印结果
    except
    finally
    division by zero
"""

Scala(扩展)

object Hello {
  def main(args: Array[String]): Unit = {
    print(A.division(9, 0))
  }
}

object A {
  def division(a: Int, b: Int): Int = {
    try {
      a / b
    } catch {
      case ae: ArithmeticException =>
        println(ae)
        -0
      case e: Exception =>
        println(e)
        -0
      case _ =>
        println("_")
        -0
    } finally {
      println("finally")
    }
  }
}
/*
打印结果
    java.lang.ArithmeticException: / by zero
    finally
    0
*/

抛出异常

Java

class Division {
    static int method(int a, int b) {
        if (b == 0) {
            throw (new ArithmeticException("除数不能为零"));
        }
        return a / b;
    }
}

public class Hello {
    public static void main(String[] args) {
        System.out.println(Division.method(9, 0));
        // Exception in thread "main" java.lang.ArithmeticException: 除数不能为零
    }
}

Python(扩展)

def division(a: int, b: int):
    if b == 0:
        raise ZeroDivisionError('除数不能为零')
    return a / b

if __name__ == '__main__':
    print(division(9, 0))

def division(a: int, b: int):
    assert b != 0, '除数不能为零'
    return a / b

if __name__ == '__main__':
    print(division(9, 0))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值