异常(exception)
程序在执行过程中,出现的非正常的情况,如果不处理将导致JVM的非正常停止
注意
异常≠语法错误,例如:int a = "a";
异常≠逻辑代码错误,例如:求a与b求和写成了a-b
体系
根类:
java.lang.Throwable
根类下两个子类:java.lang.Error
与java.lang.Exception
平常所说的异常指java.lang.Exception
-
Error
- 严重错误
- 无法通过处理的错误
- 只能事先避免(好比绝症)
- 例如:
StackOverflowError
和OutOfMemoryError
-
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))