黑马程序员--异常

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

异常:就是程序在运行时出现不正常情况。
异常由来:问题也是现实生活中的一个具体事物,也可以通过java的类的形式进行描述。         并封装成对象。  其实就是java对不正常情况进行描述后的对象体现。
对于问题的划分:一、严重问题二、非严重的问题。
对于严重的,Java通过Error类(癌症)进行描述。对于Error一般不编写针对想的代码进行    处理。
对于非严重的,java通过Exception类进行描述。  对于Exception可以使用针对性的处理   方式进行处理。

OutOfMemoryError内存溢出 IndexOutOfBoundsException数组角标越界异常   ArithmeticException 算数异常

Throwable 类是java所有已知错误异常的父类超类 ,直接已知子类Error和Exception


异常的处理

java 提供了特有的语句进行处理。格式
  try{
 需要被检测的代码
}
catch(异常类  变量){
 处理异常的代码(处理方式)
}
finally{
 一定会执行的语句
}
———————————————————————————————————————————————————————

package biji.yichang;

public class Demo1 {
 int a(int x,int y){
  return x/y;
 }
 static class Demo2{
  public static void main(String[] args) {
   Demo1 d=new Demo1();
   int b=d.a(2,0);//ArithmeticException 算数异常,除数不能为0
   System.out.println(b);
  }
 }
}//代码运行会出异常
应该这样写
package biji.yichang;

public class Demo1 {
 int a(int x,int y)//throws Exception 在功能上通过throws关键字声明了该功能有可能出现的问题,向上抛错,抛给上级,最终给                          //jvm虚拟机,这是异常声明
        {
  return x/y;
 }
 static class Demo2{
  public static void main(String[] args) //throws Exception
   {
   Demo1 d=new Demo1();
   try{
    int b=d.a(2,0);
    System.out.println(b);//这两行代码要写在一起,否则第二行找不到变量b
   }
   catch(Exception e){  //Exception e=new ArithmeticException();
    System.out.println("0不要被除");
    System.out.println(e.getMessage());//String getMessage();获取异常信息
    System.out.println(e.toString());//打印异常名称:异常信息
    e.printStackTrace();//打印异常名称,异常信息,异常出现的位置 printStackTrace的返回值类型是                                                    //void,没有返回值,是不能用输出语句来打印的。
    //其实jvm默认的异常处理机制,就是在调用printStackTrace方法,来打印异常在堆栈中的跟踪信息。
   }
   //int b=d.a(2,0);//ArithmeticException 算数异常,除数不能为0
   //System.out.println(b);
   finally{
    System.out.println("Over");
   }
  }
 }
}//简单流程:上课中头被砸破了try,把头破了封装成一个对象Exception e=new 处理的错误类();,去门诊catch包扎,然后再回来上课finally



---------------------------------------------------------------------------------------------------------------------
对多异常的处理
1.声明异常时,建议声明更为具体的异常,这样处理的更具体。
2.声明几个异常,就对应几个catch块 ,不要定义多余的catch块。  如果多个catch块中的异常出现继承关系,父类  异常catch块放在最下边。

建议:在进行catch处理时候,catch中一定要定义具体处理方式。不要像上面代码中简单定义一句e.printStackTrace(),也不要简单的就书写一条输出语句。因为用户是看不懂耶解决不了的
--------------------------------------------------------------------------
因为项目中会出现特有的问题,而这些问题并未被java所描述并封装对象,所以对于这些特有的问题可以按照java的对问题封装的思想,将特有的问题进行自定义的异常封装。

自定义异常
 例如:不想让负数作为除数

package biji.yichang;

