目录
1.异常的概念与体系结构
1.1异常的概念
在java中将程序过程中发生的不正常行为成为异常
1.算数异常
2.数组越界异常
3.空指针异常
1.2异常体系结构
异常种类繁多,为了对不同异常或者错误进行很好的分类管理,Java内部维护了一个异常的体系结构:
1.Throwable:是一场体系的顶层类,其派生出两个重要子类Error 和Exception
2.Error:是指虚拟机·1无法解决的严重问题 比如JVM的内部错误和资源耗尽,StackOverflowError和OutOfMemoryError,一旦发生回力乏术。
3.Exception:异常产生后程序员可以通过代码进行处理,使程序继续执行。比如:感冒、发烧。我们平时所说 的异常就是Exception。
1.3异常的分类
异常在不同的时候的发声可以分为编译时异常和运行时异常
1.编译时异常
在程序编译时发生的异常被称为编译时异常,也被称为受检查异常(Checked Exception)
2.运行时异常
在程序执行时发生的异常,被称为运行时异常,也被称为非检查异常(Unchecked Exception)
2.异常的处理
2.1防御式编程
2.2异常的抛出
2.2.1throw
语法形式
例如
注意事项:
1.throw只能写在方法体内部
2.抛出的对象只能是Exception或者是Exception子类的对象
2.3异常的捕获
异常的捕获也是异常的处理,主要包括两种一.throws 二.try--catch
2.3.1异常声明throws
所以这就是掩耳盗铃
throws后面声明当前方法可能会抛出的异常,但是这里的异常没有被处理,只是交给了JVM处理,一旦交给JVM处理,程序就会被终止
注意事项:
1.throws必须跟在方法的参数列表之后。
2.声明的异常必须是Exception和Exception的子类
4.调用声明抛出异常方法时,主函数必须解决异常,否则继续使用throws声明
但是异常依然没有被处理。
2.3.2try--catch捕获并处理
注意事项:
1.当try语句中有先后两个异常时,只会先匹配try中先出现的异常,异常后面的代码就不会再执行
一个catch中也可以包括用或语句包括两条异常
2.如果抛出的异常与catch中的异常不匹配,及异常不会被成功捕获,也不会被处理,就继续往外抛,直到JVM捕获中断
3.try中可能会抛出多个不同的异常对象,则必须用多个catch来捕获----即多种异常,多次捕获
4.如果异常的处理方法一样可以写成这样
5.如果异常之间具有父子关系,一定是子类异常在前catch,父类异常在后catch,否则语法错
6.也可以用Exception一次性捕获(Exception是这些异常的父类)不推荐
2.3.3finally
fianlly的两个例子
一:存在的意义
这段代码分两种情况
第一种:正常输入的是一个整数,data的值就直接会被返回,就不会执行sc.close这行代码,会造成空间资源的浪费。
第二种情况:输入的不是一个整数,发生异常就会执行sc.close代码。就不会造成资源的浪费
解决这种情况的方法就是把sc.close这行代码放进finally中。
第二段代码
答案是20 还是10
是20.一般我们不建议在 finally 中写 return (被编译器当做一个警告)
3.自定义异常
public class LogIn {
private String userName = "admin";
private String password = "123456";
public static void loginInfo(String userName, String password) {
if (!this.userName.equals(userName)) {
}
if (!this.password.equals(password)) {
}
System.out.println("登陆成功");
}
public static void main(String[] args) {
loginInfo("admin", "123456");
}
}
自定义异常具体实现方法
1.自定义异常类,然后继承Exception或RunTimeException
2.实现一个带有String类型参数的构造方法,参数含义:异常出现的原因。
class UserNameException extends Exception {
public UserNameException(String message) {
super(message);
}
}
class PasswordException extends Exception {
public PasswordException(String message) {
super(message);
}
}
上面的login代码可以改成这样
public class LogIn {
private String userName = "admin";
private String password = "123456";
public static void loginInfo(String userName, String password)
throws UserNameException,PasswordException{
if (!userName.equals(userName)) {
throw new UserNameException("用户名错误!");
}
if (!password.equals(password)) {
throw new PasswordException("用户名错误!");
}
System.out.println("登陆成功");
}
public static void main(String[] args) {
try {
loginInfo("admin", "123456");
} catch (UserNameException e) {
e.printStackTrace();
} catch (PasswordException e) {
e.printStackTrace();
}
}
}