java-异常篇《三》

1.异常的定义

异常是指程序在运行时期发生不正常事件,导致程序指令流程的无法正常执行。

2.异常的分类

错误(error):jvm系统的内部错误或资源耗尽等严重情况,属于jvm需要负担的责任。

异常(exception):编程的错误或其他外在的因素导致的一般性问题。

注意:程序员只需要处理异常(Exception),而无法处理错误。

Error(错误):由Java虚拟机生成并抛出,程序对其不做处理

Exception(异常):所有异常的父类,一般需要用户显示的声明或捕获。

RuntimException:一类的特殊异常,如被0除,,空指针数组越界等,其产生比较频繁,处理麻烦,

如果显示的声明或捕获将会对程序可读性和运行效率影响很大,因此由系统自动检测并交将它们交给缺省的异常处理程序。

2.1异常分类(从编程的角度)

非受检(unchecked)异常:编译器不要求强制处置的异常。

一般是指编程时的逻辑错误,程序员应当要避免的事情

java.lang.RuntimeException 及它的子类都是非受检异常

  • 错误的类型转换:java.lang.ClassCastException
  • 数组下标越界:java.lang.ArrayIndexOutOfBoundsException
  • 空指针访问:java.lang.NullPointerException
  • 算术异常(除0溢出):java.lang.ArithmeticException

受检(checked)异常:编译器要求必须处置的异常。指程序运行时由于外界因素造成的一般性异常

  • 没有找到指定名称的类:java.lang.ClassNotFoundException
  • 访问不存在的文件:java.io.FileNotFoundException
  • 操作文件时发生的异常:java.io.IOException
  • 操作数据库时发生的异常:java.sql.SQLException

3.异常处理的机制

Java程序在执行的过程中如果出现了异常,会自动生成一个异常类对象,并自动提交给JVM,这过程称为抛出(throw)异常

JVM接收到该异常对象后,会寻找能处理该异常的代码并将该异常对象交给它处理,这过程叫做捕获异常和处理异常

如果JVM找不到捕获该异常的代码,则运行时系统将终止,相应的Java程序也将退出。

4.try--catch--finally

try{}:可能发生异常的代码块区域,会产生一种或几种类型的异常对象,后面的catch语句会对其进行处理

catch():可以有多个catch语句捕获多种类型的异常,但是异常子类必须位于异常父类之前。

finally():异常处理的统一出口,一定会执行的代码块,但是它是可选的,通常处理资源文件,如关闭打开的文件,删除临时文件,关闭数据库的连接。

5.throws关键字(方法上)

在定义一个方法的时候使用,表示该方法产生的异常不进行处理,交给该方法调用处进行处理

public void method throws e1,e2{};

6.throw关键字(方法内)

在方法内中抛出一个异常(throw new Exception();),如果该异常是受检异常则必须进行如下处理,如果是非受检异常则没事

处理这个抛出来的(受检)异常,可以选择try-catch它,或者用throws将它抛出方法之外。

7.自定义异常使用

public class ExceptionTest {
 
     public static void main (String args[]) throws MyException   
     { 
          int y;
          int x=y=0;
          int z=x/y;
          if (y==0)
             throw new MyException("分母为0");
     }
  }
class MyException extends Exception
 {
   
      public MyException ()
      {
         super();
      }
      public MyException(String msg) 
      {
         super(msg);
      }
 }

小结:

 异常抛出的原则:

1,仅有一个与异常对应catch模块执行,剩下的catch模块不会执行。且

Java只对第一个发现的异常进行catch,不再继续执行下去,即后面

可能出现异常的代码不再执行,并catch它。

2,具有父类的catch模块要放到最后面,否则无法编译过去。

    异常在子父类覆盖中的体现;
    1,子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。
    2,如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。
    3,如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。
         如果子类方法发生了异常。就必须要进行try处理。绝对不能抛。

finally{}代码块:

只要catch或前面的语句使用了return语句,则finally区域还是会执行,除非在这之间执行了System.exit(0),则finally区域不会执行

throw和throws区别:

throw用在方法内部:throw new Exception (); throws用在方法定义上:public void method throws Exception

注意:如果throw出的异常是非受检异常(RuntimeException子类),则无需对这异常进行捕获/抛出,除非是受检异常。

时间: 2024-12-09 06:35:52

java-异常篇《三》的相关文章

