`
wangjie2013
  • 浏览: 168685 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java笔记(10,java异常)

    博客分类:
  • JAVA
阅读更多

 

什么是异常:

异常:就是程序在运行时出现不正常情况。

异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象。其实就是java对不正常情况进行描述后的对象体现。

 Throwable

|--Error

|--Exception

        |--RuntimeException

        |--(Other Exception)

Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误,应用程序不应该抛出这种类型的对象。如果出现了这样的内部错误,除了通告给用户,并尽力使程序安全地终止之外,再也无能为力了。这种情况很少出现。

在设计Java程序事,需要关注Exception层次结构。这个层次结构又分为两个分支;一个分支派生于RuntimeException;另一个分支包含其他异常。划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有错误,但由于像I/O错误这类问题导致的异常属于其他异常。

如果出现RuntimeExceptin异常,那么就一定是你的问题。

派生于RuntimeException的异常包含下面几种情况:

1,错误的类型转换。

2,数组访问越界。

3,访问空指针。

不是派生于RuntimeException的异常包括:

1,试图在文件尾部后面读取数据。

2,试图打开一个错误格式的URL。

3,试图根据给定的字符串查找Class对象,而这个字符串表示的类根本就不存在。

java语言规范将派生于Error类或RuntimeException类的所有异常称为未检查异常(运行时异常),所有其他的异常称为已检查异常(编译时异常)。

总之,一个方法必须声明所有可能抛出的已检查异常,而未检查异常要么不可控制(Error),要么就应该避免发生(RuntimeException)。如果方法没有声明所有可能发生的已检查异常,编译器就会给出一个错误信息。

通常,应该捕获那些知道如何处理的异常,而将那些不知道怎样处理的异常传递出去。如果想将异常传递出去,就必须在方法的首部添加一个throws说明符,以便告知调用者这个方法可能会抛出异常。

诱饵机制:

当捕获到异常时,可以使用下面这个方法将原始异常包装起来,作为新异常的“诱饵”:

initCause(Throwable e)

当捕获到异常时,可以使用下面的方法重新获得原始异常:

getCause()

如果在一个方法中发生了一个已检查异常,而不允许抛出它,那么包装技术就十分有用,我们可以捕获这个已检查异常,并将它包装成一个运行时异常。

 

异常处理:

java提供了特有的语句进行处理:

try{

需要被检测的代码;

}catch{

处理异常的代码;(处理方式)

}finally{

一定会执行的语句;

}

 

finally代码块:定义一定执行的代码;通常用于关闭资源。

记住一点:

catch是用于处理异常的。如果没有catch就代表异常没有处理过,如果该异常是编译时异常,那么就必须申明。

通常,应该捕获那些知道如何处理的异常,而将那些不知道怎样处理的异常传递出去。如果想将异常传递出去,就必须在方法的首部添加一个throws说明符,以便告知调用者这个问题可能会抛出异常。

对捕获到的异常对象进行常见方法操作

s.o.p(e.getMessage());//异常信息

s.o.p(e.toString());//在输出语句里面打印对象,toString可写可不写;  异常名称:异常信息

e.printStackTrace();//异常名称,异常信息:异常出现的位置。

其实jvm默认的异常处理机制,就是在调用printStackTrace方法,打印异常的堆栈的跟踪信息。

 

碰到有问题的方法时,应该要给出预先的处理方式!

 

在函数上声明异常。

便于提高安全性,让调用处进行处理,不处理编译失败!

如:int div(int a,int b)throws Exception//(在功能上通过throws的关键字声明了该功能有可能会出现问题。)

 

对多异常的处理

1,声明异常时,建议声明更为具体的异常,这样处理的可以更具体。

2,对方声明几个异常,就对应有几个catch块,不要定义多余的catch块。

如果多个catch块中的异常出现继承关系,父类catch块放在最下面

 

建议:

在进行catch处理时,catch中一定要定义具体处理方式。

不要简单定义一句e.printStackTrace();

也不要简单的就书写一条输出语句。

 

因为项目中会出现特有的问题。

而这些问题并未被java所描述并封装对象。

所以对于这些特有的问题可以按照java的对问题封装的思想。将特有的问题,进行自定义的异常封装。

 

自定义异常:

自定义的异常,我们要手动通过throw关键字抛出一个自定义异常对象。

当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。

要么在内部try catch处理。

要么在函数上声明让调用者处理。(运用throws关键字。)

 

一般情况下,函数内出现异常,函数上需要申明。

 

发现打印的结果中只有异常的名称,却没有异常的信息。

因为自定义的异常并未定义信息。

如何定义异常信息呢?

因为父类中已经把异常信息的操作多做完了,

所以子类只要在构造时,将异常信息传递给父类通过super语句。

那么就可以直接通过getMessage方法获取自定义的异常信息。

 

自定义异常必须是自定义类继承Exception。

继承Exception原因:

异常体系有一个特点,异常类和异常对象都需要被抛出。他们都具备可抛性,这个可抛性是Throwable中的独有特点。

只有这个体系中的类和对象才可以被throws和throw操作。

 

throws和throw的区别:

throws使用在函数上;

throw使用在函数内;

 

throws后面跟的异常类,可以跟多个,用逗号隔开。

throw后跟的是异常对象。

 

注意:

Exception中有一个特殊的子类异常RuntimeException 运行异常。

如果在函数内抛出该异常,函数上可以不用声明,编译一样通过。 

如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过;

之所以不用在函数声明,是因为不需要让调用者处理。当该异常发生,希望程序停止,因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。

 

自定义异常时,如果异常的发生,无法在继续进行运算,就让自定义异常继承RuntimeException。

 

对于异常分为两种:

1,编译时被检测的异常。

2,编译时不被检测的异常(运行时异常,RuntimeException以及其子类。)

 

自定义异常:

定义类继承Exception或者RuntimeException:

1,为了让该自定义类具备可抛性。

2,让该类具备操作异常的共性方法。

 

当要定义自定义异常的信息时,可以使用父类已经定义好的功能。

将异常信息传递给父类的构造函数。

class MyException extends Exception{

MyException(String message){

super(message);

}

}

 

自定义异常,就是按照java的面向对象思想,将程序中出现的特有问题进行封装。

异常的好处:

1,将问题进行封装。

2,将正常流程代码和问题处理代码相分离,方便于阅读。

 

异常的处理原则:

1,处理方式有两种,try或者throws

2,调用到抛出异常的功能时,抛出几个,就处理几个。一个try对应多个catch。

3,多个catch,父类catch放到最下面。

4,catch内,需要定义针对性的处理方式。不要简单的定义printStackTrace,或者输出语句。也不要不写。

当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。

try{

throw new AException();

}catch(AException e){

throw e;

}

 

如果该异常处理不了,但并不属于该功能出现的异常。可以将异常转换后,再抛出和该功能相关的异常。

或者异常可以处理,但需要将异常产生的和本功能相关的问题提供出去,让调用者知道。并处理,也可以将捕获异常处理后,转换新的异常抛出。(举例:汇款失败)

try{

throw new AException();

}catch(AException e){

// 对AException处理。

throw new VException(e);

}

 

异常的注意事项:

在子父类覆盖时:

1,子类抛出的异常必须是父类的异常的子类或者子集。

2,如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。

 

 

异常体系和throw和throws的用法:

异常:

异常是什么?是对问题的描述,将问题进行对象的封装。

 

异常体系:

Throwable

    |--Exception

|--RuntimeException

    |--Error

 

异常体系的特点:异常体系中的所有类以及建立的对象都具备可抛性。也就是说可以被throw和throws关键字所操作。只有异常体系具备这个特点。

 

throw和throws的用法:

throw定义在函数内,用于抛出异常对象。

throws定义在函数上,用于抛出异常类,可以抛出多个并用逗号隔开。

 

当函数内容有throw抛出异常对象,并未进行try处理。必须要在函数上声明,否则编译失败。

注意:RuntimeException除外,也就是说,函数内如果抛出的RuntimeException异常,函数上可以不用声明。

 

如果函数声明了异常,调用者需要进行处理,处理方法可以throws可以try。

 

异常有两种:

编译时被检测异常:

该异常在编译时,如果没有处理(没有抛也没有try),编译失败。

该异常被标识,代表这可以被处理。

 

运行时异常(编译时不检测):

在编译时,不需要处理,编译器不检查。

该异常的发生,建议不处理,让程序停止,需要对代码进行修正。

 

异常处理语句:

try{需要被检测的代码}

catch{处理异常的代码}

finally{一定会执行的代码}

 

有三个结合格式:

1,try{ }catch{ }

2, try{ }finally{ }

3, try{ }catch{ }finally{ }

 

注意:

1,finally中定义的通常是关闭资源代码,因为资源必须释放。

2,finally只有一种情况不会执行,当执行到System.out.exit(0);finally不会执行。

 

java异常处理举例:老师用电脑上课(经典)

 

class LanpinException extends Exception{
  LanpinException(String s){
    super(s);
  }
}

class MaoyanException extends Exception{
  MaoyanException(String s){
    super(s);
  }
}
class KetangException extends Exception{
  KetangException(String s){
  super(s);
  }
}

class Computer{
  private int sta=3;
  void run() throws LanpinException,MaoyanException{
    if(sta==1)
      System.out.println("电脑运行");
    else if(sta==2)
      throw new LanpinException("电脑死机了");
    else if(sta==3)
      throw new MaoyanException("电脑坏了");
  }
  void reset(){
    sta=1;
    System.out.println("电脑重启");
  }
}
class Teacher{
  private String name;
  private Computer cpt;
  Teacher(String name){
    this.name = name;
    cpt = new Computer();
  }
  void spead() throws KetangException{
  try{
    cpt.run();
  }
  catch (LanpinException e){
  cpt.reset();
  }	
  catch (MaoyanException e){
  test();
  throw new KetangException("课程不能继续:"+e.getMessage());
  }
    System.out.println(name+"开始上课");
  }
  void test(){
    System.out.println("做java练习");
  }
}

class ExceptionTest{
  public static void main(String[] args){
  Teacher t = new Teacher("王老师");
   try{
     t.spead();
   }catch (KetangException e){
     System.out.println(e.toString());
     System.out.println("换老师吧");
   }
  }
}

 

 

 

 

 

 

1
4
分享到:
评论

相关推荐

    java笔记.zip

    2020-4-6 java笔记 ---异常 2020-4-6 java笔记 --多线程 2020-4-8 java笔记 String类 2020-4-9 java 比较器 2020-4-10 java笔记 枚举类 2020-4-10 java 注解(Annotation) 2020-4-11 Java 集合 2020-4-15 java 泛型...

    狂神说Java笔记资料

    狂神说Java笔记PDF文档。内容包括JAVA入门、基础语法、流程控制、方法、数组、面向对象、异常机制、常用类、集合框架、IO流、多线程、网络编程、Gui编程、注解和反射。

    观看韩顺平学习整理java的笔记到异常

    帮助大家复习java基础知识其中有 hashCode 2 toString 2 finalize 2 用已学知识做出简单的房屋出租系统 3 类方法使用注意事项和细节讨论 4 main()方法 4 代码块 4 代码块使用注意事项和细节 5 单例模式 6 final...

    韩顺平讲解的java异常笔记

    韩顺平讲解的java异常笔记

    Java学习笔记7.0

    《Java JDK6学习笔记》是作者良葛格本人近几年来学习Java的心得笔记,结构按照作者的学习脉络依次展开,从什么是Java、如何配置Java开发环境、基本的Java语法到程序流程控制、管理类文件、异常处理、枚举类型、泛型...

    达内Java培训-CoreJava全程笔记(WORD唐亮版)

    CoreJava DAY10 主方法,静态导入,包装类,枚举 32 CoreJava DAY11 内部类 36 CoreJava DAY12 集合 List 40 CoreJava DAY13 集合 Set 46 CoreJava DAY14 集合 Map 49 CoreJava DAY15 异常、断言 52 CoreJava DAY16 ...

    Java异常详解_动力节点Java学院整理

    Java异常详解_动力节点Java学院整理,动力节点口口相传的Java黄埔军校

    Java入门笔记5_异常

    Java入门笔记5_异常

    Java学习笔记

    自己在java学习过程中的笔记,从最基础的创建java环境,java的基础知识,java变量的内存存储过程,到容器,异常,多线程等都有详尽涉及。 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里...

    Java学习笔记,异常机制

    Java学习笔记,异常机制

    瑜琅java学习笔记

    1 java起源 2 java语言概述 3 简单(基本)数据类型 4 运算符:java...8 继承:继承是面向对象编程技术的一块基石,因为它允许创建分等级层次的类 9 包和接口 10异常处理 11多线程编程 12输入/输出、小应用程序and others

    CoreJava笔记

    CoreJava笔记 CoreJava DAY01 Java概述 1 CoreJava DAY02 数据类型和控制结构 6 CoreJava DAY03 数组 11 CoreJava DAY04 15 CoreJava DAY05 面向对象 17 CoreJava DAY06 类的加载过程、实例化、继承、多态 20 Core...

    java学习笔记 达内笔记(经典)

    (二)面向对象技术总结.pdf (三)corejava高级特性总结 (四)接口学习总结 (五)异常和内部类 (六)集合框架学习总结 (七)GUI和AWT事件模型 (八)多线程学习总结 (九)输入输出流学习总结 (十)网络编程学习总结

    Java基础课堂笔记

    Java基础笔记, 第一章:编程基础 第二章:数组 第三章:面向对象程序开发 第四章:异常机制 第五章:多线程技术 第六章:常用类API 第七章:集合框架(容器)+其他类对象使用 第八章:IO流 第九章:GUI编程 第十章...

    黑马程序员-Java语言进阶-源码、教程笔记.zip

    day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda表达式 day08_File类、递归 day09_字节流、字符流 day10_缓冲流、转换流、序列化流、Files day11_网络编程 day12_函数式接口 day13_Stream...

    Java学习笔记(必看经典)

    本书是作者近几年来学习Java的心得笔记,结构按照作者的学习脉络依次展开,从什么是Java、如何配置Java开发环境、基本的Java语法到程序流程控制、管理类文件、异常处理、枚举类型、泛型、J2SE中标准的API等均进行了...

    Java学习笔记-超强笔记

    格式: [ 修饰符 ] 返回类型 方法名( 参数列表 ) [ throws 异常 ] { ······ } java中所有参数都是值传递。 当没有值返回时,返回类型必须被定义为void。 返回类型必须与方法名相邻,其他修饰符...

    java笔记 异常 多线程

    各方面搜集的 。有处理异常的,多态问题。。

    狂神说所有JAVA基础篇,到异常部分java.md

    狂神说所有JAVA基础篇,到异常部分j

    java学习笔记 初学者必读

    1.1. JAVA特点 1-4 1.2. 运行原理 1-4 1.3. JAVA目录 1-4 2. 一•基础知识 2-4 2.1. 配置环境 2-4 2.2. Java中基本概念 2-5 3. 二•定义,关键字和类型 3-5 3.1. 注释的三种形式 3-5 3.2. Java代码中的“;”、“{}...

Global site tag (gtag.js) - Google Analytics