1、前言
异常是程序在编译或执行的过程中可能出现的问题,语法错误不算在异常体系
提前处理异常,可以让程序会更加安全、稳定。
2、异常三大体系
Error:
系统级别问题、JVM退出等,代码无法控制
Exception:
Java.lang包下,称为异常类,它表示程序本身可以处理的问题 Runtime Exception及其子类: 运行时异常,编译阶段不会报错(如空指针,数组索引越界异常)
除Runtime Exception之外所有异常:
编译时异常,编译期必须处理的,否则程序不能通过编译(如日期格式化)
3、java异常有哪些?
1、java中异常分类
Throwable类有两个直接子类:
- Exception:出现的问题是可以被捕获的
- Error:系统错误,通常由JVM处理
2、被捕获的异常分类
- Check异常: 派生自Exception的异常类,必须被捕获或再次声明抛出
- Runtime异常:派生自RuntimeException的异常类。使用throw语句可以随时抛出这种异常对象 throw new ArithmeticException(…);
3、发生异常的原因
- 用户输入了非法数据。
- 要打开的文件不存在。
- 网络通信是连接中断。
- JVM内存溢出。
我们知道了java异常之后,我们在程序中要做的就是合理的设计解决异常,让程序不崩溃,让程序恢复到原本的状态!
4、 异常处理
1. 通过try...catch语句块来处理:
try
{
// 程序代码
}catch(ExceptionName e1)
{
//Catch 块
}
Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。
如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。
2. 在具体位置不处理,直接抛出
通过throws/throw到上层再进行处理,具体的,如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。
下面方法的声明抛出一个 Exception 异常:
import java.io.*;
public class className
{
public void fileDeal(string fileRow) throws Exception
{
// Method implementation
throw new Exception();
}
//Remainder of class definition
}
3. finally关键字
finally 关键字用来创建在 try 代码块后面执行的代码块。
无论是否发生异常,finally 代码块中的代码总会被执行。
在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。
finally 代码块出现在 catch 代码块最后,语法如下:
try
{
// 程序代码
}
catch (异常类型1 异常的变量名1)
{
// 程序代码
}
catch (异常类型2 异常的变量名2)
{
// 程序代码
}
finally
{
// 程序代码
}
4、自定义异常
JAVA无法为所有的问题提供异常类,如果我们想通过异常的方式来管控某个业务问题,就需要自定义异常类了。
自定义的异常应该总是包含如下的构造函数:
- 一个无参构造函数
- 一个带有String参数的构造函数,并传递给父类的构造函数。
- 一个带有String参数和Throwable参数,并都传递给父类构造函数。
- 一个带有Throwable 参数的构造函数,并传递给父类的构造函数。
注意:如果自定义异常是为了提示,在使用的时候,一定要用try..catch,不要直接用throw往外抛。
自定义编译时异常 定义一个异常类继承Exception
重写构造器
public class Ageilleagaleception extends Exception{
public Ageilleagaleception (){
}
public Ageilleagaleception(String message){
super(message);
}
}
在出现异常的地方用throw new自定义对象抛出
public static void checkFee(int fee) throws Feeilleagaleception {
if(fee< 0 || fee> 1000000){
throw new Feeilleagaleception (fee+"is illegal");
}else {
System.out.println("费用合理");
}
}
自定义运行时异常
定义一个类继承RuntimeException
重写构造器
在出现异常的地方用throw new自定义对象抛出。