Java中的异常Exception

来源:互联网 发布:tensorflow lr 编辑:程序博客网 时间:2024/06/10 04:28

异常的处理

/* 3,对捕获到的异常对象进行常见方法操作。

 *   e.String() e.getMessage();获取异常信息

 *   

 * 在函数上声明异常

 * 便于提高安全性,让调用出进行处理,不处理编译失败。

 *

 *

 * 对多异常的处理

 * 1,声明异常时,建议声明更为具体的异常。这样处理的可以更具体

 * 2,对方声明几个异常,就有几个Catch

 *    如果多个Catch块中的异常出现继承关系,父类异常catch块放在最下面

 *   

 *    建议:在进行catch处理时,catch中一定要定义具体处理方式

 *    不要简单的定义一句 e.printStackTrace();,也不要简单的就书写一句输出语句。

 */

class DemoThree

{

    public int Chu(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException//在功能上通过throws关键字声明了该功能可能有问题

    {

       int[]arr =new int[a];

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

       return a/b;

    }

}

public class _07异常Throw {

   

    public static void main(String[]args)//throws Exception(主函数处理异常方式)

    {

       DemoThree d = new DemoThree();

       try

       {

           int x = d.Chu(3,0);

           //int n =new DemoThree().Chu(5, 0);

           System.out.println("相除得:"+x);

       }

       /*

       catch(Exception e)//接收异常

       {

           System.out.println(e.toString());

       }

       */

       catch(ArithmeticException e)//接收异常

       {

           System.out.println(e.toString());

           System.out.println("被零整除了");

       }

       catch(ArrayIndexOutOfBoundsException e)//接收异常

       {

           System.out.println(e.toString());

           System.out.println("角标越界了");

       }

       catch(Exception e)//父类catch

       {

           System.out.println(e.toString());

           System.out.println("父类catch");

       }

       System.out.println("Over");

    }

 

}

自定义异常

 

/*

 * 老师讲课

 *

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

 *

 * 比如问题是:电脑蓝屏、电脑冒烟

 *

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

 *

 * 电脑冒烟后,出现讲课进度无法继续

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

 *

 * 当捕捉到异常,处理不了时,继续将异常抛出去,创建新的异常对象(如下)

 * catch(MaoYanException e)

       {

           test();

           throw new NoPlanException("课时无法继续"+e.getMessage());//冒烟了,处理不了了,抛出去处理

       }

      

      

 */

 

 

//封装电脑蓝屏对象

class LanPingExceptionextends Exception

{

    LanPingException(String message)

    {

       super(message);

    }

}

//封装电脑冒烟对象,不能继承Exception异常了,因为冒烟机器就坏了,我们处理不了了

class MaoYanExceptionextends Exception

{

    MaoYanException(String message)

    {

       super(message);

    }

}

 

//讲课无法继续了

class NoPlanExceptionextends Exception

{

    NoPlanException(String message)

    {

        super(message);

    }

}

//电脑

class Computer

{

    private int state =3;//记录电脑的当前状态

    public void Run()throwsLanPingException,MaoYanException//抛出自定义的两个异常

    {

       if(state==2)

       {

           throw new LanPingException("蓝屏了");

       }

       if(state==3)

       {

           throw new MaoYanException("冒烟了");

       }

      

       System.out.println("电脑开始运行!");

    }

    public void reset()

    {

       state = 1;//重启后state就恢复成" 1 "

       System.out.println("电脑重启!");

    }

}

class Teacher

{

    private Stringname;

    private Computercmpt;//老师一出现就配一台电脑

 

    Teacher(String name)

    {

       this.name = name;

       cmpt = new Computer();

    }

    //讲课方法

    public void prelect()throws NoPlanException//抛出讲课异常

