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.自定义异常使用

 1 public class ExceptionTest {
 2
 3      public static void main (String args[]) throws MyException
 4      {
 5          int y;
 6          int x=y=0;
 7          int z=x/y;
 8          if (y==0)
 9              throw new MyException("分母为0");
10      }
11 }
12 class MyException extends Exception
13 {
14
15     public MyException ()
16     {
17         super();
18     }
19     public MyException(String msg)
20     {
21         super(msg);
22     }
23
24  

小结:

异常抛出的原则:

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

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

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

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

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

时间: 2024-08-01 22:43:01

java-异常篇上的相关文章

一篇不错的讲解Java异常的文章(转载)----感觉很不错,读了以后很有启发

六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗? 1 OutputStreamWriter out = ... 2 java.sql.Connection conn = ... 3 try { // ⑸ 4 Statement stat = conn.createStatement(); 5 ResultSet rs = stat.executeQuery( 6 "select uid,

一篇不错的讲解Java异常的文章(转载)

http://www.blogjava.net/freeman1984/archive/2007/09/27/148850.html 六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗? 1 OutputStreamWriter out = ... 2 java.sql.Connection conn = ... 3 try { // ⑸ 4 Statement stat = conn.cre

java中级异常篇

一.异常 1.异常的概述 什么是异常:是程序运行过程中发生未知的事件,  该事件可以中断程序指令的正常执行流程. java中异常类的视图: 说明:Error和Exception的子类可以分为上图中的几类,并非所有子类. Throwable: Throwable 类是 Java 语言中所有错误或异常的超类.只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 throw语句抛出. Error: Error 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获的严

“全栈2019”22篇Java异常学习资料及总结

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"22篇Java异常学习资料及总结 下一章 "全栈2019"Java多线程第一章:认识多线程 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组". 全

Java总结篇系列:java.lang.Object

从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解. Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java中最基本的类java.lang.Object开始谈起. Object类是Java中其他所有类的祖先,没有Object类Java面向对象无从谈起.作为其他所有类的基类,Object具有哪些属性和行为, 是Java语言设计背后的思维体现. Object类位于java.lang包中,java.lang包包

java异常面试常见题目

在Java核心知识的面试中,你总能碰到关于 处理Exception和Error的面试题.Exception处理是Java应用开发中一个非常重要的方面,也是编写强健而稳定的Java程序的关键,这自然使它成为面试题中的常客.关于Java中Error和Exception的面试题目多是关于Exception和Error的概念,如何处理Exception,以及 处理Exception时需要遵守的最佳实践等等.尽管关于多线程.垃圾回收.JVM概念和面向对象设计等方面的问题依然主宰着这类面试,你仍然需要为回答

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编程中使用非常广泛的,它就像大海,海纳百川,像万能容器,盛装万物,而且这个大海,万能容器还可以无限变大(如果条件允许).当这个海.容器的量变得非常大的时候,它的初始容量就会显得很重要了,因为挖海.扩容是需要消耗大量的人力物力财力的.同样的道理,Collection的初始容量也显得异常重要.所以:对于已知的情景,请为集合指定初始容量. public static void main(String[] args) { StudentVO student = null; long

Java提高篇(三六)-----java集合细节(二):asList的缺陷

在实际开发过程中我们经常使用asList讲数组转换为List,这个方法使用起来非常方便,但是asList方法存在几个缺陷: 一.避免使用基本数据类型数组转换为列表 使用8个基本类型数组转换为列表时会存在一个比较有味的缺陷.先看如下程序: public static void main(String[] args) { int[] ints = {1,2,3,4,5}; List list = Arrays.asList(ints); System.out.println("list'size:&