异常:就是程序出现的问题




异常的作用:
1、用来检查bug的关键参考信息
2、异常可以作为方法内部的特殊返回值,以便通知调用者底层的执行情况
异常的处理方式:
1、JVM默认的处理方式

2、自己处理
格式:
try{
可能出现异常的代码;
}catch (异常类名 变量名){
异常的处理代码;
}
例如:
package Day05;
public class ExceptionTest01 {
//异常:自己处理
public static void main(String[] args) {
int[] arr={1,2,3,4,5,6};
try{
System.out.println(arr[10]);
}catch (Exception e){
System.out.println("数组索引越界");
}
System.out.println("看看谁打印了");
}
}
捕获异常:

问一:如果try中没有遇到问题,就会把try中的全部代码都执行完毕,不会执行catch中的代码,所以只有当出现了异常,才会执行catch中的代码
问二:如果try中遇到多个问题,会第一个异常发生的时候,就去catch中查找是否有对应的捕获代码,如果有就紧接着执行catch和之后的代码。try中其他的异常代码不会再去判断了,如果第一个try中异常发生了,但是并未在catch中捕获到,那么JVM会自己抛出异常
注意:如果说try里面是不同的异常,你想在catch中用不同的处理方式,那么就要一个try对应一个catch,但是实际开发中,其实程序员也不知道自己try里面是什么异常,所以可能一个try后面跟着很多catch
细节:如果多个异常,存在父子关系,那么父类一定要写在子类的下面


在jdk7之后也可以这样,把两种异常放在一起,用相同的方法来处理

问三:
如果try里面的异常没有被捕获,JVM虚拟机会默认自己把异常打印在控制台,catch里面的代码和后续的代码都不会被执行
问四:
如果try中遇到了异常,直接就会去执行catch中的内容,不会再继续执行try异常后续的代码,如果catch中有捕获到,那就正常执行catch里面的内容,如果没有捕获到,那就JVM帮你默认捕获
---是不是觉的JVM还怪好的

异常的常用方法:
最常用的是printStackTrace()




异常的最后一种处理方式:抛出异常



一般异常抛出后呢,会程序调用处会对异常进行相关的输出,比如

异常小练习:

package Day05;
import java.util.Scanner;
public class ExceptionTest03 {
public static void main(String[] args) {
//创建键盘输入的对象
Scanner sc=new Scanner(System.in);
//创建girlFriend对象
GirlFriend gf = new GirlFriend();
while (true) {
try {
//接受gf的姓名
System.out.println("输入姓名");
String name = sc.nextLine();
gf.setName(name);
//接受gf的年龄
System.out.println("输入年龄");
String age = sc.nextLine();
gf.setAge(Integer.parseInt(age));
break;//如果所有的数据都是正确的,跳出循环
} catch (NumberFormatException e) {
System.out.println("年龄的格式有误,请输入正确的年龄格式");
} catch (RuntimeException e) {
System.out.println("姓名的长度/年龄的范围有误");
}
}
System.out.println(gf);
}
}
package Day05;
public class GirlFriend {
private String name;
private int age;
public GirlFriend() {
}
public GirlFriend(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
if(name.length()<3||name.length()>20){
throw new RuntimeException();
}
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
if(age<18||age>40){
throw new RuntimeException();
}
this.age = age;
}
public String toString() {
return "GirlFriend{name = " + name + ", age = " + age + "}";
}
}
自定义异常:




