黑马程序员——Java异常

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

 


                                              异常

 概述

  异常就是程序在运行时的不正常情况。java对不正常情况进行描述后的对象体现。
   
  问题划分:
          1:严重问题,java通过error类来描述。一般不编写针对性的代码对期进行处理。
          2:非严重问题,java通过exception类进行描述。可以使用针对性的代码进行处理。

  异常的处理

  java提供了特有的语句进行处理
  
  try
  {
     需要被检测的代码
  }
  catch
  {
     处理异常的代码(处理方式)
  }
  finally
  {
     一定会执行的语句(代码),通常定义关闭资源代码
  }

 只有System.exit(0);系统退出,这一个代码在finally之前,finally不会执行。

 java默认的异常处理机制,就是在调用printstacktrace方法,打印异常的堆栈的跟踪信息不必放在输出语句中直接写即可。
 e.printstacktrace();
 
 throws Exception
 
 在功能上通过throws的关键字声明了该功能有可能出现的问题。
  
 对多异常的处理:

               1:声明异常时,建议声明更为具体的异常,这样可以处理的更具体。
               2:对方声明几个异常,就对应几个catch块。如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。

 建议在进行catch块处理时,catch中一定要定义具体处理方式。不要简单定义 e.printstacktrace();,也不要简单的就书写一条输出语句。

public class Test03 {
public static void main(String[] args){
System.out.println("请输入1到29之间的整数");
//定义缓冲区
BufferedReader bufr = null;
//捕捉异常
try{
bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
//读取数据
while((line = bufr.readLine())!=null){
if("over".equals(line))
break;
//将读取到的数据转化为int型数据
int n = Integer.parseInt(line);
if(n<=0 || n>=30)
throw new RuntimeException("读取失败,输入值为非法值");
//调用求斐波那契数列第n项的方法。
int fun = function(n);
System.out.println("斐波那契数列第" + n + "项为:" + fun);
 
}
}
//对异常处理
catch(Exception e){
throw new RuntimeException("读取失败,输入值为非法值");//不要简单定义 e.printstacktrace();,也不要简单的就书写一条输出语句要定义的尽量详细。
}
finally{
try{
if(bufr!=null)
bufr.close();//一定要执行的代码,这里关闭流是一定要执行的。
}
catch(Exception e){
throw new RuntimeException("读取流关闭失败");
}

}


}


 自定义异常

 因为项目中会出现特有的问题,而这些问题并未被java所描述并封装成对象,所以对于这些特有的问题可以按照java的对问题封装

的思想。将特有的问题,进行自定义的异常封装。
 
 当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。要么在内部try catch处理,要么在函数上声明让调用

者处理。一般情况在函数内出现异常,函数上需要声明。

 因为父类已经把异常信息的操作都完成了,所以子类只要在构造时,将异常信息传递给父类,通过super语句那么就可以直接通过

getMessage方法获取自定义异常信息。
 
 自定义异常,必须是自定义类继承Exception。

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

只有这个体系中的类和对象才可以被throws和throw操作.
 
  throw和throws的区别:
                     1:throws使用在函数上(指小括号和大括号之间),throw用在函数内。

                     2:throw后面跟的是异常类,可以抛多个,用逗号隔开。throw后跟的是异常对象。
 
  自定义异常时,如果该异常的发生,无法再继续进行运算,就让异常继承RuntimeException。
 
  异常分两种:
              
            1:编译时被检测的异常。
          
            2:编译时不被检测的异常(运行时异常,RuntimeException即其子类)。

 
 异常在子父类覆盖中的体现:

                        1:子类在覆盖父类方法时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或该异常的子类或者不抛

                        2:如果父类方法抛出多多个异常,子类在覆盖该方法时,只能抛出父类异常的子集。

                        3:如果父类或者接口的方法中没有抛出异常,那么子类在覆盖方法时,也不可以抛出异常。如果子类发生了异常,就必须

进行try处理,绝对不能抛。
   

  当要定义自定义异常信息,可以使用父类已经定义好的功能。
  
  异常信息传递给父类的构造函数。

class MyException extends Exception
{
    MyException(String message)
    {
        super(message)
    }
}


  异常的好处:
            1:将问题进行封装。
        
            2:将正常流程的代码和问题代码相分离便于阅读。

 异常处理原则:

             1:处理方式有两种try和throws。
 
             2:调用到抛出异常的功能时,抛出几个就处理几个,一个try对应多个catch。

             3:多个catch,父类的catch放到最下面。
 
             4:catch内需要定义针对性的处理方式,不要简单定义 e.printstacktrace();,也不要简单的就书写一条输出语句。


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


 try
 {
   throw new AException();
 }
 catch(AException e)
 {
     throw e//本功能处理不了,可以继续在catch中抛出。
 }


 如果该异常处理不了,但并不属于该功能出现的异常。可以将异常转换后,再抛出和该功能相关的异常。或者一场可以处理但需要将异常产生后和本

功能相关的问题提供出去,让调用者知道并处理也可以将捕获后的异常处理后转换成新的异常。
 
try
 {
   throw new AException();
 }
 catch(AException e)
 {
     throw new BException();//让调用者知道并处理也可以将捕获后的异常处理后转换成新的异常。
 }


 throw单独存在时下面不要定义语句,因为执行不到,会导致编译失败。
interface shape//定义接口
{
void getArea();
}


class Rec implements shape//实现接口
{
private int len,wid;
if(led<0||wid<0)
throw new MyException("出现非法值");//抛出自定异常
Rec(int len ,int wid)
{
this.len=len;
this.wid=wid;
}
public void getArea()//复写接口中的getArea方法
{
System.out.println(len*wid);
}
}
class ExceptionTest1 
{
public static void main(String[] args) 
{
Rec r = new Rec(-3,4);//
   r.getArea();

}
}
class MyException extends Exception//定义自定义异常
{
    MyException(String message)
    {
        super(message)//访问父类异常
    }
}
 


  
                            ------- android培训java培训、期待与您交流! ----------
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值