异常
1. 异常
异常:指程序在执行过程中出现非正常的情况,最终导致jvm会非正常停止;
异常体系如图:
- Error:严重错误Error,无法通过处理的错误,只能事先避免,好比绝症。
- Exception:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。好比感冒、阑尾炎。
Throwable中的常用方法:
-
public void printStackTrace()
:打印异常的详细信息。包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。
-
public String getMessage()
:获取发生异常的原因。提示给用户的时候,就提示错误原因。
-
public String toString()
:获取异常的类型和异常描述信息(不用)。
public class Demo1 {
public static void main(String[] args) {
try{
int i = 1/0;
}catch (Exception e){
System.out.println(e.toString());//java.lang.ArithmeticException: / by zero
System.out.println(e.getMessage());// / by zero
e.printStackTrace();
/*java.lang.ArithmeticException: / by zero
at com.cyy.demo3.Demo1.main(Demo1.java:6)*/
}
}
}
异常产生的过程:
2. 异常处理
Java异常处理的五个关键字:try、catch、finally、throw、throws
1、抛出异常throw:用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行
使用格式:throw new 异常类名(参数);
public class Demo3 {
public static void main(String[] args) throws Exception {
int[] arr = {2,34,6,4};
f1(arr,5);
}
public static void f1(int[] arr,int i) throws Exception {
if(i<0 || i>arr.length-1){
throw new Exception("数据越界了");
}
System.out.println(arr[i]);
}
}
/*
Exception in thread "main" java.lang.Exception: 数据越界了
at com.cyy.demo3.Demo3.f1(Demo3.java:11)
at com.cyy.demo3.Demo3.main(Demo3.java:7)
*/
2、声明异常throws:将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理,那么必须通过throws进行声明,让调用者去处理。
使用格式:修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ }
3、捕获异常try…catch:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理。
使用格式:
try{
编写可能会出现异常的代码
}catch(异常类型 e){
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}
一个try后面可以接对个catch:
try{
编写可能会出现异常的代码
}catch(异常类型A e){ 当try中出现A类型异常,就用该catch来捕获.
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}catch(异常类型B e){ 当try中出现B类型异常,就用该catch来捕获.
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}
注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。
finally 代码块:有一些特定的代码无论异常是否发生,都需要执行。
finally的语法:
try…catch…finally:自身需要处理异常,最终还得关闭资源。
注意:finally不能单独使用。
public class Demo4 {
public static void main(String[] args) {
int[] arr = {34,65,76,32};
try{
int i = arr[3];
System.out.println(i);
}catch (Exception e){
e.printStackTrace();
System.out.println("程序出现异常~~~~~~");
}finally {
System.out.println("关闭资源~~~~~");
}
}
}
/*
1、当程序没有异常时,程序不会执行catch里面的代码,执行结果为:
32
关闭资源~~~~~
2、当程序出现异常时,从出现异常之后的代码都不会执行,直接执行catch里面的代码,执行结果为:
java.lang.ArrayIndexOutOfBoundsException: 5
at com.cyy.demo3.Demo4.main(Demo4.java:7)
程序出现异常~~~~~~
关闭资源~~~~~
3、无论程序出不出现议程,finally里面的代码最终都会执行;
*/
3. 自定义异常
1、自定义一个登陆异常类
public class LoginException extends Exception {
public LoginException() {
}
public LoginException(String message) {
super(message);
}
}
2、模拟登陆失败
public class Demo5 {
public static void main(String[] args){
String[] name = {"张三","李四","小明","小红"};
try {
login(name,"赵六");
} catch (LoginException e) {
e.printStackTrace();
}
}
public static void login(String[] names,String name) throws LoginException {
for (String s : names) {
if(s.equals(name)){
System.out.println("请输入密码:-------");
}else{
throw new LoginException("用户名不正确");
}
}
}
}
//当用户名不存在是抛出异常,打印异常信息