java 异常
异常简介
java中有Error和Exception
Error:是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行操作无关,而表示运行时JVM出现的问题。
Exception:是程序本身可以处理的异常。
异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。
java中异常的分类
java的异常分为可查的异常和不可查的异常。
可查异常(编译器要求必须处理的异常)
不可查异常包括运行时异常和错误。
Exception这种异常分两大类运行时异常和非运行时异常(编译异常)。程序中应当尽可能去处理这些异常。
运行时异常:都是runtimeException类及其子类异常,如空指针异常、下标越界异常等,这些异常是不检查异常,程序中可以选择捕获,也 可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。运行时异常的特点是java编译器不会去检查它,也就是 说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
非运行时异常(编译异常):是runtimeException以外的异常,类型上属于Exception类及其子类。从程序语法角度讲是必须进行 处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况 下不自定义检查异常。
java的异常处理机制
抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。
捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器。潜在的异常处理器是异常发生时依次存留在调用栈而未找到合适的异常处理器,则运行时系统终止。同时,意味着java程序终止。
对于运行时异常、错误或可查异常,java技术所要求的异常处理方式有所不同。由于运行时异常的不可查性,为了更合理、更容易地实现应用程序,java规定,运行时异常将由java运行时系统制动抛出,允许应用呢程序忽略运行时异常。
对于方法运行中可能出现的error,当运行方法不欲捕捉时,java允许方法不做任何抛出声明。因为,大多数error异常属于永远不能被允许发生的状况,也属于合理的应用程序不该捕捉的异常。
对于所有的可查异常,java规定:一个方法必须捕捉,或者声明抛出方法之外。也就是说,当一个方法选择不捕捉可查异常时,它必须声明将抛出异常。
能够捕捉异常的方法,需要提供相符类型的异常处理器。所捕捉的异常,可能是由于自身语句所引发并抛出的异常,也可能是由某个调用的方法或者java 运行时系统等抛出的异常。也就是说,一个方法所能捕捉的异常,一定是java代码在某处所抛出的异常。简单的说,异常总是先被抛出,后被捕捉的。
try、catch、finally介绍
try块,用于捕获异常。其后接任意个catch块,如果没有catch块,则必须跟一个finally块。
catch块,用户处理try捕获到的异常。
finally块,无论是否捕获或处理异常,finally块里面的语句都会执行。
try-catch-finally规则(异常处理语句的语法规则):
1:必须在try之后添加catch或finally块。try块后可同时接catch和finally块,但至少有一个块。
2:必须遵循块顺序:若代码同时使用catch和finally块,则必须将catch块放在try块之后。
3:catch块与相应的异常类的类型相关。
4:一个try块可能有多个catch块。若如此,则执行第一个匹配块。即java虚拟机会把实际抛出的异常对象一次和各个catch代码块声明的异常类型匹配,如果异常对象为某个异常类型或其子类的实例,就执行这个catch代码块,不会再执行其他的catch代码块。
5:可嵌套try-catch-finally结构。
6:在try-catch-finally结构中,可重新抛出异常。
try,catch,finally语句块的执行顺序:
1:当try没有捕获到异常时:try语句块中的语句逐一被执行,程序将跳过catch语句块,执行finally语句块和其后的语句;
2:当try捕获到异常,catch语句块里没有处理此异常的情况:当语句块里的某条语句出现异常时,而没有处理此异常的catch语句块时,此异常将会抛出给JVM处理,finally语句块里的语句还是会被执行,但finally语句块后面的语句不会被执行;
3:当try捕获到异常,catch语句块里有处理此异常的情况:在try语句块中是按照顺序来执行的,当执行到某一条语句出现异常时,程序将跳到 catch语句块,并与catch语句块逐一匹配,找到与之对应的处理程序,其他的catch语句块将不会被执行,而try语句块中,出现异常之后的语句 也不会被执行,catch语句块执行完后,执行finally语句块里的语句,最后执行finally语句块后的语句。
throws抛出异常规则:
1.如果是不可查异常,即error,runtimeException或它们的子类,那么可以不使用throws关键字来声明要抛出的异常编译仍能顺利通过,但在运行时会被系统抛出。
2.必须声明可抛出的任何可查异常。即如果一个方法可能出现受可查异常,要么用try-catch语句捕获,要么用throws子句声明将它抛出,否则会导致编译错误。
3.仅当抛出了异常,该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者物理处理该异常的时候,应该继续抛出,而不会死囫囵吞枣。
4.调用方法必须遵循任何可查异常的处理和声明规则。若覆盖一个方法,则不能声明与覆盖方法不同的异常。声明的任何异常必须是被覆盖方法所声明异常的同类或子类。
java 异常的更多相关文章
- 浅谈java异常[Exception]
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 一. 异常的定义 在<java编程思想 ...
- 基础知识《十》java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
本文转载自 java 异常捕捉 ( try catch finally ) 你真的掌握了吗? 前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理 ...
- Java异常体系及分类
上图是基本的java异常体系结构. 主要分为2大类:Error和Exception 1.Error:描述了Java运行系统中的内部错误以及资源耗尽的情形.应用程序不应该抛出这种类型的对象,一般是由虚拟 ...
- Java异常之自定义异常
哎呀,妈呀,又出异常了!俗话说:"代码虐我千百遍,我待代码如初恋". 小Alan最近一直在忙着工作,已经很久没有写写东西来加深自己的理解了,今天来跟大家聊聊Java异常.Java异 ...
- 第11章 Java异常与异常处理
1.Java异常简介 1.什么是异常异常出现的时候代码会无法正常运行下去,会产生各种问题2.捕捉异常的作用提早发现异常,方便查找问题,并给出解决方法3.Java中的异常1.Java中所有不正常的类都是 ...
- java 异常
1.java异常 2.自定义抛出 3.运行时异常,程序有问题,让使用者可以改' ' 4.return 和 throw的区别 return 符合函数要求的值 throw 有问题的时候用它结束 ...
- 3.Java异常进阶
3.JAVA异常进阶 1.Run函数中抛出的异常 1.run函数不会抛出异常 2.run函数的异常会交给UncaughtExceptionhandler处理 3.默认的UncaughtExceptio ...
- 2.Java异常学习
1.Java异常的概念 异常的例子 1.除法就是一个需要捕获异常的例子,除数又可能是0 异常处理的基本流程如下 一旦发生异常,就使得程序不按照原来的流程继续的运行下去 a.程序抛出异常 try{ th ...
- java异常架构图 和几个面试题
1.java异常架构图 粉红色的是受检查的异常(checked exceptions),其必须被 try{}catch语句块所捕获,或者在方法签名里通过throws子句声明.受检查的异常必须在编译时被 ...
- 黑马----JAVA异常
黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA异常 一.JAVA异常有三种语句块:try语句块.catch语句块.finally语句块. 1.try语句 ...
随机推荐
- android通知栏总结
通知消息的发送 12-1:消息管理者 NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION ...
- ALLOCATE语句分配FORTRAN动态数组方法(转自http://blog.csdn.net/zhuxianjianqi/article/details/8067174)
数组的动态分配 a) 可分配数组 数组可以是静态的也可以是动态的.如果数组是静态的,则在编译时就被分配了固定的储存空间,并且直到程序退出时才被释放.程序运行时静态数组的大小不能改变.静态数组的缺 ...
- 利用javascript实现课程选择
最终实现的效果如下图所示: 代码如下所示: HTML代码部分: <body> <div class="page" style="overflow: hi ...
- 执行大量的Redis命令,担心效率问题?用Pipelining试试吧~
参考的优秀文章 Request/Response protocols and RTT 来源 原来,系统中一个树结构的数据来源是Redis,由于数据增多.业务复杂,查询速度并不快.究其原因,是单次查询的 ...
- VS下的解决方案目录结构设置和管理
转载:http://blog.csdn.net/pl20140910/article/details/52074165 为了方便管理自己写的代码,也为了日后工作能方便的查找之前做过相同的代码,仿照某源 ...
- [问题2014A11] 复旦高等代数 I(14级)每周一题(第十三教学周)
[问题2014A11] 设 \(n\) 阶方阵 \(A,B\) 满足: \((A+B)^2=A+B\), \(\mathrm{r}(A+B)=\mathrm{r}(A)+\mathrm{r}(B)\ ...
- winform开发框架之模块维护
前言:模块维护试图解决的问题, 模块加载只用MEF的方式: MEF(Managed Extensibility Framework)是一个用于创建可扩展的轻型应用程序的库. 应用程序开发人员可利用该库 ...
- FreeSWITCH中文语音包
一.中文语音资源的获取 官方提供的资源:http://files.freeswitch.org/releases/sounds/ 自己录音 实在不行可以@我给你发一份. 二.中文资源的安装 英文资源的 ...
- ThinkPHP配置信息
在index.php文件中设置常量: define('BIND_MODULE', 'Home'); 进行绑定默认访问的模块. 同样的,也可以在配置文件config.php中的配置数组中设置配置常量: ...
- 启动tomcat后struts框架报异常严重: Exception starting filter struts2 Unable to load configuration.
启动tomcat后struts框架报异常严重: Exception starting filter struts2 Unable to load configuration. 出现此异常是因为,str ...