wordpress模板站,营销团队,朔州网络推广,在哪个网站做科目一考试题目录 一、异常是什么
1.异常的概念
2.异常的分类
二、异常的处理
1.防御式编程
2.#xff08;异常的抛出#xff09;throw的使用
3.异常的声明-throws
4.捕获异常-try-catch捕获并处理异常
5.finally关键字起到
三、异常的处理流程
四、总结 一、异常是什么
1.异常…目录一、异常是什么1.异常的概念2.异常的分类二、异常的处理1.防御式编程2.异常的抛出throw的使用3.异常的声明-throws4.捕获异常-try-catch捕获并处理异常5.finally关键字起到三、异常的处理流程四、总结一、异常是什么1.异常的概念异常是指在程序执行过程中发生的意外或错误情况这些情况会中断正常的程序流程。异常通常由程序无法控制的内部或外部因素引发例如无效输入资源不足或逻辑错误。2.异常的分类2.1异常分为1编译时异常除了RuntimeException在代码编译阶段被检测到的错误通常由语法错误或类型不匹配引起。这类异常必须修复后才能成功编译。public class Person { private String name; private String gender; int age; // 想要让该类⽀持深拷⻉覆写Object类的clone⽅法即可 Override public Person clone() { return (Person)super.clone();//这里会报错你要声明这里会报CloneNotSupportedException这个异常 } } 编译时报错 Error:(17, 35) java: 未报告的异常错误java.lang.CloneNotSupportedException; 必须对其进⾏捕获或声明以便抛出2运行时异常RuntimeException在程序运行过程中发生的错误例如空指针引用、数组越界或算术溢出。这类异常可能不会立即导致程序崩溃但会破坏正常逻辑。运行后窗口报错Exception3逻辑异常由程序逻辑错误引发的异常例如无限循环或错误的业务规则。这类异常需要通过代码审查和测试来发现。2.2 异常就是一个类Error类这是java虚拟机无法解决的严重问题比如jvm的内部错误、资源耗尽典型代表StackOverflowError和OutOfMemoryError一旦发生回力乏术。Exception类异常产生后程序员可以通过代码进行处理使程序继续执⾏。⽐如感冒、发烧。我 们平时所说的异常就是Exception。二、异常的处理1.防御式编程错误在代码中是客观纯在的。因此我们要让程序出现问题的时候及时通知程序员。1.1LBYL:Look Before You Leap.在操作之前就做充分的检查.即事前防御型boolean ret false; ret 登陆游戏(); if (!ret) { 处理登陆游戏错误; return; } ret 开始匹配(); if (!ret) { 处理匹配错误; return; } ret 游戏确认(); if (!ret) { 处理游戏确认错误; return; } ret 选择英雄(); if (!ret) { 处理选择英雄错误; return; } ret 载⼊游戏画⾯(); if (!ret) { 处理载⼊游戏错误; return; } ......缺陷正常流程和错误处理流程代码混在⼀起,代码整体显的⽐较混乱2.EAFP:Its Easier to Ask Forgiveness than Permission.先正常运行遇到问题再解决事后认错try { 登陆游戏(); 开始匹配(); 游戏确认(); 选择英雄(); 载⼊游戏画⾯(); ... } catch (登陆游戏异常) { 处理登陆游戏异常; } catch (开始匹配异常) { 处理开始匹配异常; } catch (游戏确认异常) { 处理游戏确认异常 } catch (选择英雄异常) { 处理选择英雄异常; } catch (载⼊游戏画⾯异常) { 处理载⼊游戏画⾯异常; } ......优势正常流程和错误流程是分离开的,程序员更关注正常流程代码更清晰容易理解代码 异常处理的核⼼思想就是EAFP针对eafp型解决方案我们有五方面的学习使用throw、try、catch、finally、throws2.异常的抛出throw的使用在java中我们通过throw来抛出一个指定的异常对象将错误信息告知给调用者具体语法如下throw new XXXException(异常产生的原因)注意事项1.throw必须在方法体内部2.抛出的对象必须是Exception 或者 Exception的子类对象3.如果抛出的是RunTimeException或者RunTimeException的子类则可以直接交给jvm来处理4.如果抛出的是编译时异常用户必须处理否则无法通过编译5.异常一旦抛出其后的代码就不会执行3.异常的声明-throwsthrows 关键字⽤于在⽅法声明中列出该⽅法可能抛出的异常它告诉调⽤者这个⽅法可能会抛出某 些异常调⽤者需要处理这些异常。使⽤throws 实际上是将异常的处理责任转移给了调⽤该⽅法 的代码public static void funcction(int a) throws CloneNotSupportedException{ if(a 10){ throw new CloneNotSupportedException(); } }注意1.throws必须跟在方法的参数列表之后2.声明的异常必须是Exception 或者Exception的子类3.方法内部如果抛出了多个异常throws之后必须跟多个异常类型之间用逗号隔开如果抛出多个异常类型具有父子关系直接声明父类即可。public class Config { File file; // FileNotFoundException 继承⾃ IOException public void OpenConfig(String filename) throws IOException{ if(filename.endsWith(.ini)){ throw new IOException(⽂件不是.ini⽂件); } if(filename.equals(config.ini)){ throw new FileNotFoundException(配置⽂件名字不对); }4.调用声明抛出异常的方法时如果该异常是编译时异常时调用者必须处理或者继续使用throws抛出public static void main(String[] args) throws IOException { Config config new Config(); config.openConfig(config.ini); }将光标放在抛出异常方法上altInsert快速处理4.捕获异常-try-catch捕获并处理异常throws对异常并没有真正处理⽽是将异常报告给抛出异常⽅法的调⽤者由调⽤者处理。如果真正 要对异常进⾏处理就需要try-catch。语法格式try{ //将可能出现异常的代码 }catch(要捕获的异常类型 e){ //对异常的正常处理处理完成跳出try-catch }finally{ //一定会执行的代码 }//finally可添加可不添加看自己需求实例public class Config { File file; public void openConfig(String filename) throws FileNotFoundException{ if(!filename.equals(config.ini)){ throw new FileNotFoundException(配置⽂件名字不对); } // 打开⽂件 } public void readConfig(){ } public static void main(String[] args) { Config config new Config(); try { config.openConfig(config.txt); System.out.println(⽂件打开成功); } catch (IOException e) { // 异常的处理⽅式 //System.out.println(e.getMessage()); // 只打印异常信息 //System.out.println(e); // 打印异常类型异常信息 e.printStackTrace(); // 打印信息最全⾯ } // ⼀旦异常被捕获处理了此处的代码会执⾏ System.out.println(异常如果被处理了这⾥的代码也可以执⾏); } }IOException是编译时异常的父类哦注意事项1.try代码块内抛出异常位置后的代码将不会执行2.如果抛出异常类型与catch里的异常类型不匹配即异常不会被成功捕获也就不会被处理继续往抛直到jvm收到后中断程序3.try中可能会抛出多个不同的异常对象则必须用多个catch来捕获public static void main(String[] args) { int[] array {1, 2, 3}; try { System.out.println(before); // array null; System.out.println(array [100]); System.out.println(after); } catch (ArrayIndexOutOfBoundsException e) { System.out.println(这是个数组下标越界异常); e.printStackTrace(); } catch (NullPointerException e) { System.out.println(这是个空指针异常); e.printStackTrace(); } System.out.println(after try catch); }如果多个异常的处理⽅式是完全相同,也可以写成这样catch (ArrayIndexOutOfBoundsException | NullPointerException e) { ... }如果异常之间具有⽗⼦关系⼀定是⼦类异常在前catch⽗类异常在后否则子类异常不会运行4. 可以通过⼀个catch捕获所有的异常即多个异常⼀次捕获public static void main(String[] args) { int[] arr {1, 2, 3}; try { System.out.println(before); arr null; System.out.println(arr[100]); System.out.println(after); } catch (Exception e) { e.printStackTrace(); } System.out.println(after try catch); }不推荐因为这样写不知道自己怎么解决对应的异常乱喝药的感觉5.finally关键字起到5.1在写程序时有些特定的代码不论程序是否发⽣异常都需要执⾏⽐如程序中打开的资源⽹络 连接、数据库连接、IO流等在程序正常或者异常退出时必须要对资源进进⾏回收。另外因为异常会引发程序的跳转可能导致有些语句执⾏不到finally就是⽤来解决这个问题的问题既然finally和try-catch-finally后的代码都会执⾏那为什么还要有finally呢看下面的代码public class TestFinally { public static int getData(){ Scanner sc null; try{ sc new Scanner(System.in); int data sc.nextInt(); return data; }catch (InputMismatchException e){ e.printStackTrace(); }finally { System.out.println(finally中代码); } System.out.println(try-catch-finally之后代码); if(null ! sc){ sc.close(); } return 0; } public static void main(String[] args) { int data getData(); System.out.println(data); } } // 正常输⼊时程序运⾏结果 100 finally中代码 100上述程序如果正常输⼊成功接收输⼊后程序就返回了try-catch-finally之后的代码根本就没有执 ⾏即输⼊流就没有被释放造成资源泄漏。存在即合理注意finally中的代码一定会执行一般用来做资源清理的扫尾工作。在finally中尽量不要用return编译器警告三、异常的处理流程关于调⽤栈⽅法之间是存在相互调⽤关系的,这种调⽤关系我们可以⽤调⽤栈来描述.在JVM中有⼀块内存空 间称为虚拟机栈专⻔存储⽅法之间的调⽤关系.当代码中出现异常的时候,我们就可以使⽤ e.printStackTrace(); 的⽅式查看出现异常代码的调⽤栈.看下面的例子如果本⽅法中没有合适的处理异常的⽅式,就会沿着调⽤栈向上传递public static void main(String[] args) { try { func(); } catch (ArrayIndexOutOfBoundsException e) { e.printStackTrace(); } System.out.println(after try catch); } public static void func() { int[] array {1, 2, 3}; System.out.println(array[100]); }、运行结果at后的错误就是通过e.printStackTrace()这个显示的如果向上⼀直传递都没有合适的⽅法处理异常,最终就会交给JVM处理,程序就会异常终⽌(和我们最开 始未使⽤try-catch时是⼀样的).public static void main(String[] args) { func(); System.out.println(after try catch); } public static void func() { int[] arr {1, 2, 3}; System.out.println(arr[100]); }运行结果(明显after try catch没有打印)也就是说异常没有处理一直向上传递最后到jvm。异常处理流程总结:1.程序先执行try中的代码2.如果try中的代码出现异常就会结束try中的代码看和catch中的异常类型是否匹配。3.如果找到匹配的异常类型就会执行catch代码4.如果没有找到匹配的异常类型就会将异常向上传递到上层调用者。5.无论是否找到匹配的异常类型finally中的代码都会被执行到在该方法结束之前执行。6.如果上层调用者也没有处理了异常就会继续向上传递。7.一直到main方法也没有合适的代码处理异常就会交给jvm来进行处理此时程序就会终止。四、总结看到这里想必你对java中异常有了一定的了解还有问题评论区留言。最后可以写一个用户登录功能用异常让自己更加熟练