首页 > 代码库 > 黑马程序员——面向对象--异常
黑马程序员——面向对象--异常
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
异常:就是程序在运行时出现不正常的情况
异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象。
其实就是java对不正常情况进行描述的对象体现
对于问题的划分分为两种:
1.一种是严重的问题
2.一种是非严重问题
对于严重的,java通过error类进行描述
对于error一般不变写针对性的代码进行处理
对于非严重的,java通过Exception进行描述
对于Exception可以使用针对性的处理方式进行处理
无论Error还是Exception都具有一些共性内容
比如:不正常情况信息,引发原因等
Throwable
|--Error
|--Exeption
java提供了特有的语句进行处理
try{
需要被检测到代码
}
catch(异常类 变量)
{
处理异常的代码;(处理方式)
}
finally
{
一定会执行的代码;
}
3.对于补获到的对象进行常见方法操作
String getMessage();获取异常信息
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) { System.out.println("zero"); System.out.println(e.getMessage()); System.out.println(e.toString());//异常名称:异常信息 e.printStackTrace();//异常名称,异常信息,一场出现的位置 其实jvm默认的处理异常机制就是调用printStackTrace方法,打印异常的堆栈跟踪西信息 } System.out.println("over"); } }对捕获的异常进行常见方法操作
String getMessage():获取异常信息
在函数声明异常,便与提高安全性,让调用处进行处理,不处理编译失败
对于多异常处理:
1.声明异常时,建议声明更为具体的异常,这样处理可以更为具体
2.对方声明几个异常,就对应几个catch块,不要定义多余的catch块
如果多个catch块中的异常出现继承关系,父类异常放在最下边
建立在进行catch处理时,catch中一定要定义具体处理方式
不要简单定义一句e.printStackTrace();
也不要简单定义一句输出语句
class Demo { int div(int a, int b)throws ArithmeticException,ArryIndexOutOfBoundsException //在功能上通过throws的关键字声明了该功能有可能会出现问题 { int [] arr = new int[a]; System.out.println(arr[4]); return a/b; } } class ExceptionDemo { public static void main(String args[]){ Demo d = new Demo(); try{ int x = d.div(5,0); System.out.println("x="+x); } catch(Exception e) { System.out.println(e.toString); } catch(ArithmeticException e) { System.out.println(e.toString); System.out.println("by zero"); } catch(ArrIndexOutOfboundsException) { System.out.println("e.toString); System.out.println("角标越界"); } System.out.println("over"); } }因为项目中会出现特有的问题
而这些问题并未被java所描述兵封装对象,所以对于这些特有的问题可以描述java的问题封装的思想
将特有的问题,进行自定义的异常封装
自定义异常
需求:
在本程序中,对于除数是-1,也是为是错误是无法进行运算的
那么就需要对这个问题进行自定义的描述
挡在函数内部出现了throw抛出异常对象,那么就必须要对应的处理动作
要么在内部try catch处理
要么在函数上让调用者处理
一般情况在,函数内出现异常,函数上需要声明。
发现打印的结果中只有一场的名称,却没有异常的信息
因为自定义的异常并未定义信息
如何定义异常信息呢?
因为父类中已经把异常信息的操作都完成了
所以子类只要在构造时,将异常信息传递给父类通过super语句
那么就可以直接通过getMessage方法进行自定义的异常信息
自定义异常:
必须是自定义类继承Exception
继承Exception原因:
异常类中有一个特点:因为异常类和一场对象都被抛出
他们都具备可抛性,这个可抛性是Throwable这个体系中独有的特点
只有这个体系中才可以被throws和throw操作
throws和throw的区别:
throws使用在函数上
throw使用在函数内
throws后面跟着的异常类,可以跟多个,用逗号隔开
throw后跟的是异常对象
<span style="font-family:KaiTi_GB2312;font-size:14px;">class fushuException exten</span>ds Exception { private int value; fushuException() { super; } fushuException(String msg, int value) { super(msg); this.value = http://www.mamicode.com/value;>Exception中有一个特殊的子类异常RuntimeException运行异常
如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过
如果在函数上声明了该异常,调用者可以不进行处理,编译一样通过
之所以不用在函数声明,是因为不需要让调用者处理
当该异常发生,希望程序停止,因为在运行时,出现了无法继续运行的情况,希望停下来以后对代码进行修正
自定义异常时,如果该异常的发生,无法再继续进行运算,就让自定义异常继续继承RuntimeException
对于异常分两种:
1.编译时被检测的异常
2.编译时不被检测的异常(运行时异常,runtimeException以及子类)class fushuException extends RuntimeException { fushuException(String msg) { super(msg); } } class Demo { int div(int a, int b) throws Exception, throws ArithmeticException { if(b<0) throw new Exception("出现负数了"); if(b==0) throw new ArithmeException("被零除了"); return a/b; } } class ExceptionDemo { public static void main(String args[]){ Demo d = new Demo(); int x = d.div(4, -9); System.out.println("x="+x); System.out.println("over"); } } /* class Person { public void checkName(String name) { //if(name.equals("lisi"))//NullPointerException if("lisi".equals(name))//if(name!=null && name.equals("lisi")) System.out.println("YES"); else System.out.println("no"); } } main() { Person p = new Person(); p.checkName(null); } */ finally代码块: /* finally代码块:定义一定执行的代码。 通常用于关闭资源。 */ class FuShuException extends Exception { FuShuException(String msg) { super(msg); } } class Demo { int div(int a,int b)throws FuShuException { if(b<0) throw new FuShuException("除数为负数"); return a/b; } } class ExceptionDemo5 { public static void main(String[] args) { Demo d = new Demo(); try { int x = d.div(4,-1); System.out.println("x="+x); } catch (FuShuException e) { System.out.println(e.toString()); return; //System.exit(0);//系统,退出。jvm结束。 } finally { System.out.println("finally");//finally中存放的是一定会被执行的代码。 } System.out.println("over"); } } class NoException extends Exception { } public void method()throws NoException { 连接数据库; 数据操作;//throw new SQLException(); 关闭数据库;//该动作,无论数据操作是否成功,一定要关闭资源。 try { 连接数据库; 数据操作;//throw new SQLException(); } catch (SQLException e) { 会对数据库进行异常处理; throw new NoException(); } finally { 关闭数据库; } } catch是用于处理异常。如果没有catch就代表异常没有被处理过,如果该异常是检测时异常。那么必须声明。 class Demo { public void method() { try { throw new Exception();//没有catch,必须声明异常 } finally { //close } } } class { public static void main(String args[]){ System.out.println("hello world"); } }异常在子父类覆盖中的体现;
1,子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。
2,如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。
3,如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。
如果子类方法发生了异常。就必须要进行try处理。绝对不能抛。class Aexception extends Exception { } class BException extends AException { } class CException extends Exception { } class fu { void show() throws AException { } } class test { void function(fu f) { try { f.show(); } catch(AException e) { } } } class zi extends fu { void show thros CException { } } class { public static void main(String args[]){ test t = new test(); t.function(new zi()); } }黑马程序员——面向对象--异常
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。