当前位置: 首页 > news >正文

做家乡特产的网站单片机培训

做家乡特产的网站,单片机培训,区块链网站开发费用,wordpress在线培训异常指不期而至的各种状况#xff0c;如#xff1a;文件找不到、网络连接失败、除0操作、非法参数等。异常是一个事件#xff0c;它发生在程序运行期间#xff0c;干扰了正常的指令流程。 Java 异常的概念 Java语言在设计的当初就考虑到这些问题#xff0c;提出异常处理…异常指不期而至的各种状况如文件找不到、网络连接失败、除0操作、非法参数等。异常是一个事件它发生在程序运行期间干扰了正常的指令流程。 Java 异常的概念 Java语言在设计的当初就考虑到这些问题提出异常处理的框架的方案所有的异常都可以用一个异常类来表示不同类型的异常对应不同的子类异常目前我们所说的异常包括错误概念定义异常处理的规范在JDK1.4版本以后增加了异常链机制从而便于跟踪异常。 Java异常是一个描述在代码段中发生异常的对象当发生异常情况时一个代表该异常的对象被创建并且在导致该异常的方法中被抛出而该方法可以选择自己处理异常或者传递该异常。 Java 异常的体系结构 Java把异常当作对象来处理并定义一个基类java.lang.Throwable作为所有异常的超类。 在Java API中已经定义了许多异常类这些异常类分为两大类错误Error和异常Exception。 Java异常层次结构图如下图所示 从图中可以看出所有异常类型都是内置类Throwable的子类因而Throwable在异常类的层次结构的顶层。接下来Throwable分成了两个不同的分支一个分支是Error它表示不希望被程序捕获或者是程序无法处理的错误。另一个分支是Exception它表示用户程序可能捕捉的异常情况或者说是程序可以处理的异常。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常。Java异常又可以分为不受检查异常Unchecked Exception和检查异常Checked Exception。下面将详细讲述这些异常之间的区别与联系 ErrorError类对象由 Java 虚拟机生成并抛出大多数错误与代码编写者所执行的操作无关。例如Java虚拟机运行错误Virtual MachineError当JVM不再有继续执行操作所需的内存资源时将出现 OutOfMemoryError。这些异常发生时Java虚拟机JVM一般会选择线程终止还有发生在虚拟机试图执行应用时如类定义错误NoClassDefFoundError、链接错误LinkageError。这些错误是不可查的因为它们在应用程序的控制和处理能力之 外而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说即使确实发生了错误本质上也不应该试图去处理它所引起的异常状况。在Java中错误通常是使用Error的子类描述。 Exception在Exception分支中有一个重要的子类RuntimeException运行时异常该类型的异常自动为你所编写的程序定义ArrayIndexOutOfBoundsException数组下标越界、NullPointerException空指针异常、ArithmeticException算术异常、MissingResourceException丢失资源、ClassNotFoundException找不到类等异常这些异常是不检查异常程序中可以选择捕获处理也可以不处理。这些异常一般是由程序逻辑错误引起的程序应该从逻辑角度尽可能避免这类异常的发生而RuntimeException之外的异常我们统称为非运行时异常类型上属于Exception类及其子类从程序语法角度讲是必须进行处理的异常如果不处理程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常一般情况下不自定义检查异常。。 注意 Error和Exception的区别Error通常是灾难性的致命的错误是程序无法控制和处理的当出现这些异常时Java虚拟机JVM一般会选择终止线程Exception通常情况下是可以被程序处理的并且在程序中应该尽可能的去处理这些异常。 检查异常在正确的程序运行过程中很容易出现的、情理可容的异常状况在一定程度上这种异常的发生是可以预测的并且一旦发生该种异常就必须采取某种方式进行处理。 提示 除了RuntimeException及其子类以外其他的Exception类及其子类都属于这种异常当程序中可能出现这类异常要么使用try-catch语句进行捕获要么用throws子句抛出否则编译无法通过。 不受检查异常包括RuntimeException及其子类和Error。 提示 不受检查异常为编译器不要求强制处理的异常检查异常则是编译器要求必须处置的异常。 Java 异常的处理机制 Java的异常处理本质上是抛出异常和捕获异常。 抛出异常要理解抛出异常首先要明白什么是异常情形exception condition它是指阻止当前方法或作用域继续执行的问题。其次把异常情形和普通问题相区分普通问题是指在当前环境下能得到足够的信息总能处理这个错误。对于异常情形已经无法继续下去了因为在当前环境下无法获得必要的信息来解决问题你所能做的就是从当前环境中跳出并把问题提交给上一级环境这就是抛出异常时所发生的事情。抛出异常后会有几件事随之发生。首先是像创建普通的java对象一样将使用new在堆上创建一个异常对象然后当前的执行路径已经无法继续下去了被终止并且从当前环境中弹出对异常对象的引用。此时异常处理机制接管程序并开始寻找一个恰当的地方继续执行程序这个恰当的地方就是异常处理程序或者异常处理器它的任务是将程序从错误状态中恢复以使程序要么换一种方式运行要么继续运行下去。 举个简单的例子假使我们创建了一个学生对象Student的一个引用stu,在调用的时候可能还没有初始化。所以在使用这个对象引用调用其他方法之前要先对它进行检查可以创建一个代表错误信息的对象并且将它从当前环境中抛出这样就把错误信息传播到更大的环境中。 if(stu null){throw new NullPointerException(); } 这就抛出了异常它将在其他的地方得到执行或者处理具体是哪个地方后面将很快介绍代码中出现的 throw 是一个关键字暂时先不做过多讲解后面会详细讲解。 捕获异常在方法抛出异常之后运行时系统将转为寻找合适的异常处理器exception handler。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时即为合适的异常处理器。运行时系统从发生异常的方法开始依次回查调用栈中的方法直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适的异常处理器则运行时系统终止。同时意味着Java程序的终止。 提示 对于运行时异常、错误和检查异常Java技术所要求的异常处理方式有所不同。 由于运行时异常及其子类的不可查性为了更合理、更容易地实现应用程序Java规定运行时异常将由Java运行时系统自动抛出允许应用程序忽略运行时异常。 对于方法运行中可能出现的Error当运行方法不欲捕捉时Java允许该方法不做任何抛出声明。因为大多数Error异常属于永远不能被允许发生的状况也属于合理的应用程序不该捕捉的异常。 对于所有的检查异常Java规定一个方法必须捕捉或者声明抛出方法之外。也就是说当一个方法选择不捕捉检查异常时它必须声明将抛出异常。 Java异常处理涉及到五个关键字分别是try、catch、finally、throw、throws。下面将骤一介绍通过认识这五个关键字掌握基本异常处理知识。 异常处理的基本语法 1. try-catch try{//code that might generate exceptions }catch(Exception e){//the code of handling exception1 }catch(Exception e){//the code of handling exception2 } 要明白异常捕获还要理解监控区域guarded region的概念。它是一段可能产生异常的代码并且后面跟着处理这些异常的代码。 因而可知上述try-catch所描述的即是监控区域关键词try后的一对大括号将一块可能发生异常的代码包起来即为监控区域。Java方法在运行过程中发生了异常则创建异常对象。将异常抛出监控区域之外由Java运行时系统负责寻找匹配的catch子句来捕获异常。若有一个catch语句匹配到了则执行该catch块中的异常处理代码就不再尝试匹配别的catch块了。 提示 匹配的原则是如果抛出的异常对象属于catch子句的异常类或者属于该异常类的子类则认为生成的异常对象与catch块捕获的异常类型相匹配。 举个例子算术异常 public class TestException { public static void main(String[] args) { int a 1; int b 0; try { // try监控区域 if (b 0) throw new ArithmeticException(); // 通过throw语句抛出异常 System.out.println(a/b的值是 a / b); System.out.println(this will not be printed!);} catch (ArithmeticException e) { // catch捕捉异常 System.out.println(程序出现异常变量b不能为0); } System.out.println(程序正常结束。); } } 运行结果是 D:\javajava TestException程序出现异常变量b不能为0程序正常结束。 提示 显示一个异常的描述Throwable重载了toString()方法由Object定义所以它将返回一个包含异常描述的字符串。例如将前面的catch块重写成 catch (ArithmeticException e) { // catch捕捉异常 System.out.println(程序出现异常e); } 运行结果为 D:\javajava TestException程序出现异常java.lang.ArithmeticException程序正常结束。 根据前面讲述的算术异常属于运行时异常因而实际上该异常不需要程序抛出运行时系统自动抛出将例子改为如下 public class TestException { public static void main(String[] args) { int a 1; int b 0; System.out.println(a/b的值是 a / b);System.out.println(this will not be printed!);} } 运行结果如下 D:\javajava TestExceptionException in thread main java.lang.ArithmeticException: / by zeroat TestException.main(TestException.java:7) 使用多重的catch语句很多情况下由单个的代码段可能引起多个异常。处理这种情况我们需要定义两个或者更多的catch子句每个子句捕获一种类型的异常当异常被引发时每个catch子句被依次检查第一个匹配异常类型的子句执行当一个catch子句执行以后其他的子句将被旁路。 提示 Java通过异常类描述异常类型。对于有多个catch子句的异常程序而言应该尽量将捕获底层异常类的catch子句放在前面同时尽量将捕获相对高层的异常类的catch子句放在后面。否则捕获底层异常类的catch子句将可能会被屏蔽。 RuntimeException异常类包括运行时各种常见的异常ArithmeticException类和ArrayIndexOutOfBoundsException类都是它的子类。因此RuntimeException异常类的catch子句应该放在最后面否则可能会屏蔽其后的特定异常处理或引起编译错误。 嵌套try语句try语句可以被嵌套。也就是说一个try语句可以在另一个try块的内部。每次进入try语句异常的前后关系都会被推入堆栈。如果一个内部的try语句不含特殊异常的catch处理程序堆栈将弹出下一个try语句的catch处理程序将检查是否与之匹配。这个过程将继续直到一个catch语句被匹配成功或者是直到所有的嵌套try语句被检查完毕。如果没有catch语句匹配Java运行时系统将处理这个异常。 举个例子嵌套try class NestTry{public static void main(String[] args){try{int a args.length;int b 42 / a;System.out.println(a a);try{if(a 1){a a/(a-a);}if(a 2){int c[] {1};c[42] 99;}}catch(ArrayIndexOutOfBoundsException e){System.out.println(ArrayIndexOutOfBounds :e);} }catch(ArithmeticException e){System.out.println(Divide by 0 e);}} } 正如程序中所显示的该程序在一个try块中嵌套了另一个try块。程序工作如下当你在没有命令行参数的情况下执行该程序外面的try块将产生一个被0除的异常。程序在有一个命令行参数条件下执行由嵌套的try块产生一个被0除的异常由于内部的catch块不匹配这个异常它将把异常传给外部的try块在外部异常被处理。如果你在具有两个命令行参数的条件下执行该程序将由内部try块产生一个数组边界异常。 程序执行结果如下 D:\javajavac estTry.javaD:\javajava NestTryDivide by 0 java.lang.ArithmeticExceptio: / by zeroD:\javajava NestTry onea 1Divide by 0java.lang.ArithmeticException: / by zeroD:\javajava NestTry one twoa 2ArrayIndexOutOfBounds :java.lang.ArrayIndexOutOfBoundsException: 42 提示 当有方法调用时try语句的嵌套可以很隐蔽的发生。例如我们可以将对方法的调用放在一个try块中。在该方法的内部有另一个try语句。在这种情况下方法内部的try仍然是嵌套在外部调用该方法的try块中的。下面我们将对上述例子进行修改嵌套的try块移到方法nesttry()的内部 class NestTry{static void nesttry(int a){try{if(a 1){a a/(a-a);}if(a 2){int c[] {1};c[42] 99;}}catch(ArrayIndexOutOfBoundsException e){System.out.println(ArrayIndexOutOfBounds :e);} }public static void main(String[] args){try{int a args.length;int b 42 / a;System.out.println(a a);nesttry(a);}catch(ArithmeticException e){System.out.println(Divide by 0 e);}} } 结果输出与前面的例子一致 D:\javajavac NestTry.javaD:\javajava NestTryDivide by 0java.lang.ArithmeticException: / by zeroD:\javajava NestTry onea 1Divide by 0java.lang.ArithmeticException: / by zeroD:\javajava NestTry one twoa 2ArrayIndexOutOfBounds :java.lang.ArrayIndexOutOfBoundsException: 42 2. throw 到目前为止我们只是获取了被Java运行时系统引发的异常。然而我们还可以用throw语句抛出明确的异常。Throw的语法形式如下 throw ThrowableInstance;这里的ThrowableInstance一定是Throwable类类型或者Throwable子类类型的一个对象。简单的数据类型例如intchar,以及非Throwable类例如String或Object不能用作异常。有两种方法可以获取Throwable对象在catch子句中使用参数或者使用new操作符创建。 程序执行完throw语句之后立即停止throw后面的任何语句不被执行最邻近的try块用来检查它是否含有一个与异常类型匹配的catch语句。如果发现了匹配的块控制转向该语句如果没有发现次包围的try块来检查以此类推。如果没有发现匹配的catch块默认异常处理程序中断程序的执行并且打印堆栈轨迹。 例子创建并抛出异常 class TestThrow{static void proc(){try{throw new NullPointerException(demo);}catch(NullPointerException e){System.out.println(Caught inside proc);throw e;}}public static void main(String [] args){try{proc();}catch(NullPointerException e){System.out.println(Recaught: e);}} } 运行结果 D:\javajava TestThrowCaught inside procRecaught: java.lang.NullPointerException: demo 该程序两次处理相同的错误首先main()方法设立了一个异常关系然后调用proc()。proc()方法设立了另一个异常处理关系并且立即抛出一个NullPointerException实例NullPointerException在main()中被再次捕获。 该程序阐述了怎样创建Java的标准异常对象特别注意这一行 throw new NullPointerException(demo); 提示 此处new用来构造一个NullPointerException实例所有的Java内置的运行时异常有两个构造方法一个没有参数一个带有一个字符串参数。当用第二种形式时参数指定描述异常的字符串。如果对象用作print()或者println()的参数时该字符串被显示。这同样可以通过调用getMessage()来实现getMessage()是由Throwable定义的。 3. throws 如果一个方法可以导致一个异常但不处理它它必须指定这种行为以使方法的调用者可以保护它们自己而不发生异常。要做到这点我们可以在方法声明中包含一个throws子句。一个throws子句列举了一个方法可能引发的所有异常类型。这对于除了Error或RuntimeException及它们子类以外类型的所有异常是必要的。一个方法可以引发的所有其他类型的异常必须在throws子句中声明否则会导致编译错误。 下面是throws子句的方法声明的通用形式 public void info() throws Exception {//body of method } Exception 是该方法可能引发的所有的异常,也可以是异常列表中间以逗号隔开。 例子throws class TestThrows{static void throw1(){System.out.println(Inside throw1 . );throw new IllegalAccessException(demo);}public static void main(String[] args){throw1();} } 上述例子中有两个地方存在错误你能看出来吗 该例子中存在两个错误首先throw1()方法不想处理所导致的异常因而它必须声明throws子句来列举可能引发的异常即IllegalAccessException其次main()方法必须定义try/catch语句来捕获该异常。 正确的例子如下 class TestThrows{static void throw1() throws IllegalAccessException {System.out.println(Inside throw1 . );throw new IllegalAccessException(demo);}public static void main(String[] args){try {throw1();}catch(IllegalAccessException e ){System.out.println(Caught e);}} } 提示 Throws抛出异常的规则 如果是不受检查异常unchecked exception即Error、RuntimeException或它们的子类那么可以不使用throws关键字来声明要抛出的异常编译仍能顺利通过但在运行时会被系统抛出。 必须声明方法可抛出的任何检查异常checked exception。即如果一个方法可能出现受可查异常要么用try-catch语句捕获要么用throws子句声明将它抛出否则会导致编译错误 仅当抛出了异常该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候应该继续抛出而不是囫囵吞枣。 调用方法必须遵循任何可查异常的处理和声明规则。若覆盖一个方法则不能声明与覆盖方法不同的异常。声明的任何异常必须是被覆盖方法所声明异常的同类或子类。 4. finally 当异常发生时通常方法的执行将做一个陡峭的非线性的转向它甚至会过早的导致方法返回。例如如果一个方法打开了一个文件并关闭然后退出你不希望关闭文件的代码被异常处理机制旁路。finally关键字为处理这种意外而设计。 finally创建的代码块在try/catch块完成之后另一个try/catch出现之前执行。finally块无论有没有异常抛出都会执行。如果抛出异常即使没有catch子句匹配finally也会执行。一个方法将从一个try/catch块返回到调用程序的任何时候经过一个未捕获的异常或者是一个明确的返回语句finally子句在方法返回之前仍将执行。这在关闭文件句柄和释放任何在方法开始时被分配的其他资源是很有用。 提示 finally子句是可选项可以有也可以无但是每个try语句至少需要一个catch或者finally子句。 class TestFinally{static void proc1(){try{System.out.println(inside proc1);throw new RuntimeException(demo);}finally{System.out.println(proc1s finally);}}static void proc2(){try{System.out.println(inside proc2);return ;} finally{System.out.println(proc2s finally);}} static void proc3(){try{System.out.println(inside proc3);}finally{System.out.println(proc3s finally);}}public static void main(String [] args){try{proc1();}catch(Exception e){System.out.println(Exception caught);}proc2();proc3();} }该例子中proc1()抛出了异常中断了try它的finally子句在退出时执行。proc2的try语句通过return语句返回但在返回之前finally语句执行。在proc3()中try语句正常执行没有错误finally语句也被执行。 程序输出结果 D:\javajava TestFinallyinside proc1proc1s finallyException caughtinside proc2proc2s finallyinside proc3proc3s finally提示 如果finally块与一个try联合使用finally块将在try结束之前执行。 异常链 异常链顾名思义就是将异常发生的原因一个传一个串起来即把底层的异常信息传给上层这样逐层抛出。 Java API文档中给出了一个简单的模型 try { lowLevelOp(); } catch (LowLevelException le) { throw (HighLevelException) new HighLevelException().initCause(le); } 当程序捕获到了一个底层异常在处理部分选择了继续抛出一个更高级别的新异常给此方法的调用者。 这样异常的原因就会逐层传递。这样位于高层的异常递归调用getCause()方法就可以遍历各层的异常原因。 这就是Java异常链的原理。异常链的实际应用很少发生异常时候逐层上抛不是个好注意 上层拿到这些异常又能奈之何而且异常逐层上抛会消耗大量资源 因为要保存一个完整的异常链信息. 自定义异常 使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外用户还可以自定义异常。用户自定义异常类只需继承Exception类即可。 在程序中使用自定义异常类大体可分为以下几个步骤: 创建自定义异常类。在方法中通过throw关键字抛出异常对象。如果在当前抛出异常的方法中处理异常可以使用try-catch语句捕获并处理否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常继续进行下一步操作。在出现异常方法的调用者中捕获并处理异常。 举例自定义异常 class MyException extends Exception {private int detail;MyException(int a){detail a;}public String toString(){return MyException [ detail ];} } public class TestMyException{static void compute(int a) throws MyException{System.out.println(Called compute( a ));if(a 10){throw new MyException(a);}System.out.println(Normal exit!);}public static void main(String [] args){try{compute(1);compute(20);}catch(MyException me){System.out.println(Caught me);}} } 该例子完全按照上述步骤。 运行结果如下 D:\javajava TestMyExceptionCalled compute(1)Normal exit!Called compute(20)Caught MyException [20] 转载出处java入门之异常处理
http://www.hkea.cn/news/14305533/

