黑马程序员-Java学习05-异常

来源:互联网 发布:哈希算法 编辑:程序博客网 时间:2024/06/06 05:37

-----------android培训java培训、java学习型技术博客、期待与您交流!------------


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

对于问题的划分:两种:一种是严重的问题,一种非严重的问题。
对于严重的,java通过Error类进行描述。
 对于Error一般不编写针对性的代码对其进行处理。
  
|--1,一般不可处理的: Error
特点:是由 jvm 抛出的严重性问题。
这种问题发生,一般不针对性处理,直接修改程序。
|--2,可以处理的: Exception
Throwable 中的方法:
1. getMessage():获取异常信息,返回字符串。
2. toString():获取异常类名和异常信息,返回字符串。
3. printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置,返
回值 void。
4. printStackTrace(PrintStream s):通常用该方法将异常内容保存在日志文件中,以
便查阅

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

有三个结合格式:
1. try
 {
 
 }
 catch ()
 {
 }

2. try
 {
 
 }
 finally
 {
 
 }


3. try
 {
 
 }
 catch ()
 {
 }
 finally
 {
 
 }
*6、 用代码证明,在try中写了return,后面又写了finally,是先执行return还是先执行fianlly? * 思路:能过打印的顺序来判断谁先。 * 运行结果说明:先执行finally语句块。*/package com.itheima;public class Test6 {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("我是tryFinally方法return返回的值: "+tryFinally()+" 现在你知道谁更快了吧");//如果先打印这句,则说明先执行return语句}public static int tryFinally(){try{int i = 0;return i;}finally{System.out.println("我是finally,看看谁更先执行");//如果先打印这句则说明先执行finally语句}}}
结果:我是finally,看看谁更先执行
我是tryFinally方法return返回的值: 0 现在你知道谁更快了吧


注意:
1,finally中定义的通常是 关闭资源代码。因为资源必须释放。
2,finally只有一种情况不会执行。当执行到System.exit(0);fianlly不会执行。

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


在函数上声明异常。
便于提高安全性,让调用出进行处理。不处理编译失败。

3.对多异常的处理。

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


建立在进行catch处理时,catch中一定要定义具体处理方式。
不要简单定义一句 e.printStackTrace(),
也不要简单的就书写一条输出语句。
注:函数内抛,函数上要标识,要声明,runtimeException除外

4.自定义异常。
因为项目中会出现特有的问题,
而这些问题并未被java所描述并封装对象。
所以对于这些特有的问题可以按照java的对问题封装的思想。
将特有的问题。进行自定义的异常封装。
需求:在本程序中,对于除数是-1,也视为是错误的是无法进行运算的。
那么就需要对这个问题进行自定义的描述。

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


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

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

自定义异常:
必须是自定义类继承Exception。
继承Exception原因:
异常体系有一个特点:因为异常类和异常对象都被抛出。
他们都具备可抛性。这个可抛性是Throwable这个体系中独有特点。
只有这个体系中的类和对象才可以被throws和throw操作。



5.throws和throw的区别
  • throws使用在函数上。
  • throw使用在函数内。
  • throws后面跟的异常类。可以跟多个。用逗号隔开。
  • throw后跟的是异常对象。


6.RuntimeException
Exceptoin中有一个特殊的子类异常RuntimeException 运行时异常。
如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过。
如果在函数上声明了该异常。调用者可以不用进行处理。编译一样通过;
之所以不用在函数声明,是因为不需要让调用者处理。
当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,
对代码进行修正。
自定义异常时:如果该异常的发生,无法在继续进行运算,
就让自定义异常继承RuntimeException。
对于异常分两种:
  • 编译时被检测的异常。 
  • 编译时不被检测的异常(运行时异常。RuntimeException以及其子类)
throw 和return出现在方法中时,方法就马上结束。
nuddlesW老师用电脑上课。package nuddles.j2seDemo;public class ExceptionDemo {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubnew Teacher(23,"nuddles",new Computer(1)).prelect();new Teacher(23,"nuddles",new Computer(2)).prelect();}}class Teacher{//定义老师,带一个电脑成员int age;String name;Computer computer ;Teacher(int age,String name,Computer computer){this.age = age;this.name =name;this.computer = computer;}public void prelect(){//讲课方法try{computer.open();//有可能抛异常,所以要try.}catch(LanPinException e){//如果蓝屏,直接重启System.out.println(e.getMessage());computer.reset();}catch(MaoyanException m){//如果冒烟,经上级处理,即停止程序System.out.println(m.getMessage());throw m;}}}class Computer{//定义电脑类int state =0;public void open()throws LanPinException{if (state == 1) {throw new LanPinException("电脑蓝屏了");}else if(state == 2){throw new MaoyanException("电脑冒烟了,坏了,不能用了");}else{System.out.println("开始上课");}}public Computer(int state) {super();this.state = state;}public void reset(){this.state = 0;}}class LanPinException extends Exception{//定义蓝屏异常类,可以处理LanPinException(String message){super(message);}}class MaoyanException extends RuntimeException{//定义冒烟异常类,不能处理,一旦发现系统停止,所以继承RuntimeExceptionMaoyanException(String message){super(message);}}
电脑蓝屏了
电脑冒烟了,坏了,不能用了
Exception in thread "main" nuddles.j2seDemo.MaoyanException: 电脑冒烟了,坏了,不能用了
at nuddles.j2seDemo.Computer.open(ExceptionDemo.java:62)
at nuddles.j2seDemo.Teacher.prelect(ExceptionDemo.java:37)
at nuddles.j2seDemo.ExceptionDemo.main(ExceptionDemo.java:20)

7异常的处理原则:
 1,处理方式有两种:try 或者 throws。
 2,调用到抛出异常的功能时,抛出几个,就处理几个。
  一个try对应多个catch。
 3,多个catch,父类的catch放到最下面
 4,catch内,需要定义针对性的处理方式。不要简单的定义printStackTrace,输出语句。
  也不要不写。
  当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。
  try
  {
   throw new AException();
  }
  catch (AException e)
  {
   throw e;
  }

  如果该异常处理不了,但并不属于该功能出现的异常。
  可以将异常转换后,在抛出和该功能相关的异常。

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

 比如,汇款的例子。
异常的注意事项:
 在子父类覆盖时:
 1,子类抛出的异常必须是父类的异常的子类或者子集。
 2,如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。

自定义异常
package nuddlew.itheima;class Exception1 extends Exception {/** *  */private static final long serialVersionUID = 1L;public Exception1 (String message){super(message);}}public class ExceptionDefine {public static void main(String[] args) {try {throw new Exception1("有异常抛出");} catch (Exception1 e) {// TODO: handle exceptionSystem.out.println("haha");}}}

-----------android培训java培训、java学习型技术博客、期待与您交流!------------


0 0
原创粉丝点击