Java提高篇(三二)-----List总结

前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识才是你的知识.所以下面LZ就List接口做一个总结.推荐阅读: java提高篇(二一)-----ArrayList java提高篇(二二)-----LinkedList java提高篇(二九)-----Vector Java提高篇(三一)-----Stack 一.List接口概述 List接口,成为

JAVA基础篇三(Java,C++中的异常机制)

由于C++和JAVA有很多相似之处,又有很多细微的差别,所以在学习JAVA的过程中对两种语言进行对比学习. 1.C++的异常机制 C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理.如此逐级上传,直到最高一级还无法处理的话,运行系统会自动调用系统函数terminate,由它调用abort终止程序.这样的异常处理方法使得异常引发和处理机制分离,而不在同一个函数中处理.这使得底层

有效处理java异常的三个原则

Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮.易于调试.异常之所以是一种强大的调试手段,在于其回答了以下三个问题: 什么出了错? 在哪出的错? 为什么出错? 在有效使用异常的情况下,异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪“抛出,异常信息回答了“为什么“会抛出,如果你的异常没有回答以上全部问题,那么可能你没有很好地使用它们.有三个原则可以帮助你在调试过程中最大限度地使用好异常,这三个原则是: 具体明确 提早抛出 延迟捕获 为了阐述有效异常处

java —— 异常(三)

_ 问题引入看如下测试代码: import java.io.*; public class HideException { //一个函数同时读取两个文件 public void readTwoFile() throws FileNotFoundException, IOException{ BufferedReader br1 = null; BufferedReader br2 = null; FileReader fr = null; try{ fr = new FileReader("A.

JAVA高级篇(三、JVM编译机制、类加载机制)

一.类的加载过程 JVM将类的加载分为3个步骤: 1.装载(Load) 2.链接(Link) 3.初始化(Initialize) 其中 链接(Link)又分3个步骤,如下图所示: 1) 装载:查找并加载类的二进制数据(查找和导入Class文件) 加载是类加载过程的第一个阶段,在加载阶段,虚拟机需要完成以下三件事情: 1.通过一个类的全限定名来获取其定义的二进制字节流. 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构. 3.在Java堆中生成一个代表这个类的java.lang.C

java基础篇(三) ----- java面向对象的三大特性之多态

封装(encapsulation) 类使得数据和对数据的操作捆绑在一起,从而对使用该类的其他人来说,可以不管它的实现方法,而只管用它的功能,从而实现所谓的信息隐藏: 继承(inheritance) 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类.这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用.比如可以先定义一个类叫animal,animal具有以下属性:   眼睛,鼻子,耳朵 而又由ani

java菜鸟篇<三> Jquery弹窗插件Lhgdialog的用法( 原文搬抄+添加,方便以后查找,书签太多了)

今天带我的大神让我做个消息提示,我准备用dialog作,于是乎百度+自己动动脑子 百度原文: Lhgdialog的用法 大家都知道用js可以实现,但是在使用js实现的弹窗时得考虑很东西:浏览器的兼容.页面的交互等等问题. 在这里简单介绍一下lhgdialog的用法. 参数有: Title:弹窗的上标题: Content:弹窗中的内容(当然可以以一个页面为内容,用URL连接): Ok:弹窗的确定键(可以是function)是布尔类型的: Cancel:取消键(同上): Cancelval:取消键的

java提高篇(三十)-----Iterator

本文转载地址:            http://blog.csdn.net/chenssy/article/details/37521461 迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. [java] view plaincopyprint? Iterator iterator = list.iterator(); while(iterator.hasNext()){ String string = iterator.next(); //d

java基础篇---I/O技术(三)

接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象输入流(ObjectInputStream).使用对象输出流输出序列化对象的步骤,有时也成序列化,而使用对象输入流读入对象的过程,有时也称为反序列化 一个对象产生之后实际上是在内存中为其开辟了一个存储空间,方便存储信息. 对象序列化就是把一个对象变成二进制的数据流的一个方法,通过对象序列化可以反驳的

Java总结篇系列:Java多线程(三)

一.一个典型的Java线程安全例子 1 public class ThreadTest { 2 3 public static void main(String[] args) { 4 Account account = new Account("123456", 1000); 5 DrawMoneyRunnable drawMoneyRunnable = new DrawMoneyRunnable(account, 700); 6 Thread myThread1 = new Thr