黑马程序员_异常(1)

来源:互联网 发布:js如何获取cookie参数 编辑:程序博客网 时间:2024/06/15 06:32

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

 

 

异常:就是程序在运行时出现不正常情况。
异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述。并封装成对象。
   其实就是java对不正常情况进行描述后的对象体现。

对于问题的划分:两种:一种是严重的问题,一种非严重的问题。

对于严重的,java通过Error类进行描述。
 对于Error一般不编写针对性的代码对其进行处理。

对与非严重的,java通过Exception类进行描述。
 对于Exception可以使用针对性的处理方式进行处理。

无论Error或者Exception都具有一些共性内容。
比如:不正常情况的信息,引发原因等。

Throwable
 |--Error
 |--Exception

 


2,异常的处理

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)//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");

 }
}


对多异常的处理。

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


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

class Demo
{
 int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException//在功能上通过throws的关键字声明了该功能有可能会出现问题。
 {

  int[] arr = new int[a];

  System.out.println(arr[4]);

  return a/b;
 }
}


class  ExceptionDemo2
{
 public static void main(String[] args) //throws Exception
 {
  Demo d = new Demo();
  try
  {
   int x = d.div(5,0);
   System.out.println("x="+x);
  }
  
  catch(Exception e)
  {
   System.out.println("hahah:"+e.toString());
  }
  catch (ArithmeticException e)
  {
   System.out.println(e.toString());
   System.out.println("被零除了!!");

  }
  catch (ArrayIndexOutOfBoundsException e)
  {
   System.out.println(e.toString());
   System.out.println("角标越界啦!!");
  }
  
  /**/
  

  System.out.println("over");

 }
}


因为项目中会出现特有的问题,
而这些问题并未被java所描述并封装对象。
所以对于这些特有的问题可以按照java的对问题封装的思想。
将特有的问题。进行自定义的异常封装。

自定义异常。

需求:在本程序中,对于除数是-1,也视为是错误的是无法进行运算的。
那么就需要对这个问题进行自定义的描述。

当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。
要么在内部try catch处理。
要么在函数上声明让调用者处理。

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


发现打印的结果中只有异常的名称,却没有异常的信息。
因为自定义的异常并未定义信息。

自定义异常:
必须是自定义类继承Exception。


继承Exception原因:
异常体系有一个特点:因为异常类和异常对象都被抛出。
他们都具备可抛性。这个可抛性是Throwable这个体系中独有特点。

只有这个体系中的类和对象才可以被throws和throw操作。

 

throws和throw的区别
throws使用在函数上。
throw使用在函数内。

throws后面跟的异常类。可以跟多个。用逗号隔开。
throw后跟的是异常对象。

 


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);
 }
}

如何定义异常信息呢?
因为父类中已经把异常信息的操作都完成了。
所以子类只要在构造时,将异常信息传递给父类通过super语句。
那么就可以直接通过getMessage方法获取自定义的异常信息。


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();

 


Exceptoin中有一个特殊的子类异常RuntimeException 运行时异常。

如果在函数内抛出该异常,函数上可以不用声明,编译一样通过。

如果在函数上声明了该异常。调用者可以不用进行处理。编译一样通过;

之所以不用在函数声明,是因为不需要让调用者处理。
当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,
对代码进行修正。

 


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


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


异常应用

毕老师用电脑上课。

开始思考上课中出现的问题。


比如问题是
 电脑蓝屏。
 电脑冒烟。

要对问题进行描述,封装成对象。


可是当冒烟发生后,出现讲课进度无法继续。

出现了讲师的问题:课时计划无法完成。

 


class LanPingException extends Exception
{
 LanPingException(String message)
 {
  super(message);
 }
}

class MaoYanException extends Exception
{
 MaoYanException(String message)
 {
  super(message);
 }
}


class NoPlanException extends Exception
{
 NoPlanException(String msg)
 {
  super(msg);
 }
}

class Computer
{
 private int state = 3;
 public void run()throws LanPingException,MaoYanException
 {
  if(state==2)
   throw new LanPingException("蓝屏了");
  if(state==3)
   throw new MaoYanException("冒烟了");

  System.out.println("电脑运行");
 }
 public void reset()
 {
  state = 1;
  System.out.println("电脑重启");
  
 }
}

class Teacher
{
 private String name;
 private Computer cmpt;

 Teacher(String name)
 {
  this.name = name;
  cmpt = new Computer();

 }

 public void prelect()throws NoPlanException
 {
  try
  {
   cmpt.run();   
  }
  catch (LanPingException e)
  {
   cmpt.reset();
  }
  catch (MaoYanException e)
  {
   
   test();
   throw new NoPlanException("课时无法继续"+e.getMessage());
   
  }
  System.out.println("讲课");
 }
 public void test()
 {
  System.out.println("练习");
 }

}

 

class ExceptionTest
{
 public static void main(String[] args)
 {
  Teacher t = new Teacher("毕老师");
  try
  {
   t.prelect();
  }
  catch (NoPlanException e)
  {
   System.out.println(e.toString());
   System.out.println("换老师或者放假");
  }
  
 }
}

原创粉丝点击