Java异常(Exception)
Java异常:运行期出现的错误
1. Java异常是Java提供的用于处理程序中错误的一种机制;
2. 错误指的是程序运行期间发生的异常事件,如除零溢出、数组下标越界、读取的文件不存在....
3. Java程序的执行过程中如出现异常事件,会生成一个异常类对象,该异常对象封装了异常事件的信息并将其提交给Java运行时系统,此过程称之为抛出异常(throw exception);
4. 当Java运行时系统接收到异常对象后,会寻找能处理这一异常的代码,并把当前异常对象交给其处理,此过程称之为捕获异常(catch exception);
5. 异常的分类:J2SDK中定义了很多异常类,这些异常类对应了各种各样可能出现的异常事件,如下图

① Error:称为错误(系统错误),你处理不了,由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理.
② Exception:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显示声明或捕获.
③RuntimeException:一类特殊的异常,如被0除、数组下标越界,其产生比较频繁,处理麻烦,如果显示的声明或捕获将会对程序可读性和运行的效率影响很大。因此由系 统自动检测并将他们交给缺省的异常处理程序(用户可不比对其处理).
6. try语句
① try{...} 语句指定了一段代码,该段代码就是一次捕获并处理例外的范围;
② 在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分别对这些异常作相应的处理;
③ 如果没有例外产生,所有的catch代码都被忽略,不执行.
7. catch语句
① 在catch语句块中是对异常进行处理的代码,每个try语句可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象;
② 在catch中声明的异常对象(catch(someException e))封装了异常事件发生的信息,在Catch语句块中可以使用这个对象的一些方法获取这些信息.
③ getMessage()方法,用来得到有关异常事件的信息;
printStackTrace()方法,用来跟踪异常事件发生时执行堆栈的内容;
一般而言,printStackTrace()方法用得比较多,它包含了getMessage()方法的内容,跟踪异常:如果一段代码可能发生异常是由于另外一段代码异常引起的,则它会打 印两段代码的异常信息,以及出错位置.
8. finally语句
① finally语句为异常处理提供了一个统一的出口,使得在控制流程转到程序的其它部分以前,能够对程序的状态做统一的管理;
② 无论try语句指定的程序块中是否抛出异常,finally所指定的代码都要被执行;
③ 通常在finally语句中进行资源的清除工作,如:关闭打开的文件、删除临时文件、释放非内存资源;
9. 除了在测试之外,在你实际当中编程的时候,在main方法中抛出Exception是相当不好的编程习惯,应该写try,catch作相应的处理;
10. 在一个try语句块中,父类异常的捕获语句不可以写在子类异常的捕获的上面,否则会覆盖子类的异常;
11. 使用自定义异常:
其中,自定义异常的步骤如下:
① 通过继承 java.lang.Exception类声明自己定义的异常;
② 在方法适当的位置,生成自定义异常的实例,并用 throw 语句抛出;
③ 在方法的声明部分用 throws 语句声明该方法可能抛出异常.
如 Demo_3 所示.
12. Demo
Demo_1
import java.io.*;
public class TestEx {
public static void main(String[] args){
FileInputStream in = null;
int b;
try {
in = new FileInputStream("myfile.txt");
b = in.read();
while(b != -1){
System.err.println((char)b);
b = in.read();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
in.close();
System.out.println("hello");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Demo_2
import java.io.*;
public class TestEx {
void m(int i) throws ArithmeticException{
if(i==0){
throw new ArithmeticException("被除数为0");
}
}
void f() throws FileNotFoundException, IOException {
FileInputStream in = new FileInputStream("myfile.txt");
int b;
b = in.read();
while(b != -1){
System.out.println((char)b);
b = in.read();
}
}
void g() throws Exception {
f();
}
public static void main(String[] args){
try {
new TestEx().g();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Demo_3
class MyException extends Exception {
private int id;
public MyException(String message, int id) {
super(message);
this.id = id;
}
public int getId(){
return id;
}
}
public class TestEx {
public void regist(int num) throws MyException{
if(num<0){
throw new MyException("人数为负值,不合理",3); //regist方法在这个地方抛出异常后,这个方法就不会继续往下执行了
}
System.out.println("登记人数: "+num);
}
public void manager(){
try {
regist(100);
// regist(-1);
} catch (MyException e) {
System.out.println("登记失败,出错类型:"+e.getId());
e.printStackTrace();
}
System.out.println("操作结束");
}
public static void main(String[] args){
TestEx te = new TestEx();
te.manager();
}
}
regist(100)的运行结果:登记人数: 100
操作结束
regist(-1)的运行结果:登记失败,出错类型: 3
操作结束
MyException: 人数为负值,不合理
at TestEx.regist(TestEx.java:15)
at TestEx.manager(TestEx.java:22)
at TestEx.main(TestEx.java:31)
13. 异常与继承之间的关系
在继承后,重写方法需要抛出与原来异常类型一致异常或不抛出异常.
class A{
public void method() throws IOException{}
}
class B1 extends A{ // 错误
public void method() throws FileNotFoudException{}
}
class B3 extends A{ // 正确
public void method(){}
}
class B4 extends A{ // 错误
public void method(){} throws IOException, MyException{}
}
Java异常(Exception)的更多相关文章
- 浅谈java异常[Exception]
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 一. 异常的定义 在<java编程思想 ...
- Java 异常Exception e中e的getMessage()和toString()以及 e.printStackTrace();方法的区别
Exception e中e的getMessage()和toString()方法的区别: 示例代码1: public class TestInfo { private static String ...
- java异常Exception
学习笔记: 一.程序的异常:Throwable 严重问题:Error ,我们不处理.这种问题一般很严重,不如内存溢出 问题:Exception 编译问题:不是RuntimeException异常.必须 ...
- Java 异常Exception e中e的getMessage()和toString()方法的区别
示例代码1: public class TestInfo { private static String str =null; public static void main(String[] arg ...
- Java异常 - Exception总结
这篇blog总结的比较详细了. 如下图所示,在Java中所有异常的基类均为Throwable类.有两个子类,分别为Exception和Error.其中Error主要由JVM处理,比如OutOfMemo ...
- Java异常 Exception类及其子类
C语言时用if...else...来控制异常,Java语言所有的异常都可以用一个类来表示,不同类型的异常对应不同的子类异常,每个异常都对应一个异常类的对象. Java异常处理通过5个关键字try.ca ...
- java异常——Exception、RuntimException
一.Exception和RuntimeException的区别 Exception是RuntimeException的父类,使用了 Exception 的类都必须对异常进行处理(try / throw ...
- Atitit java的异常exception 结构Throwable类
Atitit java的异常exception 结构Throwable类 1.1. Throwable类 2.StackTrace栈轨迹1 1.2. 3.cause因由1 1.3. 4.Suppres ...
- 2015年11月26日 Java基础系列(五)异常Exception
序,异常都是标准类Throwable的一些子类的对象. Throwable类的几个方法 1 getMessage() 返回描述该异常的信息 2 printStackTrace() 把消息和栈的跟踪记录 ...
随机推荐
- 关于因为git仓库无法克隆的问题;
有时候会遇见一种情况: 在git clone 时,遇见断开连接或者无法连接git源仓库:连接超时的时候: git clone url(git 仓库源) --depth=n // n 为想要克隆的层 ...
- 登录验证码的生成Java代码
package example7; import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java. ...
- HTML5文本
1.重要文本.斜体文本 粗体:<strong></strong> 粗体:<b></b> 斜体:<em></em> 斜体:< ...
- 启动pip时,< Fatal error in launcher: Unable to create process using '"' >问题的原因及解决方法
根本原因 要启动的pip程序,中指定的python程序路径不对 实例分析 我的window电脑上同时安装了python2.7和python3.6,他们的安装路径如下图: 注意图python2.7中红线 ...
- C# 设计模式之 单例模式
单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题,不过俺从没看过出错的现象,表鄙视我…… public class Singleton{ private static ...
- 【Keil】Keil5添加源程序和头文件
xxx.c就是源程序 xxx.h就是头文件 [源程序添加方法] 双击文件夹,例如图片上的Source,跳出弹窗,选择需要添加的源程序即可 [添加头文件的方法] 1.首先点击图片红框处,或是在文件夹te ...
- 前端css之float浮动
浮动的准则,先找前一个块标签,在确认有否清除浮动的条件或者是距离的情况下,如果这一行能摆得下,就继续紧贴前一个标签 如果摆不下,就会另起一行 浮动只有左边和右边 如果是块标签,设置浮动,先把displ ...
- Scala学习笔记(四)—— 数组
定长数组Array 定义定长数组用Array,有如下几种方法: 初始化一个长度为8的定长数组,其所有元素默认值均为0 scala> new Array[Int](8) res0: Array[I ...
- 关于verilog中的signed类型
在数字电路中,出于应用的需要,我们可以使用无符号数,即包括0及整数的集合:也可以使用有符号数,即包括0和正负数的集合.在更加复杂的系统中,也许这两种类型的数,我们都会用到. 有符号数通常以2的补码形式 ...
- C#调用c++类的导出函数
C# 需要调用C++东西,但是有不想做成COM,就只好先导出类中的函数处理. 不能直接调用,需单独导出函数 参考:http://blog.csdn.net/cartzhang/article/deta ...