异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。
异常发生的原因有很多,通常包含以下几大类:
- 用户输入了非法数据。
- 要打开的文件不存在。
- 网络通信时连接中断,或者JVM内存溢出。
这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。
在Java编译过程中,会出现输入未按照规定输入的情况,需要警告用户输入错误。
异常就是可预测但是又没办法消除的一种错误。所以在编写过程中,为了在程序当中不发生这样的错误,就会将容易发生异常的代码用try catch进行处理,或者通过throws将异常向上抛出,由上一级进行接收并处理。
如果发生异常而不去处理,会导致程序中断,也就是程序无法继续运行。
异常的产生:
异常是程序之中导致程序中断的一种指令流,异常一旦出现并且没有进行合理处理的话,那么程序就将中断执行。 编译器不会给你这方面的提示。异常的出现是程序运行到此处的时候才产生的。所以,在编写的时候并不会给你提醒错误,而是在运行的时候才会出现。
异常的类型:
一般来说,异常分为可检测异常和非检测异常。
- 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
- 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
- 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
在Java中常见的异常有:
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
文件未找到异常:FileNotFoundException
字符串转换为数字异常:NumberFormatException
操作数据库异常:SQLException
输入输出异常:IOException
自定义异常:
自定义异常就是Java本身不包含的异常类型,需要程序员在编写的时候自己去定义。
这是有异常但是不提醒的情况。可以根据自定义异常来解决这个问题。
自定义异常一般这样来定义
class 自定义异常类 extends 异常类型(Exception){
// 因为父类已经把异常信息的操作都完成了,所在子类只要在构造时,将异常信息传递给父类通过super 语句即可。
// 重写 有参 和 无参 构造方法
}