目录

一、异常的概念

二、异常的分类

三、异常的捕获和处理

四、使用自定义异常

一、异常的概念

java异常是指java提供的用于处理程序运行过程中错误的一种机制

所谓错误是指在程序运行的过程中发生的一些异常事件(如:除0溢出,数组下标越界,索要读取的文件不存在等)

设计良好的程序应该在异常发生时提供处理这些错误的方法,是的程序不会因为异常的发生而阻断或产生不可预见的结果

java程序的执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息并将被其提交给java运行系统,这个过程成为抛出(throw)异常

当java运行时系统接受到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程成为捕获(catch)异常

//一个捕获异常的示例
public class test {
public static void main(String args[]) {
try {
System.out.println(2/0);
} catch (ArithmeticException ae) {
System.out.print("运行出错!");
}
}
}

二、异常的分类

Throwable:可被抛出的

Error:系统错误,做自己处理不了的

Exception:自己可以做处理的,可以catch的

RuntimeExpetion:经常出的错误(这种错误可以catch,也可以不catch)

还有一种exception是必需要去捕获的

三、异常的捕获和处理

try {
//可能抛出异常的语句
} catch ( SomeException1 e ) {
......
} catch ( SomeException2 e) {
......
} finally {
......
}
  • try代码段包含可能产生异常的代码
  • try代码段后根由一个或多个catch代码段
  • 每个catch代码段声明其能处理的一种特定类型的异常并提供处理的方法
  • 当异常发生时,程序会终止当前的流程,根据获取异常的类型去执行相应的catch代码段
  • finally段的代码无论是否发生异常都会在最后进行执行

