黑马程序员-【异常处理】

                           ------- android培训java培训、期待与您交流! ----------

异常

 

     就是不正常,是指程序在运行时出现的不正常情况。其实就是程序中出现的问题。

      这个问题按照面向对象思想进行描述,并封装成了对象。

      因为问题的产生有产生的原因、有问题的名称、有问题的描述等多个属性信息存在。

      当出现多属性信息最方便的方式就是将这些信息进行封装。

      异常就是java按照面向对象的思想将问题进行对象封装。这样就方便于操作问题以及处理问题。

     

      出现的问题有很多种,比如角标越界,空指针等都是。就对这些问题进行分类。

      这些问题都有共性内容比如:

           每一个问题都有名称,同时还有问题描述的信息,问题出现的位置,所以可以不断的向上抽取。形成了异常体系

 

异常体系  Throwable

 

       Error
             通常指JVM出现重大问题如:运行的类不存在或者内存溢出等。

             不需要编写针对代码对其处理,程序无法处理。
       Exception
             在运行时运行出现的一些情况,可以通过try,catch,finally处理

  异常的处理

 

       1、捕获异常:

                   try catch 直接处理可能出现的异常!

        2、声明异常:

                   throws 声明告诉调用者可能的异常,暴露问题,调用者自己处理!

       Exception 和 Error的子类名大都是以父类名作为后缀

 

异常处理格式

      异常处理的5个关键字 :try ,catch,finally throw, throws

 

代码:

 

try{
		//可能出异常的代码
} catch(异常类  对象){
		//处理该异常类型的语句
}
[finally] {
		//一定会执行的代码
		//catch块使用System.exit(1);除外
}


 

  当try语句块出现异常,程序会自动跳到catch语句块去找匹配的异常类型,并执行异常处理语句,finally语句块是异常的统一出口。


多异常处理

  

    声明异常时尽可能声明具体异常类型,方便更好的处理

    方法声明几个异常就对应有几个catch块

    若多个catch块中的异常出现继承关系,父类异常catch块放在最后

 

    在catch语句块使用Exception类作为异常类型时:

         所有子类实例都可以使用父类接收(向上转型),即所有的异常对象都可以使用Exception接收;

   

    java 7 可以同时捕获多个异常类型

    java 7之前的代码:

 

try {
	int a = Integer.parseInt("1");
	int b = Integer.parseInt("0");
	int c = a / b;
	System.out.println(c);
} catch (NumberFormatException e)
{
   e.printStackTrace();
} catch(ArithmeticException e) 
{
	e.printStackTrace();
}


   java7之后的代码:

 

try {
Integer a = Integer.parseInt("1");
Integer b = Integer.parseInt("0");

Integer c = a / b;

System.out.println(c);

} catch (NumberFormatException 
	| ArithmeticException  e ) {
	 e.printStackTrace();
}


 

异常的分类

 

       1、编译时被检查异常——>Checked异常

                      在程序中必须使用——>try.....catch处理;

       2、编译时不被检测的异常——>Runtime异常

                      可以不使用try...catch处理,但一旦出现异常就将由JVM处理

 

   Checked异常:

         除了RuntimeException以及子类,其他的Exception及其子类都是受检查异常,我们也可以称为非RuntimeException异常.

         Java编译器会检查它,也就说程序中一旦出现这类异常,要么是没有try-catch语句捕获,或throws语句没有声明抛出它,编译就不会

通过,也就说这种异常,程序要求必须处理

 

   Runtime异常:

         RuntimeException(运行时异常)是指因设计或实现方式不当而导致的问题。

         该类异常是程序员造成的,是完全可以避免的异常。

         这种异常Java编译器不会检查它,也就说程序中出现这类异常的时候,即使不处理也没有问题,但是一旦出现异常,程序将异常终

止,若采用异常处理,则会被相应的程序执行处理.

 

声明异常  (throws) 

  

     在可能出现异常的方法上声明抛出可能出现异常的类型

      声明的时候尽可能声明具体的异常,方便更好的处理

      当前方法不知道如何处理这种异常,可将该异常交给上一级调用者来处理(非RuntimeException类型的异常)

      方法一旦使用throws声明抛出方法内可能出现的异常类型, 该方法就可以不再过问该异常了

      一个方法调用另一个使用throws声明抛出的方法,自己要么try...catch , 要么也throws

   

  格式:

public 返回值类型  方法名(参数列表...) 
			throws 异常类A,异常类B... {
	
}

 

throw

   自行抛出一个异常对象,抛出异常类的对象

   若throw抛出的是Runtime异常:程序可以显示使用try...catch来捕获并处理,也可以不管,直接交给方法调用者处理

   若throw抛出Checked异常:要么放在try里自己处理,要么放在一个throws声明的方法里面,交给调用者处理。

 

例子:

public static void main(String[] args) {
		try {
		      fn1(1);
		} catch (Exception e) { e.printStackTrace(); }
		fn2(2);
	}
	public static void fn1(int a) throws Exception{
		if(a >0) { throw new Exception("fn1 -- a值不合法"); }
	}
	public static void fn2(int a) {
		if(a >0) { throw new RuntimeException("a值不合法"); }
	}


 

throws和throw的区别

  

    throws用于在方法上声明该方法不需要处理的异常类型,后面跟异常类名,可以是多个异常类。

    throw用于抛出具体异常类的对象,用在方法内,后面跟异常对象,只能是一个。

 

finally

 

异常的统一出口:

      不管try块程序是否异常,也不管哪个catch执行,finally块总会执行。try语句块或会执行的catch语句块使用了JVM系统退出语句

例外;//System.exit(1);

try块必须和 catch块或和finally同在,不能单独存在,二者必须出现一个。不要在finally中使用return 或throw语句,否则将会导致

try、catch中的return或throw失效。

 

例子:

package reviewDemo;

public class Demo19 {
	public static void main(String[] args) {
		try{
			System.out.println(17/0);
		}catch(Exception e){
			//e.printStackTrace();
			System.out.println("程序错误");
		}finally{
			System.out.println("这是finally代码块!");
		}
	}
}


 

常见问题

 

  1、final, finally, finalize的区别。

      final: 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

                 内部类要访问局部变量,局部变量必须定义成final类型

      finally:是异常处理语句结构的一部分,表示总是执行。

      finalize:Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资

                 源回收,例如关闭文件等。JVM不保证此方法总被调用

 

  2、运行时异常与一般异常有何异同?

    异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。

java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

 

 3、error和exception有什么区别?


    error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。exception

表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值