    {

       try

       {

           cmpt.Run();

       }

       catch(LanPingExceptione)

       {

           cmpt.reset();

       }

       catch(MaoYanException e)

       {

           test();

           throw new NoPlanException("课时无法继续"+e.getMessage());//冒烟了,处理不了了,抛出去处理

       }

       System.out.println(this.name+"开始上课");

 

    }

   

    public void test()

    {

       System.out.println("做练习吧!");

    }

   

}

 

public class _10异常综合练习 {

   

    public static void main(String[]args)

    {

       Teacher t = new Teacher("毕老师");

       try

       {

           t.prelect();

       }

       catch(NoPlanException e)//根据捕捉到的异常,做出处理方式

       {

           System.out.println(e.toString());

           System.out.println("换教室或放假");

       }

    }

}

 

 

RuntimeExceptin

/*---------------------

 * ArithmeticException:运算异常

 * RuntimeException:运行时异常

 * --------------------

 * Exception中有一个特殊的子类异常,RuntimeException运行时异常

 *

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

 *

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

 *

 * 之所以不在函数上声明,是因为不需要让调用者处理。

 *

 * 当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后

 * 对代码进行修正。

 *

 * 自定义异常时:如果该异常的发生,无法在继续运行运算。

 * 就让自定义的异常继承;RuntimeException.

 *

 * 对于异常分为两种:

 * 1,编译时被检测的异常

 * 2,编译时不被检测的异常(运行时异常。RuntimeException以及其子类 

 */

class FuShhuExceptionextends RuntimeException

{

    FuShhuException(String msg)

    {

       super(msg);

    }

}

class DemoS

{

    int div(int a,int b)

    {

       if(b<0)

       {

           throw new FuShhuException("出现除数为负数了。"+b);

       }

       if(b==0)

       {

           throw new ArithmeticException("被零除啦");//不用在方法后声明throws,编译通过

       }

       return a/b;

    }

}

public class _09RuntimeException {

   

    public static void main(String[]args)

    {

       DemoS s = new DemoS();

       int num = s.div(5, 1);

       System.out.println(num);

    }

 

}

 

/*

class Person

{

    public void checkName(String name)

    {

       //判断用户输入是否为lisi

       if("lisi".equals(name))//if(name!=null&& name.equals("lisi"))

       {

           System.out.println("YES");

       }

       else

       {

           System.out.println("NO");

       }

    }

}

public static voidmain(String[]args)

{

    Person p = new Perosn();

    p.checkName(null);

}

*/

 

异常Finally

/*

 * finally代码块:定义一定要执行的代码。

 * 通常用于关闭资源。

 */

 

 

//自定义异常

class fushuExceptionextends Exception

{

    fushuException(String message)

    {

       super(message);

    }

}

 

//计算工具

class chushu

{

    public int chu(int a,int b)throws fushuException

    {

       if(b<0)

       {

           throw new fushuException("负数不能小于0");

       }

       return a/b;

    }

}

public class _02异常_finally {

   

    public static void main(String[]args)

    {

       chushu cs = new chushu();

       try

       {

           int num = cs.chu(3, -1);

           System.out.println(num);

       }

       catch(fushuException e)

       {

           System.out.println(e.toString());//捕捉到异常的处理方式

           return ;//不想让程序继续执行

           //System.exit(0);//系统退出;finally语句将读不到

       }

       finally

       {

           System.out.println("finally");//finally存放的是一定会被执行的代码

       }

       System.out.println("OVER");

    }

 

}

 

/*

//数据库示例:

 

class NoOkException extendsException

{

    NoOkException(String msg)

    {

       super(msg);

    }

}

 

public void method()

{

    连接数据库;

    数据操作;//throw new SQLException();

    关闭数据库;//该动作,无论数据操作是否成功,一定要关闭资源。

   

    try

    {

       连接数据库;

       数据操作;

    }

    catch(SQLException e)

    {

       会对数据库进行异常处理。

       throw new NoOkException();

    }

    finally

    {

       关闭数据库;//该动作,无论数据操作是否成功,一定要关闭资源。

    }

}

*/

 

异常处理语句格式

/*

 

//第一个格式

try

{}

catch

{}

 

//第二个格式

try

{}

catch()

{}

finally

{}

 

//第三个格式

try

{}

finally

{}

 

*/

 

//记住:catch是用于处理异常。

//如果没有catch就代表异常没有处理过,如果该异常是检测时异常,那么必须声明。

class demo

{

