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语句 ...
随机推荐
- 学习jQuery之旅
早就听说了Jquery的大名,一直没有细心的学习一下,通过阅读收集的一些资料,感觉Jquery真的很强大.决定开始自己的学习Jquery之旅.在这里不是为大家讲解Jquery(深知水平有限),只是将自 ...
- Dynamics AX 2012 R2 从代码中调用SSRS Report
平时,我们制作SSRS Report的方法主要有两种:使用Query或RDP.如果需要为报表传递参数,就要在代码中为报表参数赋值,然后在代码中调用报表.下面我总结下这两种报表在代码中传参和调用的方式: ...
- 编译android源码官方教程(6)编译内核
Building Kernels IN THIS DOCUMENT Selecting a kernel Identifying kernel version Downloading sources ...
- python day1 常用模块
键盘输入: python2.7 raw_input() python3 input() 键盘输入默认为字符串,可通过例如 int(input())方式,实现类型转换. ‘密文’输入: 仅python的 ...
- 20个Linux服务器安全强化建议(一)
Linux服务器安全对于保护用户数据.知识产权非常重要,同时还能减少你面对黑客的时间.在工作中,通常由系统管理员对Linux的安全负责,在这篇文章中,介绍了20条对Linux系统进行强化的建议.本文所 ...
- UVa 12299 RMQ with Shifts(移位RMQ)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: "Times New ...
- HDU 5795 A Simple Nim(简单Nim)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- C#中调用Matlab人工神经网络算法实现手写数字识别
手写数字识别实现 设计技术参数:通过由数字构成的图像,自动实现几个不同数字的识别,设计识别方法,有较高的识别率 关键字:二值化 投影 矩阵 目标定位 Matlab 手写数字图像识别简介: 手写 ...
- python成长之路【第四篇】:装饰器
实现装饰器的知识储备: 示例: def f1(): print("f1") 1.函数即“变量” #上面的示例中,函数f1为变量,它指向内存地址.而f1()表示函数执行. 2.高阶函 ...
- 整合Spring Data JPA与Spring MVC: 分页和排序
之前我们学习了如何使用Jpa访问关系型数据库.比较完整Spring MVC和JPA教程请见Spring Data JPA实战入门,Spring MVC实战入门. 通过Jpa大大简化了我们对数据库的开发 ...