异常

1.异常的背景
常见的异常
例如
分母为0

System.out.println(10/0);

//执行结果
Excecption in thread"main" java.lang.ArithmeticException:/by zero

数组下标越界

    int []a={ 1,2,3};
    System.out.println(a[100]);
//执行结果
Exception in thread "main" java.lang.NullpointerException

异常是在运行时出现错误时通知调用者的一种机制,如果在编码过程中出现的编译错误,编译器会在代码编写的过程中就进行警告,这两种情况试有所区别的。

“运行时“程序已经经过了编译得到了class文件,再由JVM执行过程中出现的错误

防御式的编程
LBYL:Look Before You Leap.“未雨绸缪”在操作之前就将自己预想可能会发生的情况作出充分的检查
EAFP:It is Easier to Ask Forigiveness than Permission.”事后获取原谅比事前更容易。先进行操作,如果出现问题,再进行处理

2.异常的基本用法
捕获异常的基本语法

try{ 
有可能出现异常的语句;
}[catch (异常类型 异常对象)]{ 
}...]
[finally{ 
异常的出口
}]

try 代码块中放的是可能出现异常的代码
catch 代码块中放的是出现异常后的处理行为
fina 代码块中的代码用于处理善后工作,会在最后执行
其中catch和finally都可以根据情况选择加或者不加

3.异常处理的流程
程序先执行try中的代码
如果try中的代码出现异常,就会结束try中的代码,看和catch中的异常类型是否匹配
如果找到匹配的异常类型,就会执行catch中的代码
如果没有找到匹配的异常类型,就会将异常向上传递到上层调用者
无论是否找到匹配的异常类型,finally中的代码都会被执行到(在该方法结束之前执行)
如果上层调用者没有处理的异常,就继续向上传递
一直到main方法也没有合适的代码处理异常,就会交给JVM来进行处理,此时程序就会异常终止

4.抛出异常
有时,我们也可以根据编码需要,手动的抛出某个异常,使用throw关键字完成这个操作

public static void main(String[] aegs)
{ 
	System.out.println(divide(10,0));
}
public static int divide(int x,int y)
{ 
	if(y==0){ 
	throw new ArithmeticException("抛出0异常");
	}
	return x/y;
}

5.java异常的体系

其中Error指的是java运行时内部错误的资源耗尽错误,应用程序不会抛出此类异常,这种内部错误一旦出现,除了告知用户并使程序终止之外,没有其他的处理办法
Exceotion是程序员所使用的异常类的父类

6.自定义异常类

import java.util.Scanner;

class UserError extends Exception{ 
    public UserError(String message){ 
        super(message);
    }
}

class PasswordError extends Exception{ 
    public PasswordError(String message)
    { 
        super(message);
    }
}

public class Test{ 
    private static String username="admin";
    private static String password="123456";

    public void login(String userName,String passWord)throws UserError,PasswordError{ 
        if(!Test.username.equals(userName))
        { 
            throw new UserError("用户名错误");
        }
            if(!Test.password.equals(passWord))
            { 
                throw new PasswordError("密码错误");
            }

            System.out.println("登录成功!");
        }


public static void main(String[] args)
{ 
    Scanner sc=new Scanner(System.in);
    while (sc.hasNextLine())
    { 
        String name=sc.nextLine();
        String num=sc.nextLine();

    try
    { 
        Test test1=new Test();
        test1.login(name,num);
    }catch(UserError userError){ 
        userError.printStackTrace();
    }
    catch(PasswordError passwordError)
    { 
        passwordError.printStackTrace();
    }
}

}
}

本示例为一个简易的登录系统,着重体现了自定义异常这一内容,自定义了两种异常,分别为 用户名不匹配和密码不匹配异常。

使用try catch 语句,提前预想了可能会出现异常的情况,在关键的login函数中,传入用户名和密码的参数,在try之后的语句中与提前定义好的参数进行比较,根据情况判断决定是否执行catch中的语句,最终实现自己自定义抛出异常这一功能

本文地址:https://blog.csdn.net/qq_45742383/article/details/114266329