异常.
Throwable 类:
javal.lang.Throwable : 是 Java 中所有错误或异常的父类.
子类: 1,Exception: 编译期异常: 子类: RuntimeException: 运行期异常. 处理后程序可继续运行
2,Error: 错误, 必须修改后才能继续运行.
异常产生过程的解析:
- public static void main(String[] args) {
- int[] arr={1,2,3};
- int result= getElement(arr,3);
- System.out.println(result);
- }
- public static int getElement(int[] arr,int index){
- return arr[index];
- }
1: 数组访问越界, JVM 出现异常, 做两件事:
第一: JVM 根据异常产生的原因, 创建一个异常对象, 这个对象包含异常产生
内容, 原因, 位置. new ArrayIndexOutOfBoundsException("3")
第二: 在 getElement 方法中, 没有逻辑处理 (try..catch..),JVM 会将对象给调用该
方法的 main 方法处理.
2:main 方法接收到了异常对象, 但 main 也没有处理程序, 所以给 main 的调用者, JVM.
3:JVM 做两件事: 第一: 打印异常对象. 第二: JVM 会终止程序.
处理异常:
1,throw 关键字:
可以使用 throw 关键字在指定的方法中抛出指定的异常.
2, 使用格式:
throw new xxxException("异常产生的原因")
3, 注意:
1,throw 关键字必须写在方法的内部.
2,throw 关键字后面 new 的对象必须是 Exception 或其子类对象.
3,throw 抛出异常, 我们就必须处理:
如果是 RuntimeException 或其子类的对象, 默认给 JVM 处理 (打印, 中断)
如果是编译异常, 要么 throws, 要么 try catch.
- public static int getElement(int[] arr,int index){
- if (index<0||index>arr.length-1){
- throw new IndexOutOfBoundsException("数组访问越界");
- }
- return arr[index];
- }
异常处理第一种方式: 声明异常 throws:
交给别人处理:
作用:
当方法内部抛出异常对象的时候, 那么我们就必须处理这个异常对象.
可以使用 throws 关键字, 把异常对象给方法的调用者处理, 最终是给 JVM 处理.
使用格式: 在方法声明时使用.
修饰符 返回值类型 方法名 ()throws AAAException,BBBException{
- throw new AAAException();
- throw new BBBException();
- }
注意:
1,throw 关键字必须写在方法声明处.
2, 异常必须是 Exception 或其子类.
3, 如果方法内有多个异常, 也要声明多个异常. 如果有父子类关系, 申明父类即可.
4, 调用了一个申明了异常的方法, 就必须处理异常: 要么继续抛出, 给 JVM. 要么自己处理.
- public static void main(String[] args) throws FileNotFoundException {
- readFile("d\\a.txt");
- }
- public static void readFile(String fileName) throws FileNotFoundException{
- if (!fileName.equals("C:\\a.txt")){
- throw new FileNotFoundException("文件名错误");
- }
- }
缺陷: JVM 处理异常后, 会中断程序, 后续代码不会执行.
异常处理第二种方式: try...catch:
自己处理.
格式:
try{
可能产生异常的代码
}catch(定义一个异常变量, 用来接收 try 中抛出的异常对象){
异常的逻辑处理. 一般在工作中会把异常信息记录到日志中.
}catch(){
} catch 可有多个.
注意事项:
1,try 中可能有多个异常对象, 可以用多个 catch 处理.
2,try 中产生了异常, 则执行 catch 中的逻辑处理.
- public static void main(String[] args) {
- try {
- readFile("d\\a.txt");
- } catch (FileNotFoundException e) {
- System.out.println("文件名输入错误!");
- }
- System.out.println("后续代码");
- }
- public static void readFile(String fileName) throws FileNotFoundException{
- if (!fileName.equals("C:\\a.txt")){
- throw new FileNotFoundException("文件名错误");
- }
- }
Throwable 处理异常的三个方法:
1,String getMessage() 返回异常的简短描述.
2,String toString() 异常的详细消息字符串.
3,Void printStackTrace() 最全面的错误信息.
- public static void main(String[] args) {
- try {
- readFile("d\\a.txt");
- } catch (FileNotFoundException e) {
- System.out.println(e.getMessage());
- System.out.println(e.toString());
- e.printStackTrace();
- }
- System.out.println("后续代码");
- finally:
无论是否出现异常, 都会执行.
一般用于, 资源释放.
多异常处理:
一个 try 多个 catch:
注意: catch 里定义的异常变量, 如果有子父类关系, 要把子类异常变量写在上边.
因为: 抛出的异常对象, 会从上到下给 catch, 如果父类写在上面, 因为多态, 后面的 catch 不会被用到, 会出错.
多个异常, 一次捕获, 多次处理, 多态, 变量用 Exception 类型.
子父类异常:
父类异常时怎么样, 子类异常就怎么样:
子类重写父类方法时, 可以:
1, 抛出和父类相同的异常. 2, 抛出父类异常的子类异常. 3, 不抛出异常
4, 父类方法没有抛出异常时, 子类只能捕获处理, 不能抛出.
自定义异常:
格式:
public class XXXException extends Exception | RuntimeException{
空参构造方法
异常信息构造方法
}
注意:
1, 一般以 Exception 结尾.
2, 必须继承 Exception 或 RuntimeException
:Exception: 编译期异常, 抛出或捕获处理
:RutimeException: 运行时异常, JVM 处理, 中断.
- public class MyException extends Exception {
- public MyException(){
- super();
- }
- public MyException(String message){
- super(message);
- }
- }
自定义异常练习:
- public class main {
- static String[] username={"Sam","Penny"};
- public static void main(String[] args) {
- System.out.println("输入要注册的用户名:");
- Scanner scanner=new Scanner(System.in);
- String name=scanner.next();
- CheckName(name);
- }
- public static void CheckName(String name){
- for (String username:username){
- if (username.equals(name)){
- try {
- throw new MyException("用户名已存在");
- } catch (MyException e) {
- System.out.println(e);
- return;
- }
- }
- }
- System.out.println("注册成功");
- }
来源: https://www.2cto.com/kf/201904/805464.html