    public void method()throws Exception

    {

       try

       {

           throw new Exception("xx");

       }

        finally

       {

           System.out.println("关闭资源");

           //关闭资源

       }

    }

}

public class _03异常_处理语句格式 {

   

    public static void main(String[]args)

    {

       demo d = new demo();

       try

       {

           d.method();

       }

       catch(Exception e)

       {

           System.out.println(e.toString());

       }

    }

 

}

 

异常:覆盖时的异常特点

/*

 * 异常在子父类中的体现:

 *

 * 1,子类在覆盖父类时,如果父类的方法抛出异常,

 *    那么子类的覆盖方法,只能抛出父类的异常或者该父类异常的子类。

 *

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

 *

 * 3,如果父类或接口的方法中,没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常

 *    如果子类方法中发生了异常,必须进行try处理,绝对不对抛。

 *   

 */

 

class AExceptionextends Exception

{

   

}

class BExceptionextends AException

{

   

}

class CExceptionextends Exception

{

   

}

/*

 * Exception

 *  |--AException

 *     |--BException

 *  |--CException

 */

class Fu

{

    public void show()throws AException

    {

      

    }

}

class Zi extends Fu

{

    public void show()throws BException//该子类只能抛出父类的ABException异常,不能抛C

    {

      

    }

}

 

class Text

{

    public void function(Fu f)//接收传进来的创建对象

    {

       try

       {

           f.show();

       }

       catch(AException e)

       {

          

       }

    }

}

public class _04异常_覆盖时的异常特点 {

   

    public static void main(String[]args)

    {

       Text t = new Text();

       t.function(new Zi());

      

    }

 

}

 

异常:练习

/*

 * 有一个圆形和长方形。

 * 都可以获取面积。

 * 对于面积如果出现非法数值,视为获取面积时出现问题。

 * 问题通过异常来表示。

 *

 * 注意:先要对这个程序进行基本的设计。

 *

 */

 

 

 

//获取面积

abstract interface MianJi

{

    abstract void getMianJi();

}

 

//长方形的负数异常

class ChuExceptionextends RuntimeException

{

    ChuException(String message)

    {

       super(message);

    }

}

 

class ChangFangXingimplements MianJi

{

    private int a,b;

    ChangFangXing(int a,int b)throws ChuException

    {

       if(a<=0 || b<=0)

       {

           throw new ChuException("出现非法值输入!");

       }

       this.a = a;

       this.b = b;

    }

    public void getMianJi()

    {

       System.out.println("长方形的面积:"+a*b);

    }

}

 

class Circle implements MianJi

{

    private int num;

    public static final double PI = 3.14;

    Circle(int num)

    {

       if(num<=0)

       {

           throw new ChuException("出现非法值输入!");

       }

       this.num = num;

    }

   

    public void getMianJi()

    {

       System.out.println("圆形的面积:"+num*num*PI);

    }

}

 

public class _05异常_练习 {

   

    public static void main(String[]args)