相关文章:

  • 苏晋建设集团网站太原网站开发模板
  • 微信音乐做mp3下载网站网站开发设计实训总结
  • 长春公司推广网站电子商务网站优点
  • 杭州省建设厅网站长沙建设教育网
  • 有四川建设人才网这个网站吗标识设计案例
  • 尼尔的h版是那个网站做的网站备案那个省份
  • 律师行业网站建设html购物网页设计报告
  • 厦门官方网站建设网络规划是干什么的
  • 无忧网站建设福州鼓楼区建设局网站
  • 公司网站怎么做才高大上大企业网站样式
  • 网站内页产品 首页推荐网站的要素是什么意思
  • 秦皇岛网站制作专家教你简单建站科技袁人袁岚峰
  • 网站视频播放代码网站的会员认证怎么做
  • 网站开发培训机构哪个好杭州高端网站建设
  • 做网站要坚持qq空间网站根目录
  • 黄冈网站建设费用北京模板开发建站
  • 网站建设佰金手指科杰二八建设区块链网站
  • 怎么建设视频网站大连网站怎么推广
  • 网站的域名起什么好处刚做的婚恋网站怎么推广
  • 自己做网站需要钱吗初学者想学网站建设
  • 常州微信网站建设市场公司网站维护建设费入什么科目
  • 网站建设方案实例广告公司名字
  • 通州区建设局网站温州网络问政平台官网
  • 微软的网站开发软件做淘宝优惠卷网站步骤
  • 自己免费怎么制作网站吗腾讯企业邮箱怎么开通注册
  • 网站开发的运行可行性网站导航栏固定
  • 公司网站开发费入什么科目h5模板素材
  • 外汇跟单网站建设新的seo网站优化排名 排名
  • 企业家居网站建设宣城市市政建设集团公司网站
  • 营口网站建设单位seo如何使用wordpress优化