Java 里的异常(Exception)详解
作者:互联网
一, 什么是java里的异常
由于java是cc++ 发展而来的, 首先我们先看看c语言里的错误. 由于java是cc++ 发展而来的, 首先我们先看看c语言里的错误.1.1 c语言里的错误
我们实现1个程序的过程包括, 代码编写, 编译代码成为程序, 执行程序..
我们实现1个程序的过程包括, 代码编写, 编译代码成为程序, 执行程序. .其中大部分常见的语法错误都会被编译代码这样部过滤掉. 但是即使通过了编译. 执行程序这一步可能还是会有错误. 其中大部分常见的语法错误都会被编译代码这样部过滤掉. 但是即使通过了编译. 执行程序这一步可能还是会有错误.
原因很多, 例如常见的除数为0, 内存溢出(数组的index超出界限), 或者内存被其他程序修改等. 原因很多, 例如常见的除数为0, 内存溢出(数组的index超出界限), 或者内存被其他程序修改等.
最简单的例子: 最简单的例子:
#include <stdio.h> int f(int a, int b){ return a/b; } int main(){ int i = f(8,0); printf("i is %d ",i); return 0; }
#include int f(int a, int b){ return a/b; } int main(){ int i = f(8,0); printf("i is %d ",i); return 0; }
上面的例子编译时是无错的, 但是一旦执行就会提示吐核错误了. 上面的例子编译时是无错的, 但是一旦执行就会提示吐核错误了.
c语言里对这种执行时出现的错误是无能为力的, 一旦出错就会整个程序崩溃, 就不会在继续执行下面的代码. c语言里对这种执行时出现的错误是无能为力的, 一旦出错就会整个程序崩溃, 就不会在继续执行下面的代码.
而且很多时候出错信息很少, 让你无法判断出错的原因和地方, 只能一步步小心debug... 而且很多时候出错信息很少, 让你无法判断出错的原因和地方, 只能一步步小心debug...
所以很多用c写的程序有时会出现非法关闭的现象. 所以很多用c写的程序有时会出现非法关闭的现象.
解决方法只能是在代码里对可能出错的地方添加if 判断. 解决方法只能是在代码里对可能出错的地方添加if 判断.
例如f()函数里可以对b进行判断, 如果是0就不执行. 例如f()函数里可以对b进行判断, 如果是0就不执行.
1.2 java里运行时出现的错误
java里编译器对代码的规范性比c严格得多. 但是即使如此, 通过编译的java程序有时也很难避免执行时出错. java里编译器对代码的规范性比c严格得多. 但是即使如此, 通过编译的java程序有时也很难避免执行时出错.例如, 将上面的c程序改编成java程序: 例如, 将上面的c程序改编成java程序:
package Exception_kng; class Exp1{ public int f(int a, int b){ return a/b; } } public class Expt_1{ public static void g(){ Exp1 e = new Exp1(); int i = e.f(8,0); System.out.printf("i is %d ", i); } }运行时一样会出错, 下面是出错信息: 1.2 java里运行时出现的错误 java里编译器对代码的规范性比c严格得多. 但是即使如此, 通过编译的java程序有时也很难避免执行时出错. 例如, 将上面的c程序改编成java程序: package Exception_kng; class Exp1{ public int f(int a, int b){ return a/b; } } public class Expt_1{ public static void g(){ Exp1 e = new Exp1(); int i = e.f(8,0); System.out.printf("i is %d ", i); } } 运行时一样会出错, 下面是出错信息:
[java] Caused by: java.lang.ArithmeticException: / by zero [java] at Exception_kng.Exp1.f(Expt_1.java:5) [java] at Exception_kng.Expt_1.g(Expt_1.java:12) [java] at Enter_1.main(Enter_1.java:31)但是可以见到, java告诉你出错的类型: 运算错误(ArithmeticExcetion), 出错信息和出错的类与文件行数输出, 方便你调试. jvm虚拟机是会对错误作出一定的处理的. [java] Caused by: java.lang.ArithmeticException: / by zero [java] at Exception_kng.Exp1.f(Expt_1.java:5) [java] at Exception_kng.Expt_1.g(Expt_1.java:12) [java] at Enter_1.main(Enter_1.java:31) 但是可以见到, java告诉你出错的类型: 运算错误(ArithmeticExcetion), 出错信息和出错的类与文件行数输出, 方便你调试. jvm虚拟机是会对错误作出一定的处理的.
所以可以简单地将java里的异常理解成java运行时出现的错误, 异常机制就是对这种错误进行处理的机制. 所以可以简单地将java里的异常理解成java运行时出现的错误, 异常机制就是对这种错误进行处理的机制.
1.3 java异常的定义
1.3 java异常的定义实际上, 当java程序执行时出现错误时, jvm会把执行时出错的信息(例如出错原因, 类型, 位置) 收集,然后打包成为1个对象(object), 程序员可以对这种对象进行处理. 这种对象就是所谓的异常. 实际上, 当java程序执行时出现错误时, jvm会把执行时出错的信息(例如出错原因, 类型, 位置) 收集,然后打包成为1个对象(object), 程序员可以对这种对象进行处理. 这种对象就是所谓的异常.
可能出现的异常的代码并不是肯定会出现异常, 取决于执行环境和数据.! 可能出现的异常的代码并不是肯定会出现异常, 取决于执行环境和数据.!
二, java里的异常的分类.
见下图: 见下图:Throwable Throwable
/ /
Error Exception Error Exception
/ / / /
xxxxxx xxxxxx RuntimeException xxxxxx xxxxxx RuntimeException
/ /
xxxxxx ArithmeticException 二, java里的异常的分类. 见下图: Throwable / Error Exception / / xxxxxx xxxxxx RuntimeException / xxxxxx ArithmeticException
上图的所有对象都是类. 上图的所有对象都是类.
Throwable 代表是可抛出的. Throwable 代表是可抛出的.
Error 代表的是严重错误, 这种错误程序员无法进行处理, 例如操作系统崩溃, jvm出错, 动态链接库失败等. Error并不是异常, 不是本文的重点. Error 代表的是严重错误, 这种错误程序员无法进行处理, 例如操作系统崩溃, jvm出错, 动态链接库失败等. Error并不是异常, 不是本文的重点.
Exception 代表的就是异常了. 它下面很多派生类, 其中它的派生类也分两种, 一种是RuntimeException(运行时异常), 其他的都是非运行时异常 Exception 代表的就是异常了. 它下面很多派生类, 其中它的派生类也分两种, 一种是RuntimeException(运行时异常), 其他的都是非运行时异常
RuntimeException 包括除数为0, 数组下标超界等. 运行时异常的派生类有很多, 其产生频率较高. 它的派生类可以由程序处理或者抛给(throw) 给jvm处理. 例如上面的例子就是抛给了jvm处理, jvm把程序中断执行, 并把错误信息输出到终端上. RuntimeException 包括除数为0, 数组下标超界等. 运行时异常的派生类有很多, 其产生频率较高. 它的派生类可以由程序处理或者抛给(throw) 给jvm处理. 例如上面的例子就是抛给了jvm处理, jvm把程序中断执行, 并把错误信息输出到终端上.