Java------异常处理机制
2020-04-03 16:11:37来源:博客园 阅读 ()
Java------异常处理机制
一、什么是异常处理
异常处理从字面的意思来讲就是一种发生在 java 程序中的错误并对其处理,但对程序员而言,异常的处理不单单的简单去处理异常,就 ok 了,还有众多的概念和使用异常的方式方法需要掌握
异常在 java 中分有三种:
1、编译时异常(受检异常)------> 这种异常发生的概率很高;
2、运行时异常 ------> 这种异常发生的概率较低,发生时直接退出 JVM;
3、错误(error)-----> 错误和异常是不同,错误其实是脱离了程序员控制的问题,错误在代码中经常被忽略。比如内存溢出,在编译过程也是发现不了的;
如上图可以看出受检异常与运行时异常都继承于 Exception 类, 而 Exception 与 Error 继承 Throwable 类,最终它们的父类都是 Object;
二、处理异常的方式有哪些
处理异常的方式有两种:
1、throws <上抛>:在需要进行异常处理的方法体上加上 <throws 异常列表>,该方法体的异常将不会被本方法进行处理,如果谁调用该方法,则调用该方法的同时将异常一起调用。当然调用该方法的方法可以进行处理该异常,也可以使用被调用的方法一样的方式对异常进行抛出。
这样的操作其实只是将异常交给了其他的程序处理,如果其他程序没有能力进行处理,则将一直进行抛出,直到遇见一个能够处理该异常的程序,并终止异常(该如何处理该异常呢?);
通过一个程序来更深次的了解 throws 如何处理异常:
1 1 import java.io.FileInputStream; 2 2 import java.io.FileNotFoundException; 3 3 4 4 /** 5 5 * throws 的深层次理解 6 6 */ 7 7 public class Test17 { 8 8 9 9 // public static void main(String[] args) throws FileNotFoundException{ // 当然这里也可以直接使用父类 Exception 10 10 11 11 public static void main(String[] args) throws Exception{ 12 12 13 13 System.out.println("我是入口"); 14 14 15 15 m1(); 16 16 } 17 17 18 18 public static void m1() throws FileNotFoundException{ 19 19 // 从m1 - m3 的调用可以看出 throws 处理机制是不对异常处理,只是抛出异常,谁调用该异常,谁处理,最终会流向哪里处理呢? 20 20 21 21 System.out.println("m1...start!"); 22 22 m2(); // m1() 也同样出现了异常 23 23 System.out.println("m1...end!"); 24 24 } 25 25 26 26 public static void m2() throws FileNotFoundException{ 27 27 // 28 28 29 29 System.out.println("m2...start!"); 30 30 m3(); // 从这个地方我们就可以看出了当 m2()进行调用 m3()时,m2() 方法体也出现需要处理的异常 31 31 // 同样的可以依照 m3() 方法进行处理 32 32 33 33 System.out.println("m2...end!"); 34 34 } 35 35 36 36 // public static void m3() throws NullPointerException{ 37 37 // 已经对该方法体进行了抛出异常的设置,为什么是无效的? 38 38 // NullPointerException 因为这个是一个空指针的异常,它不对 IO 流的异常进行处理 39 39 40 40 public static void m3() throws FileNotFoundException { 41 41 // FileNotFoundException 异常机制对 m3 起到了效果,主要因为 FileNotFoundException 继承 IOException; 42 42 43 43 FileInputStream fis = new FileInputStream("E:\\jaa 作业室\\temp.java"); 44 44 // FileInputStream 是一个继承了异常基本类的 IO 流; 所以同样在使用它的时候程序员就需要对它进行处理 45 45 46 46 System.out.println("m3...end!"); 47 47 } 48 48 } 49 49 /** 看看如果读取的路径出现错误会发生什么结果吧 50 50 * 我是入口 51 51 * m1...start! 52 52 * m2...start! 53 53 * // 这里也出现一了一件有意思的事情: 54 54 * // 每个方法体中只有在 异常 前的值被输出,紧跟异常之后的值直接不被读取了 55 55 * // 从中得出一个结论: 一个方法中通过 throws 抛出的异常,在被调用时,调用者与被调用本身,异常之后的代码将被执行中断,不会输出结果,异常前的值会进行输出 56 56 * 57 57 * 58 58 * Exception in thread "main" java.io.FileNotFoundException: E:\jaa 作业室\temp.java (系统找不到指定的路径。) 59 59 * // 这里就是异常的处理结果了: Exception in thread "main" java.io.FileNotFoundException: E:\jaa 作业室\temp.java (系统找不到指定的路径。) 60 60 * // 是不是发现奇妙的事情:各个方法体不断的对异常抛出,最后在 main 方法中进行了异常处理,那为什么方法体中就不能处理,只能在 main 中处理呢? 61 61 * // 其实 main 方法是主调方法,是一切程序的入口,方法体只有被 main 调用才能输出结果,(当然后面还有一种方法可以在方法体中处理)而异常的处理其实 62 62 * // 也不是在 main 方法中处理的,可以看到 main 方法体上也出现了抛出异常的设置, 其实在程序员不能看到的 JVM 中,程序将异常最终交给了 63 63 * // FileNotFoundException 类处理该异常。 64 64 * 65 65 * 66 66 * at java.base/java.io.FileInputStream.open0(Native Method) 67 67 * at java.base/java.io.FileInputStream.open(FileInputStream.java:213) 68 68 * at java.base/java.io.FileInputStream.<init>(FileInputStream.java:155) 69 69 * at java.base/java.io.FileInputStream.<init>(FileInputStream.java:110) 70 70 * 71 71 * at Rview.Test17.m3(Test17.java:43) 72 72 * at Rview.Test17.m2(Test17.java:30) 73 73 * at Rview.Test17.m1(Test17.java:22) 74 74 * at Rview.Test17.main(Test17.java:15) 75 75 * // 这里表示的是异常出现的行号索引 76 76 */Throws 深层次理解
2、try...catch... <捕捉,处理异常>: 捕捉有可能发生异常的代码,并将它处理,不会对异常抛出,只会终止异常的向后发展
通过一个程序来了解 try...catch... 如何处理异常:
1 1 import java.io.FileInputStream; 2 2 import java.io.FileNotFoundException; 3 3 import java.io.FileOutputStream; 4 4 import java.io.IOException; 5 5 6 6 /** 7 7 * try...catch... 的使用方法和重点 8 8 */ 9 9 10 10 // 这是一个与 Test17 相同的程序,但我们需要对这个程序使用使用不同的异常处理机制 11 11 12 12 public class Test18 { 13 13 14 14 public static void main(String[] args) { 15 15 16 16 m1(); 17 17 } 18 18 19 19 public static void m1(){ 20 20 21 21 System.out.println("m1...start!"); 22 22 m2(); 23 23 System.out.println("m1...end!"); 24 24 } 25 25 26 26 public static void m2(){ 27 27 28 28 System.out.println("m2...start!"); 29 29 m3(); 30 30 System.out.println("m2...end!"); 31 31 } 32 32 33 33 34 34 35 35 public static void m3(){ 36 36 37 37 38 38 // try...catch... 的重点: 可以在发生异常点进行直接处理异常,当其他调用者调用时将不会发现该方法曾经有过异常的情况,同时也不会将异常感染 39 39 // 给调用者,总之可以直接对异常直接处理 40 40 41 41 // try...catch...不仅仅只能对单个异常进行捕捉处理,同时可以对多个不同类型的异常进行处理 42 42 try { 43 43 FileInputStream fis = new FileInputStream("E:\\java\\作业室\\temp.java"); 44 44 // try 中将可能发生异常的代码段进行捕捉 45 45 fis.close(); // 再次出现了一个异常,再处理 46 46 47 47 // 以上代码出现异常,直接进入 catch 分支,不对其后的代码进行编译; 48 48 System.out.println("hello "); 49 49 } 50 50 catch (FileNotFoundException e/*必须要加变量名*/) { /*将捕捉到的异常进行处理*/ 51 51 52 52 // e.printStackTrace(); // 显示处理结果的方法 53 53 54 54 System.out.println("出现了异常,已经处理!!"); 55 55 56 56 }catch (IOException e){ 57 57 // 已经进行了异常处理,为什么出现了错误? 58 58 // 两个 catch 对不同的异常进行了处理,但是,前一个 catch 的异常处理类是最高类 Exception,而后一个 catch 的异常处理类 59 59 // FileNotFoundException 是 Exception 的一个子类,所以在进行多次的 catch 异常处理时注意子类与父类的位置关系 60 60 //(子类在前、父类在后 或者 同时是子类) 61 61 e.printStackTrace(); 62 62 } 63 63 // 同样要进行异常处理,这次我们将使用 try... catch... 的方式处理 64 64 65 65 System.out.println("m3...end!"); 66 66 } 67 67 } 68 68 69 69 /** output result: 70 70 * m1...start! 71 71 * m2...start! 72 72 * m3...end! 73 73 * // 奇妙的事情又发生了,使用 try... catch...的方式处理异常并不影响异常之后的代码运行 74 74 * 75 75 * m2...end! 76 76 * m1...end! 77 77 * 78 78 * 79 79 * java.io.FileNotFoundException: E:\java\作业室\temp.java (系统找不到指定的路径。) 80 80 * // 这个结果的输出靠 printStackTrace() 方法; 81 81 * 82 82 * at java.base/java.io.FileInputStream.open0(Native Method) 83 83 * at java.base/java.io.FileInputStream.open(FileInputStream.java:213) 84 84 * at java.base/java.io.FileInputStream.<init>(FileInputStream.java:155) 85 85 * at java.base/java.io.FileInputStream.<init>(FileInputStream.java:110) 86 86 * 87 87 * 88 88 * at Rview.Test18.m3(Test18.java:42) 89 89 * at Rview.Test18.m2(Test18.java:30) 90 90 * at Rview.Test18.m1(Test18.java:23) 91 91 * at Rview.Test18.main(Test18.java:17) 92 92 * // 同样是异常出现所在的行号索引 93 93 */try...catch 处理方式
原文链接:https://www.cnblogs.com/evething-begins-with-choice/p/12629123.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Java笔记:数组,异常,泛型 2020-06-08
- Spring Cloud Gateway 全局通用异常处理 2020-06-08
- 聊聊 OAuth 2.0 的 Token 续期处理 2020-06-08
- 架构设计 | 异步处理流程,多种实现模式详解 2020-06-04
- SpringCloud异常处理统一封装我来做-使用篇 2020-05-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash