异常
一:异常的概述
1.异常
程序在执行的时候,出现不正常的情况。最终导致JVM非
正常停止。在Java中,异常本身是一个类。产生异常就是创
建一个异常对象并抛出一个异常对象。Java处理异常的方式
是中断处理。(异常不是Java语法错误。)
2.异常的框架
//异常的根类。
Throwable(类)
//工程师无法解决的异常,比如内存溢出。
Error(类)
//该类及其子类除了运行时异常,都为编译异常。
//出现编译异常不进行处理不能进行编译。
Exception(类)
//出现该类以及子类是运行时异常。出现运行时异
//常,不进行处理能进行编译。
RuntimeException(类)
3.Throwable常用方法
//打印异常的详细信息,和JVM打印信息一样
printStackTrace():
//获取发生异常的原因,也就是控制台异常的
//第一行结尾的参数
getMessage();
//获取异常的类型和异常描述信息,也就是在第一
//行,异常的完整类名,加原因。
toString();
4.异常产生的过程
程序在执行的过程中,发生异常。JVM认识
该异常,并把该异常的描述,属性,异常产生的
原因,产生的位置封装成一个异常对象,并把这
个异常对象抛出,如果该位置没有对异常进行处
理,异常对象返回给main函数中的调用者,如果
main函数没有对异常进行处理,则将异常传递给
JVM。把异常信息打印在屏幕上,并停止程序。
二:异常处理
1.抛出一个异常,Throw关键字
a:throw关键字
用来抛出一个异常.当时运行时异常,我们可以不进行处理,可以编译成功。
编译异常必须进行处理。(如:throws 或 try...catch...finally)
b:格式
throw new ArrayIndexOutOfBoundsException("你的角标越界了。");
2.处理异常一,throws关键字
a:throws关键字
声明异常:抛出异常,报告给调用者.
b:格式
public static void read(String path) throws FileNotFoundException {
if (!path.equals("a.txt")) {
throw new FileNotFoundException("文件不存在");
}
}
3.处理异常二,try…catch…finally
a:try,catch,finally概述
try:里面放可能出现的异常代码。
catch:对产生异常的逻辑处理。
finally:无论如何都会执行,用于释放资源。
b:try....catch方式
扑捉异常,并对异常进行有针对性的处理。
c:格式
try{
编写可能会出现异常的代码
}catch(异常类型 e){
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}
b:注意
在try....catch......finally体系中,try里面有
return语句。先把要返回的变量进行赋值,然后执行finally
里面的语句。再执行return语句。如果再finall里面有return
语句,永远执行finally里面的return语句。
在try....catch可以有多个catch用来扑捉异常。如果catch
里面的异常类型有继承关系,一定时子异常类型写再上面
如过父类中方法抛出异常,子类重写父类的方法,抛出的异常
必须是父类方法中的异常的子类,或者不抛异常。如果父类不抛异常
子类重写方法一定不能抛出异常。
运行时异常可以不进行处理。
三:自定义异常类
1.为什么自定义异常
Java中不同的异常类,分别表示着某一种具体的异常情况,
那么在开发中总是有些异常情况是SUN没有定义好的,此时我们
根据自己业务的异常情况来定义异常类.
2.自定义异常的格式
public class LoginException extends Exception {
public LoginException() {
}
public LoginException(String message) {
super(message);
}
}
public class Demo {
// 模拟数据库中已存在账号
private static String[] names = {"bill","hill","jill"};
public static void main(String[] args) {
//调用方法
try{
// 可能出现异常的代码
checkUsername("nill");
System.out.println("注册成功");//如果没有异常就是注册成功
}catch(LoginException e){
//处理异常
e.printStackTrace();
}
}
//判断当前注册账号是否存在
public static boolean checkUsername(String uname) throws LoginException{
for (String name : names) {
if(name.equals(uname)){//如果名字在这里面 就抛出登陆异常
throw new LoginException("亲"+name+"已经被注册了!");
}
}
return true;
}
}