try{

  • try语句指定了一段代码,该段代码就是一次捕获并处理例外的范围。
  • 在执行过程中该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分别对这些异常做相应的处理
  • 如果没有例外产生,所有的catch代码段都被略过不执行

} catch ( ) {

  • 在catch语句块中是对异常进行处理的代码,每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象
  • 在catch中声明的异常对象(catch(someException e))封装了异常时间发生的信息,在catch语句块中可以使用这个对象的一些方法获取这些信息。
  • 例如:getMessage()方法:用来得到有关异常事件的信息。printStackTrace()方法:用来跟踪异常事件发生时执行堆栈的内容。

}  finally (){

  • finally语句为异常处理提供一个统一的出口,是的在控制流程转到程序的其他部分以前,能够对程序的状态做统一的管理
  • 无论try所指定的程序块中是否抛出例外,finally所指定的黛娜都要被执行。
  • 通常在finally语句中可以进行资源的清除工作,如:关闭打开的文件,删除临时文件等

对于一些自己处理不了的异常或是自己不想去处理的异常,可以直接往外抛异常,这样就可以不用在代码段中加try{}catch{}

//一个抛出异常的例子
public class test {
public static void main(String args[]) throws IOException {
test();
} static void test() throws IOException {
System.out.println(2/0);
}
}
//不加try...catch的另外一种抛异常方法
public class test {
public static void main(String args[]) throws IOException {
int i = 0;
if (i == 0) {
throw new IOException("出错了");
}
}
}

看一个例子,这就是打印的堆栈信息,虽然报错很多行,但是或许只要更改一次就可以解决:

另外在捕获异常的时候注意下面这种问题:

四、使用自定义异常

使用自定义异常一般有如下步骤:

1.通过继承java.lang.Exception类声明自己的异常类

2.在方法适当的位置生成自定义异常的实例,并用throw语句抛出

3.在方法的声明部分用throws语句声明该方法可能抛出的异常

//创建一个exception类存放自己的exception
public class MyExpection extends Exception {
private int id;
public MyExpection (String message,int id) {
super(message);
this.id = id;
}
public int getId() {
return id;
}
}
//测试类
public class Test {
//定义一个方法
public void regist(int num) throws MyExpection {
if(num < 0) {
throw new MyExpection("不应该为负值", 3);
}
System.out.println("登记人数: "+ num);
}
//定义另一个方法
public void manager() {
try {
regist(100);
} catch (MyExpection e) {
System.out.println("登记失败,出错类型码="+e.getId());
e.printStackTrace();
}
System.out.println("操作结束!");
}
//程序入口main方法
public static void main(String[] args) {
Test t = new Test();
t.manager();
}
}

可以自己调试输出

注意:

当原方法有异常时重写该方法需要抛出与原方法所抛出异常类型一致的异常或不抛出异常,其他情况都无法进行重写

六、java异常处理的更多相关文章

  1. java异常处理机制

    本文从Java异常最基本的概念.语法开始讲述了Java异常处理的基本知识,分析了Java异常体系结构,对比Spring的异常处理框 架,阐述了异常处理的基本原则.并且作者提出了自己处理一个大型应用系统 ...

  2. Java 异常处理机制和集合框架

    一.实验目的 掌握面向对象程序设计技术 二.实验环境 1.微型计算机一台 2.WINDOWS操作系统,Java SDK,Eclipse开发环境 三.实验内容 1.Java异常处理机制涉及5个关键字:t ...

  3. java异常处理机制 (转载)

    java异常处理机制 本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C ...

  4. Java—异常处理总结

    异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出 ...

  5. 如何正确使用Java异常处理机制

    文章来源:leaforbook - 如何正确使用Java异常处理机制作者:士别三日 第一节 异常处理概述 第二节 Java异常处理类 2.1 Throwable 2.1.1 Throwable有五种构 ...

  6. [ Java学习基础 ] Java异常处理

    一.异常概述 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用Sys ...

  7. Java异常处理机制难点解惑-用代码说话

    是否需要看这篇文章? 下面的例子中,如果正常执行返回值多少? 如果出现了ArithmeticException返回值多少? 如果出现非ArithmeticException(如NullPointerE ...

  8. Java 异常处理的误区和经验总结

    Java 异常处理的误区和经验总结   1 本文着重介绍了 Java 异常选择和使用中的一些误区,希望各位读者能够熟练掌握异常处理的一些注意点和原则,注意总结和归纳.只有处理好了异常,才能提升开发人员 ...

  9. 基础知识《十一》Java异常处理总结

    Java异常处理总结           异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制 ...

  10. 深入探索 高效的Java异常处理框架

    转载自:http://www.sunwei.org/archives/196 摘要:本文从Java异常最基本的概念.语法开始讲述了Java异常处理的基本知识,分析了Java异常体系结构,对比Sprin ...

随机推荐

  1. [ c++] cmake 编译时 undefined reference to `std::cout' 错误的解决方案

    cmake ..  和 make 之后,出现如下错误 Linking CXX executable ../../../bin/ModuleTest CMakeFiles/ModuleTest.dir/ ...

  2. Docker容器和本机之间的文件传输 使用Docker部署Tomcat项目

    Docker容器和本机之间的文件传输. http://blog.csdn.net/leafage_m/article/details/72082011 使用Docker部署Tomcat项目 http: ...

  3. 跟踪调试Linux内核的启动过程

    跟踪调试Linux内核的启动过程---使用gdb 符钰婧 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...

  4. iOS开发学习-nonatomic和atomic的区别

    nonatomic是非原子性的,也就是给线程不加原子锁,这样的代码运行效率会更高一点,例如: @property (nonatomic,copy)NSString *userName; @proper ...

  5. 《UML大战需求分析》-读后感二

    活动图将流成分解为一个一个的活动,通过活动的先后顺序来展示流程,而状态机图是从某个事物的状态是如何转变的角度来展示流程,首先确定事物,然后找出状态,状态之间的箭头叫转换,箭头上的文字说明了是什么事情导 ...

  6. static和final

    是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只 ...

  7. DPDK helloworld 源码阅读

    在 DPDK Programmer's Guides 中的 EAL 一篇中有一个图可以很清晰地看到一个DPDK的应用程序的大致执行思路: 初始化检查CPU支持.微架构配置等完成后,执行main()函数 ...

  8. jmeter 多线程组间变量共享

    jmeter的线程组之间是相互独立的,各个线程组互不影响,所以线程组A中输出的参数,是无法直接在线程组B中被调用的. 但是有时为了方便管理,我们可能是把各个接口单独存放在不同的线程组中.拿Cookie ...

  9. ajax 数据请求(一)同域

    参考:http://www.css88.com/jqapi-1.9/jQuery.ajax/ http://www.cnblogs.com/haitao-fan/p/3908973.html 1.常用 ...

  10. 程序集里包含多个版本dll引用 ,强制低版本到制定版本dll引用

    在 config 的 <configuration> 节点内加入以下 类似信息 以下是以Newtonsoft.Json 为例子 <runtime> <assemblyBi ...