    {

       ChangFangXing c = new ChangFangXing(3,4);//长方形面积

       c.getMianJi();

      

       Circle y = new Circle(-4);//圆有面积

       y.getMianJi();

 

       System.out.println("OVER");

    }

 

}

 

异常:总结

/*

 * 异常是什么?

 * 是对问题的描述,并对问题进行封装。

 * ------------------------------

 * 异常体系:

 *    Throwable

 *      |--Error

 *      |--Exception

 *        |--RuntimeException

 *        

 * 异常体系的特点:异常体系中的所有类以及建立的对象,都具备可抛性。

 *                也就是说:可以被throws throw关键字操作

 *                只有异常体系具备这个特点

 *  --------------------------------

 * throws throw的用法:

 * Throw 定义在函数内,用于抛出异常对象。

 * Throws 定义在函数上,用于抛出异常类。可以抛出多个异常,用逗号隔开。

 *

 * 当函数内有throws抛出异常对象,并未进行try处理,需在函数上声明,否则,编译失败。

 *

 * 注意:RuntimeEcxeption异常,除外。也就是函数内如果抛出的是Runtime异常,函数上可以不用声明

 *

 * ----------------------------------------

 * 如果函数声明了异常,调用者需要进行处理,处理方式:可throwstry

 *

 * ----------------------------------------

 * 异常有两种:

 * 一个是编译时被检测异常

      该异常如果在编译时,如果没有处理(没有抛,也没有try),那么编译失败

     该异常被标识,可以被处理。

   

    一个是运行时异常(编译时不检测)(运行时异常。RuntimeException以及其子类 

        在编译时,不需要处理,编译器不检查。

        该异常发生,建议不处理,让程序停止。需要对代码进行修正。

 *

 * -------------------------------------------

 * 异常处理语句:

 * try(需要被检测的代码)catch(处理异常的代码)finally(一定会被执行的代码)

 *

 * 有三种语句格式:

 * try()catch()finally()

 * try()catch()

 * try()finally()

 *

 * 注意:finally中定义的通常是:关闭资源代码。因为资源必须要释放

 *      finally只有一种情况,不会执行。如下:

 *      当执行到--//System.exit(0);//系统退出;finally语句将读不到

 *

 * -----------------------------------

 * 自定义异常:

 *   定义类继承Exception或者RuntimeException

 *  

 *   1,为了该自定义类具备可抛性。

 *   2,让该类具备操作异常的共性方法。

 *  

 *   当要定义自定义的异常信息时,可以使用父类已经定义好的功能。

 *   将异常信息,传递给父类的构造函数。

 *  class MyException extends Exception

 *   {

 *      MyException(String message)

 *      {

 *          super(message);

 *      }

 *   }

 *  

 *   ------------------------------

 *

 * 自定义异常的出现有什么好处?

 * 自定义异常:按照Java的面向对象思想,将程序中的特有问题进行封装。

 *

 * 1,将问题进行封装。

 * 2,将正常流程代码,与问题代码相分离,方便阅读。

 *

 * 异常的处理原则:

 *

 * 1,处理方式有两种:try()或者throws

 * 2,调用到抛出异常的功能时,抛出几个就处理几个。

 *    会出现一个try对应多个catch的情况

 * 3,多个catch,父类的catch放到最下边。

 * 4catch内,需要定义针对性的处理方式,不要简单的定义printStackTrice,输出语句。

 *    也不要不写。

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

 *    try

 *   {throw new AException()}

 *   catch(AException e)

 *    {throw e;}

 *   

 *    如果该异常处理不了,但并不属于该功能出现的异常,

 *    可以将异常转换后,再抛出和该功能相关的异常

 *   

 *    或者,异常可以处理,当需要将异常产生的和本功能相关的问题提供出去,

 *    让调用者知道,并作处理。也可以将捕获异常处理后,转换新的异常抛出。

 *    try

 *   {throw new AException()}

 *   catch(AException e)

 *    {

 *      //AException进行处理。

 *      throw new BException("");

 *    }

 *    比如:汇款的例子,

 *   

 * -------------------------------------------------------------------

 * 异常的注意事项:

 * 在子父类覆盖时,

 * 1,子类抛出的异常,必须是父类异常的子类,或者子集。

 * 2,如果父类或者接口,没有异常抛出时,子类覆盖出现异常,只能try,不能抛

 *

 *

 *   

 */

0 0