黑马程序员-----java异常处理机制
来源:互联网 发布:怎么分析一只股票数据 编辑:程序博客网 时间:2024/05/29 16:55
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
异 常:
异常:就是不正常。程序在运行时出现的不正常情况。其实就是程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。因为问题的产生有产生的原因、有问题的名称、有问题的描述等多个属性信息存在。当出现多属性信息最方便的方式就是将这些信息进行封装。异常就是java按照面向对象的思想将问题进行对象封装。这样就方便于操作问题以及处理问题。
程序中出现的异常有许多中原因:比如角标越界,空指针等都是。就对这些问题进行分类。而且这些问题都有共性内容比如:每一个问题都有名称,同时还有问题描述的信息,问题出现的位置,所以可以不断的向上抽取。形成了异常体系。
——–java.lang.Throwable:
Throwable:可抛出的。
|–Error:错误,一般情况下,不编写针对性的代码进行处理,通常是jvm发生的,需要对程序进行修正。
|–Exception:异常,可以有针对性的处理方式
无论是错误还是异常,它们都有具体的子类体现每一个问题,它们的子类都有一个共性,就是都以父类名才作为子类的后缀名。
这个体系中的所有类和对象都具备一个独有的特点;就是可抛性。
可抛性的体现:就是这个体系中的类和对象都可以被throws和throw两个关键字所操作。
class ExceptionDemo{
public static void main(String[] args) {
// byte[] buf = new byte[1024*1024*700];//java.lang.OutOfMemoryError内存溢出错误
}
}
在开发时,如果定义功能时,发现该功能会出现一些问题,应该将问题在定义功能时标示出来,这样调用者就可以在使用这个功能的时候,预先给出处理方式。
如何标示呢?通过throws关键字完成,格式:throws 异常类名,异常类名…
这样标示后,调用者,在使用该功能时,就必须要处理,否则编译失败。
处理异常有两种方式:1、捕捉;2、抛出。
对于捕捉:java有针对性的语句块进行处理。
try {
需要被检测的代码;
}
catch(异常类 变量名){
异常处理代码;
}
fianlly{
一定会执行的代码;
}
总结:catch (Exception e) { //e用于接收try检测到的异常对象。System.out.println("message:"+e.getMessage());//获取的是异常的信息。System.out.println("toString:"+e.toString());//获取的是异常的名字+异常的信息。e.printStackTrace();//打印异常在堆栈中信息;异常名称+异常信息+异常的位置。
}
异常处理原则:功能抛出几个异常,功能调用如果进行try处理,需要与之对应的catch处理代码块,这样的处理有针对性,抛几个就处理几个。
特殊情况:try对应多个catch时,如果有父类的catch语句块,一定要放在下面。
- throw 和throws关键字的区别:
- throw用于抛出异常对象,后面跟的是异常对象;throw用在函数内。
- throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws用在函数上。
示例:抛出异常演示代码如下:
class Demo{ int div(int a,int b)throws Exception//在功能上通过throws的关键字声明了该功能有可能会出现问题。 { return a/b; }}class ExceptionDemo{ public static void main(String[] args) { Demo d = new Demo(); try { int x = d.div(4,1); System.out.println("x="+x); } catch (Exception e)//Exception e = new ArithmeticException(); { System.out.println("除零啦"); System.out.println(e.getMessage());// / by zero; System.out.println(e.toString());// 异常名称 : 异常信息。 e.printStackTrace();//异常名称,异常信息,异常出现的位置。 //其实jvm默认的异常处理机制,就是在调用printStackTrace方法。 //打印异常的堆栈的跟踪信息。 } System.out.println("over"); }}
通常情况:函数内容如果有throw,抛出异常对象,并没有进行处理,那么函数上一定要声明,否则编译失败。但是也有特殊情况,函数的调用者也必须进行异常处理,除非它继续抛出异常。
异常分两种:
1:编译时被检查的异常,只要是Exception及其子类都是编译时被检测的异常。
2:运行时异常,其中Exception有一个特殊的子类RuntimeException,以及RuntimeException的子类是运行异常,也就说这个异常是编译时不被检查的异常。
编译时被检查的异常和运行时异常的区别:
- 编译被检查的异常在函数内被抛出,函数必须要声明,否编译失败。
- 声明的原因:是需要调用者对该异常进行处理。
- 运行时异常如果在函数内被抛出,在函数上不需要声明。
- 不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,所以,不让调用处理的,直接让程序停止,由调用者对代码进行修正。
定义异常处理时,什么时候定义try,什么时候定义throws呢?
- 功能内部如果出现异常,如果内部可以处理,就用try;
- 如果功能内部处理不了,就必须声明出来,让调用者处理。
自定义异常:当开发时,项目中出现了java中没有定义过的问题时,这时就需要我们按照java异常建立思想,将项目的中的特有问题也进行对象的封装。这个异常,称为自定义异常。
示例:自定义异常代码如下:
*/class FuShuException extends Exception //getMessage();{ private int value; FuShuException() { super(); } FuShuException(String msg,int value) { super(msg); this.value = value; } public int getValue() { return value; }}class Demo{ int div(int a,int b)throws FuShuException { if(b<0) throw new FuShuException("出现了除数是负数的情况------ / by fushu",b);//手动通过throw关键字抛出一个自定义异常对象。 return a/b; }}class ExceptionDemo3{ public static void main(String[] args) { Demo d = new Demo(); try { int x = d.div(4,-9); System.out.println("x="+x); } catch (FuShuException e) { System.out.println(e.toString()); //System.out.println("除数出现负数了"); System.out.println("错误的负数是:"+e.getValue()); } System.out.println("over"); }}/*class Throwable{ private String message; Throwable(String message) { this.message = message; } public String getMessage() { return message; }}class Exception extends Throwable{ Exception(String message) { super(message); }}class Person{ String name; Person(String name) { this.name = name; } public String getName() { return name; }}class Student extends Person{ Student (String name) { super(name); }}new Sttdent("lisi").getName();*/
总结:对于除法运算,0作为除数是不可以的。java中对这种问题用ArithmeticException类进行描述。对于这个功能,在我们项目中,除数除了不可以为0外,还不可以为负数。可是负数的部分java并没有针对描述。所以我们就需要自定义这个异常,通过自定义异常我们可以直观的吧异常信息返回给调用者。
自定义异常的步骤:
1:定义一个子类继承Exception或RuntimeException,让该类具备可抛性。
2:通过throw 或者throws进行操作。
异常的转换思想:当出现的异常是调用者处理不了的,就需要将此异常转换为一个调用者可以处理的异常抛出。
try catch finally的几种结合方式:
1,
try
catch
finally
这种情况,如果出现异常,并不处理,但是资源一定关闭,所以try finally集合只为关闭资源。
记住:finally很有用,主要用户关闭资源。无论是否发生异常,资源都必须进行关闭。
System.exit(0); //退出jvm,只有这种情况finally不执行。
当异常出现后,在子父类进行覆盖时,有了一些新的特点:
1:当子类覆盖父类的方法时,如果父类的方法抛出了异常,那么子类的方法要么不抛出异常要么抛出父类异常或者该异常的子类,不能抛出其他异常。
2:如果父类抛出了多个异常,那么子类在覆盖时只能抛出父类的异常的子集。
注意: 如果父类或者接口中的方法没有抛出过异常,那么子类是不可以抛出异常的,如果子类的覆盖的方法中出现了异常,只能try不能throws。
如果这个异常子类无法处理,已经影响了子类方法的具体运算,这时可以在子类方法中,通过throw抛出RuntimeException异常或者其子类,这样,子类的方法上是不需要throws声明的。
- 黑马程序员:JAVA异常处理机制
- 【黑马程序员】java中的异常处理机制
- 黑马程序员---java异常处理机制
- 黑马程序员--Java异常处理机制
- 黑马程序员-Java异常处理机制
- 黑马程序员-java异常处理机制
- 黑马程序员----java异常处理机制
- 黑马程序员-----java异常处理机制
- 黑马程序员-【JAVA基础】-异常处理机制
- 黑马程序员-Java异常处理机制
- 黑马程序员-异常处理机制
- 黑马程序员---异常处理机制
- 黑马程序员——java异常处理机制
- 黑马程序员_关于java的处理异常机制
- 黑马程序员_浅谈Java当中的异常处理机制
- 黑马程序员——JAVA基础之异常处理机制
- 黑马程序员-----java异常处理机制(学习日记)
- 黑马程序员——Java基础:异常处理机制
- 查看oracle系统临时表空间、undo表空间、SGA和PGA大小
- 搜索之质数环
- oraclesequence
- 优先级反转和解决方法
- 烟大ACM新秀赛 A多位数的处理
- 黑马程序员-----java异常处理机制
- HTML5 canvas炫酷棱镜效果的幻灯片特效
- Protocol Buffers(Protobuf)开发者指南---概览
- JavaScript权威指南_93_第13章_Web浏览器中的JavaScript_13.3-JavaScript程序的执行
- 在C#下利用COM组件提供给第三方调用,无需强命名,通过CurrentDomain_AssemblyResolve方式的解决的过程
- 拒绝switch,程序加速之函数指针数组
- SqlParameter的用法
- mybatis和spring整合时的访问机制
- 16个最佳响应式HTML5框架