Java—异常
所谓的异常,其实就是在程序执行的时候,产生的一种突发情况,进而产生已知或未知的问题。
生活中就像我们开车去上班,突然某一天因为交通事故而造成堵车,使你无法按时到达公司,又或者你的车子半路抛锚,只能叫拖车。这样看,你还挺倒霉的呀,哈哈…
好,我们回到代码中来,看一下下面的这段代码:
一般情况下是没有问题的吧,可以正常运行,但是我们有没有考虑到分母不能为0的特殊情况,如果没有,就会出现下面这种报错:
那么我们该如何解决呢?其实,以我们之前学到知识完全可以解决,但是代码臃肿,而且还要花精力去堵漏洞,所以,为了更好的解决这个痛点,我们使用异常处理机制。
这就是我们对异常处理的思维步骤:
异常处理的基本结构:
1.try-catch
2.try-catch-finally
3.try-finally(用的少)
public void method(){
try{
//代码段1
//代码段2,会产生异常的代码
//代码段2
}catch(异常类型 e){
//代码段4,对异常进行处理的代码段
}finally{
//代码段5,不管有没有异常,都会执行的代码段
}
}
try{}里面放可能产生异常的代码段
catch{}里面放如果发生异常该怎么处理的代码段
finally{}里面放无所谓,无论异常与否都执行
【注意:finally代码块都会执行(除非强行中断例如:exit(-1))
catch块中有return,先执行return在执行finally块】
举个例子
//输入其他数字提示信息,输出非数字,显示异常,输入1~3则输出对应课程
System.out.println("请输入课程编号(1~3):");
Scanner sc = new Scanner(System.in);
int a = 0;
try {
a = sc.nextInt();
switch (a){
case 1:
System.out.println("C++");break;
case 2:
System.out.println("Java");break;
case 3:
System.out.println("Python");break;
default:
System.out.println("别瞎输");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("欢迎提出建议");
}
结果显示:
异常处理的三种情况:
1.正常情况:try正常走完,不会进入catch块,进入finally块,继续向下执行
2.程序发生异常并被捕获:try块走到发生异常的位置,进入catch块,进入finally块,继续向下执行
3.程序发生异常并没有被捕获:try块走到发生异常的位置,进入finally块,继续向下执行
捕获到异常该如何处理呢?就是catch代码块该写什么呢?
1.用户自定义输出提示信息
例如:System.out.println(“被除数不能为0”);
2.e.printStackTrace();
3.e.getMessage();
常见的异常:
来个例子:
Scanner sc = new Scanner(System.in);
System.out.println("请输入两个数");
try {
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(a / b);
}catch (ArithmeticException e){
//System.out.println(e.getMessage()); //两种处理异常方式,或者自己打印
e.printStackTrace();
}catch (InputMismatchException e){
//System.out.println(e.getMessage());
e.printStackTrace();
}
System.out.println("程序运行结束");
结果显示:
异常体系的结构:异常的顶层父类是Throwable类,Object是它的父类。Throwable类有两个子类:Error 和 Exception。而Exception又分两大类:CheckedException和RuntimeException。
但是,当我们不想处理异常的时候怎么办呢?当然是把锅甩给别人拉。将异常抛出。
举个例子:
/**
* @Author shall潇
* @Date 2021/1/21
* @Description 抛出异常-对年龄进行输入1~100,正常输出,其他则抛出并处理。
*/
public class User {
private int age; //定义年龄
public int getAge() {
return age;
}
public void setAge(int age) {
if(age>100|| age<1){
throw new RuntimeException("年龄不符合规定"); //抛出异常
}
this.age = age;
}
public static void main(String[] args) {
User user = new User();
Scanner sc = new Scanner(System.in);
System.out.println("请输入年龄");
try {
int a = sc.nextInt();
user.setAge(a); //处理异常
System.out.println(user.getAge());
}catch (Exception e){
System.out.println("输入不合理");
}
}
}
结果显示
当然我们可以自定义异常类型,首先继承Throwable类、Exception或者RuntimeException,推荐后两个。然后,提示异常信息。
接下来,我们就演示一下,构建自己的异常继承RuntimeException
//自定义年龄异常
public class AgeException extends RuntimeException{
public AgeException(String message) {
super(message);
}
}
public class User {
private int age; //定义年龄
public int getAge() {
return age;
}
public void setAge(int age) {
if(age>100|| age<1){
throw new AgeException("年龄不符合规定"); //抛出异常
}
this.age = age;
}
public static void main(String[] args) {
User user = new User();
Scanner sc = new Scanner(System.in);
System.out.println("请输入年龄");
try { //处理异常
int a = sc.nextInt();
user.setAge(a);
System.out.println(user.getAge());
}catch (Exception e){
System.out.println("输入不对");
}
}
}
结果和上面的一样就不截图了。