public class Demo1 {
 int a(int x,int y) throws FuShuException//函数内出现异常,函数上需要声明。
 {
  if(y<0)//不让负数做除数
   throw new FuShuException("出现了除数是负数的情况");//手动通过throw关键字(不是throws)抛出一个自定义的异常对象。当函数内部出现了throw抛出异常对象,那么就必须给予相应的处理,要么在内部try catch,要么在函数上声明让调用者处理。
   
 return x/y;
 }
 static class Demo2{
  public static void main(String[] args)
  {
   int b;
    try {
     b = d.a(2,-8);
     System.out.println("b="+b);
    } catch (FuShuException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
     System.out.println("除数不要负数");
    }
    System.out.println("Over");
      
   }
  }
  }
 public class FuShuException extends Exception{//建立一个类继承自Exception,为了方便阅读,最好类名起后缀是Exception的
  FuShuException(String ms){
   super(ms);
  }//在此当中定义的是异常信息,在Exception父类中,已经把异常信息的操作完成了,所以子类在构造时,通过super()语句将异常信息传递给父类,那么就可以通过getMessage方法获取自定义的异常信息。
 }

 }
//结果biji.yichang.Demo1$FuShuException: 出现了除数是负数的情况//(异常名称和异常信息)
 at biji.yichang.Demo1.a(Demo1.java:7)
 at biji.yichang.Demo1$Demo2.main(Demo1.java:18)
       除数不要负数
       Over



------------------------------------------------------------------
自定义异常必须是自定义类继承Exception。
继承Exception原因:异常体系有一个特点:因为异常类和异常对象都被抛出。他们都具备可抛性。这个可抛性是Throwable体系中的独有特点。只有这个体系中的类和对象才能被throws和throw操作。
-----------------------------------------------------------------------------
throws和throw的区别
throws使用在函数上,throw使用在函数内
throws后面跟异常类,可以跟多个,用逗号隔开。throw后面跟异常对象。
------------------------------------------------------------------------
一般函数内抛错误,函数上要表识。

public class Demo3 {
 int a(int x,int y) throws Exception{
  if(y==0)
   throw new Exception("函数内抛错,函数上声明");
  return x/y;
 }
 static class b{
  public static void main(String[] args) {
   Demo3 d=new Demo3();
   int c=d.a(4,0);
   System.out.println("c="+c);
   System.out.println("Over");
  }
 }
}
但是这种
public class Demo3 {
 int a(int x,int y) {
  if(y==0)
   throw new ArithmeticException("ArithmeticException算数异常父类是RunTimeException");
  return x/y;
 }
 static class b{
  public static void main(String[] args) {
   Demo3 d=new Demo3();
   int c=d.a(4,0);
   System.out.println("c="+c);
   System.out.println("Over");
  }
 }
}
没有在函数上抛异常。因为ArithmeticException的父类是RunTimeException。它的子类在函数内声明后就不用再在函数上声明。
或者把它写在函数上的时候,也不会报错。
public class Demo3 {
 int a(int x,int y) throws ArithmeticException{//写在函数上了
  //(y==0)
   //throw new ArithmeticException("函数内抛错,函数上声明");
  return x/y;
 }
 static class b{
  public static void main(String[] args) {
   Demo3 d=new Demo3();
   int c=d.a(4,0);
   System.out.println("c="+c);
   System.out.println("Over");
  }
 }
}



总结下:Exception中有一个特殊的子类异常RuntimeException运行时异常。
 如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过。
 如果在函数上声明了该异常,调用者可以不用处理。编译一样通过。
之所以不用再函数上声明,是因为不需要让调用者处理,当该异常发生时,希望程序停止,因为在运行时出现了无法继续运算的情况,希望停止程序后由程序员对代码进行修正。

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

package biji.yichang;

public class Demo3 {
 int a(int x,int y) {
  if(y==0)
   throw new ArithmeticException("chu  0");
  if(y<0)
   throw new AException("<0");
  return x/y;
 }
 static class b{
  public static void main(String[] args) {
   Demo3 d=new Demo3();
   int c=d.a(4,-9);
   System.out.println("c="+c);
   System.out.println("Over");
  }
 }
 class AException extends RuntimeException{
  AException(String ms){
   super(ms);
  }
 }
}



---------------------------------------------------------------------
对于异常分两种:
1.编译时被检测的异常。
  
2.编译时不被检测的异常(运行时异常RuntimeException以及其子类)

throw 和return一样,当他存在的时候下面就不要再写语句了,他就是结束标示。

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值