`
new_Line
  • 浏览: 10268 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

黑马程序员_java异常

 
阅读更多

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

异常:
    异常的体系:
    Throwable:
        Error:(大问题)通常出现重大问题如:运行的类不存在
               或者内存溢出等。不编写针对代码对其处理
        Exception:(小问题)运行时出错
           Exception():无参构造器
           Exception(String msg):带有消息文本的构造器
           Exception(Throwable cause):带有起因的构造器
           Exception(String msg, Throwable cause):有消息文本,也有起因的构造器。
    异常体系的特点:
    异常体系中的所有类,以及建立的对象都具备可抛性,也即是说可以被throw和throws关键字
    操作,也只有异常体系具备这个特点
    异常处理机制:
    Java的异常处理机制可以让程序具有极好的容错性,让程序更加健壮。当程序运行出现意外情况时,
    系统会自动生成一个Exception对象来通知程序,从而实现将"业务功能实现代码"和"错误处理代码"
    分离,提供更好的可读性。
   
    异常类方法介绍:
      String getMessage(),获取异常信息,返回字符串
     String toString(),获取异常类名和异常信息,返回字符串。
      void printStackTrace(),获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
    异常的分类:
    1:编译时异常
           该异常在编译时期,如果没有处理,编译失败。该异常被标识,代表可以被处理
    2:运行时异常
        在编译时不需要处理,编译器不检查。该异常的发生,建议不处理,让程序停止,需要对代码进行修正
    异常的处理:
    1:使用throws声明异常:
        当方法不知道如何处理这种类型的异常,该异常应该由上一级调用者处理;如果main方法也不知道
        如何处理这种异常,也可以使用throws声明抛出异常,该异常将交给JVM处理。JVM对异常的处理方
        法是:打印异常跟踪栈信息,并终止程序。throws可以声明多个异常类,多个异常类之间以逗号隔
        开。throws声明抛出的语法如下:
             [修饰符] [返回值类型] [方法名] throws XXException, XXXException...{}
             代码示例:
            public class ThrowsTest{
                public static void main(String[] args) throws IOException
                {
                    FileInputStream fis = new FileInputStream("b.java");
                }
            }
             上面程序使用了throws声明抛出IOException异常,一旦使用throws声明抛出异常,程序无需使用
             try...catch来捕获异常。
        使用throw抛出异常:
        如果程序中的数据、执行与既定的业务需求不符而产生的异常,必须由程序员来决定抛出,系统无法
        抛出这种异常。则应该使用throw语句,throw语句可以单独使用,它抛出的不是异常类,而是异常类
        的实例,而且每次只能抛一个异常实例。格式如下:
            throw new 异常类("描述信息");
             代码示例:
            /*
                需求:求两个数的和,当一个数小于等于0的时候,抛出异常
             */
             public class Deom{
                public static void main(String[] args)
                {
                    int sum = sum(-2, 3);
                    System.out.println(sum);
                }
                public static int sum(int a, int b)
                {
                    if(a <= 0 || b <= 0)
                        throw new RuntimeException("出现负数");
                    return a + b;
                }
             }
        throw和throws的区别:
        |--throws:
            声明,使用在函数()和{}之间,后面跟着异常类,可以有多个,逗号隔开
        |--throw:
            抛出,使用在函数内,后面跟着异常类对象
    2:使用try...catch捕获异常
            格式一:
          try {
            //需要被检查的代码
            } catch()
            {
            //处理异常的代码(处理方式)
            }
        try块是监控区,在try中出现的异常会被捕获,然后送到catch之后,与catch所处理的异常类型进行比较,
        如果匹配,那么就把异常对象交给catch了,然后调用catch块。注意,在try块中,出现了异常后,
        在出现异常的位置直接跳转到catch中,而try后面的语句就不会在执行了。

        格式二:
            try{
              //需要被检查的代码
            }finally
            {
            //一定会执行的语句
            }
       

        格式三:
            try
            {
                //需要被检查的代码
            }catch(异常类 变量名)

            {
                //处理异常的代码(处理方式)
            }finally
            {
                //一定会执行的语句
            }
        如果try中没有抛出异常,那么不会执行catch,但无论有无异常都会执行finally
          如果try有异常,那么会执行catch,但有异常,也会执行finally
        如果在finally之前有返回语句(return和抛出异常语句),那么会在返回之前先执行finally,然后再继续返回
    |--示例代码:
         public class Test7 {
        public static void main(String[] args) {
            int x  = fun();
            System.out.println("最終x的值是,x = " + x); //打印的值是6
        }
        @SuppressWarnings("finally")
        public static int fun(){
            int x = 0;
            try{
                //
                x = 6;
                return x;
            }finally{
                x = 10;
                //将x的值输出,测试return是在finally执行后才返回
                System.out.println("finally中的x執行了,x = " + x);//打印的值是10
            }
        }
         }
        finally中放什么样的代码
        通常我们会用来断开外部资源绑定。例如我们的程序绑定了一个磁盘上的文件,
        如果在方法返回之前,可以断开,那么就应该把断开的语句放到finally中,
        这样可以保证断开的语句总是执行。
        finally中不会执行的情况
            finally遇见了System.exit(0)时,就不会再执行了。因为System.exit(0)会把JVM停止了。
        使用try...catch处理异常注意事项:
           在方法内部把异常处理掉,外界不知道内部的问题,也不会让调用者出现异常。
           注意:当声明多个异常,就对应要有几个catch块,父类的catch块要放到最后,catch内
           需要定义针对性的处理方式,不要简单定义printStackTrace。当捕获的异常,本功能处理
           不了时,可以继续在catch中抛出,如果该异常处理不了,但并不属于该功能出现的异常,
           可以将异常转换后抛出
        代码示例:
        public class Teacher {
            private String name;
            private Computer cmpt;
            public Teacher(){}
            public Teacher(String name)
            {
                this.name = name;
                cmpt = new Computer();
            }
            public void prelect() throws TeacherException
            {
                try {
                    cmpt.run();
                } catch (LanPinException e) {
                    cmpt.reset();
                } catch (MaoYanException e) {
                    practice();
                    //将异常转换抛出
                    throw new TeacherException("课时计划无法完成" + e.getMessage());
                    //System.out.println("");throw单独存在的时候,后面不能有语句
                }
                System.out.println("开始上课了");
            }
            public void practice()
            {
                System.out.println("做练习");
            }
        }
        public class Computer {
            private int state = 3;
            public void run() throws LanPinException, MaoYanException
            {
                /*
                   通过改变状态值,来测试效果
                 */
                if(state == 2)
                    throw new LanPinException("蓝屏了");
               
                if(state == 3)
                    throw new MaoYanException("冒烟了");
                System.out.println("电脑运行了");
            }
            public void reset()
            {
                state = 1;
                System.out.println("电脑重启");
               
            }
        }
        /*
            自定义异常类
         */
        public class LanPinException extends Exception {
            public LanPinException(String msg)
            {
                super(msg);
            }
        }
        /*
            自定义异常类
         */
        public class MaoYanException extends Exception {
            public MaoYanException(String msg)
            {
                super(msg);
            }
        }
        /*
            自定义异常类
         */
        public class TeacherException extends Exception{
            public TeacherException(){}
            public TeacherException(String msg)
            {
                super(msg);
            }
        }
        public class Test {
            public static void main(String[] args) {
                Teacher t = new Teacher("老师");
                try {
                    t.prelect();
                } catch (TeacherException e) {
                    System.out.println(e.toString());
                    System.out.println("换老师或者放假");
                }
            }
        }  
    自定义异常:继承Exception和RuntimeException
    因为项目中出现特有的问题,而这些问题本没有被java所描述,所以对于可以按照java的
    封装思想,将特有问题进行自定义封装
    如何进行自定义异常呢?
           因为父类中已经将异常信息的操作做完了,所以子类只需在构造函数中 通过super()
           把异常信息传递给父类进行初始化,子类就可以直接调用父类中的getMessage()获取
           自定义的异常信息
    继承Exception的原因:
           异常体系有一个特点,异常类和异常对象都被抛出,他们都具有可抛性。
           这个可抛性是Throwable体系中的独有特点,只有这个体系中的类和对象
           才可以被throw和throws操作
    代码示例:
        public class Test {
            public static void main(String[] arg)
            {       
                try
                {
                    DemoException d = new DemoException();
                    int result = d.result(5, -2);
                    System.out.println(result);
                }
                catch(FuShuException e)
                {
                    System.out.println(e.toString());
                    System.out.println("出现负数了,值是:" + e.getValue());
                }
                System.out.println("over");
            }
        }
        class DemoException
        {
            public int result(int a, int b)throws FuShuException //方法外部throws关键字声明有可能出问题
            {
                if(b < 0)
                {
                    throw new FuShuException("被除数出现负数",b); //方法内部throw关键字抛出异常
                }
                return a/b;
            }
        }
        class FuShuException extends Exception
        {
            private int value;
            FuShuException(){}
            FuShuException(String msg,int value)
            {
                super(msg);
                this.value = value;
            }
            public int getValue()
            {
                return value;
            }
        }
    RuntimeException:
      Exception中有一个特殊的子类异常,RuntimeException,叫做运行时异常。
    如果在函数内throw(抛出)该异常对象,无需在函数上throws(声明)该异常类;
    如果在函数上声明该异常类,调用者无需处理。编译都通过。
        代码示例一:
        class Demo{
            int div(int a, int b) //此处没有做任何操作,编译通过
            {
                if(b == 0)
                    throw new ArithmeticException("被0除了");
                return a/b;
            }
        }
        class ExceptionDemo{
            public static void main(String[] args)
            {
                Demo d = new Demo();
                int x = d.div(3,0);
                System.out.println("x=" + x);
                System.out.println("over");
            }
        }
        代码示例二:
        class Demo{
            int div(int a, int b) throws ArithmeticException
            {
                return a/b;
            }
        }
        class ExceptionDemo{
            public static void main(String[] args) //此处没有申明异常,编译通过了
            {
                Demo d = new Demo();
                int x = d.div(3,0);
                System.out.println("x=" + x);
                System.out.println("over");
            }
        }
        上述程序之所以不用在函数进行申明,是因为不需要调用者处理。当该异常发生,希望
    程序停止。因为在运行时出现了无法继续运算的情况,希望停止程序后对代码进行修正。
    因此,自定义异常时,如果该异常的产生,无法再继续进行运算,就让自定义异常继承RuntimeException
      代码示例:
        public class Test {
            public static void main(String[] arg)
            {       
                try
                {
                    DemoException d = new DemoException();
                    int result = d.result(5, -2);
                    System.out.println(result);
                }
                catch(FuShuException e)
                {
                    System.out.println(e.toString());
                    System.out.println("出现负数了,值是:" + e.getValue());
                }
                System.out.println("over");
            }
        }
        class DemoException
        {
            public int result(int a, int b) //不需要作处理
            {
                if(b < 0)
                {
                    throw new FuShuException("被除数出现负数",b); //方法内部throw关键字抛出异常
                }
                return a/b;
            }
        }
        class FuShuException extends RuntimeException //继承RuntimeException
        {
            private int value;
            FuShuException(){}
            FuShuException(String msg,int value)
            {
                super(msg);
                this.value = value;
            }
            public int getValue()
            {
                return value;
            }
        }
    异常在子父类中覆盖的体现:
    1:子类在重写父类中的方法时,如果父类方法抛出异常,子类中重写的方法,
       只能抛出父类的异常或者该异常的子类异常
          举例说明:
        class AException extends Exception{}
        class BException extends AException{}
        class CException extends Exception{}
        class Fu{
            void show() throws AException
            {
               
            }
        }
        class Zi{
            /*
              只能抛AException或者AException的子类异常BException
              不能抛CException
             */
            void show()throws AException//
            {               
           
            }
        }
    2:如果父类方法抛出多个异常,那么子类再覆盖该方法时,只能抛出父类异常的子集
    3:如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常
       如果子类方法发生了异常,就必须要进行try处理,绝对不能抛
    常见的异常:
        1  OutOfMemoryError(内存溢出错误)
         堆内存溢出
           方法区溢出
   
    2  StackOverflowError(调用栈溢出错误)
      递归调用出了问题。
      通常递归调用,都要有出口,而没有出口就会出现这个StackOverflowError错误!
   
    3  NoSuchMethodError(没有这个方法错误)
      原来有这个方法,所以依赖这个方法的类就编译通过了,但后来这个方法没了,那么原来依赖它的类只要运行就会出现这个错误。
   
    4  NoClassDefFoundError(没有找到类错误)
      原来依赖的类,现在已经不存在了,就会出现这个异常。

    5  ArithmeticException(算术异常)
      整数除以0

    6  ArrayIndexOutOfBoundsException(数组下标越界异常)
      通常我们也不会越界,但只要一使用循环,就不好控制。

    7 ClassCastException
      错误的强转!
      Person p  = new Person();
      Student s = (Student)p;

    8 IllegalArgumentException
      非法参数异常!public void run(int f) {//参数表示方向,前1、后2、左3、右4
      if(f < 0 || f > 4) {throw new IllegalArgumentException();}
    }

    public void setAge(int age) {
       
    }

    9 NullPointerException
      Person p = null;//没有实例化
        p.getName();//出现空指针异常

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

分享到:
评论

相关推荐

    黑马程序员_Java基础辅导班教程课件[第01期]第15天

    总结来说,《黑马程序员_Java基础辅导班教程课件[第01期]第15天》的内容可能涉及了Java语言的核心概念,包括面向对象编程、控制结构、异常处理、文件I/O、集合框架以及内存管理等。通过深入学习和实践这些知识点,...

    黑马程序员_Java基础辅导班教程课件[第01期]第13天

    在"黑马程序员_Java基础辅导班教程课件[第01期]第13天"中,我们聚焦于Java编程语言的基础知识,这是一门面向初学者的课程,旨在帮助学员快速掌握Java开发的基本技能。第13天的课程通常会涵盖上一天(第12天)所学...

    黑马程序员_hibernate框架开发2016版讲义和笔记资料_day02

    《黑马程序员_hibernate框架开发2016版讲义...通过对黑马程序员提供的这门课程的学习,开发者不仅能掌握Hibernate的核心概念和技术,还能提升在实际项目中的数据库操作效率,为构建高效、稳定的Java应用打下坚实基础。

    01_黑马程序员_张孝祥_Java基础加强_课程价值与目标介绍.zip

    【标题】"01_黑马程序员_张孝祥_Java基础加强_课程价值与目标介绍.zip" 提供的是一门由黑马程序员机构推出的Java基础强化课程,由讲师张孝祥主讲,旨在深入讲解Java编程的基础知识并进行能力提升。 【描述】中提到...

    黑马程序员_Java基础辅导班教程课件[第01期]第14天

    【Java基础辅导班教程】- 黑马程序员 在编程世界中,Java是一种广泛应用的面向对象的编程语言,尤其在企业级应用开发中占据主导地位。"黑马程序员"作为知名的IT培训机构,提供了丰富的Java基础辅导课程,旨在帮助...

    黑马程序员_毕向东_Java基础源码.rar

    这个名为“黑马程序员_毕向东_Java基础源码.rar”的压缩包文件,包含了丰富的Java基础源代码实例,对于初学者来说,是深入了解Java编程的良好资源。 一、Java基本语法 Java语言以其严格的类型检查和面向对象特性...

    黑马程序员_Java基础辅导班教程课件[第01期]第11天

    "黑马程序员_Java基础辅导班教程课件[第01期]第11天"是一个专门为初学者设计的培训课程,旨在帮助学员深入理解和掌握Java的核心概念。这个课程可能是通过视频形式进行的,结合了理论讲解和实际操作,以便让学习者能...

    黑马程序员_Java基础辅导班教程课件[第01期]第8天

    7. **异常处理**:Java中的异常处理是程序健壮性的重要组成部分。学习者可能学习了如何使用try-catch-finally语句块,以及如何自定义异常。 8. **文件与IO流**:虽然未明确指出,但文件操作和IO流通常是Java基础...

    黑马程序员_(适合初学者入门的Java基础视频)

    "黑马程序员_(适合初学者入门的Java基础视频)"是一套专为初学者设计的Java基础教学课程,旨在帮助零基础的学习者逐步掌握Java编程的基本概念和技能。 该视频教程涵盖了Java的基础知识,包括: 1. **环境搭建**:...

    黑马程序员_Java基础辅导班教程课件[第01期]第10天

    在"黑马程序员_Java基础辅导班教程课件[第01期]第10天"中,我们聚焦于Java编程语言的基础知识,这是一门面向初学者的课程,旨在帮助学员快速掌握Java的核心概念。通过这个阶段的学习,学员将能够理解并运用Java的...

    黑马程序员_Java基础辅导班教程课件[第01期]第4天

    在"黑马程序员_Java基础辅导班教程课件[第01期]第4天"中,我们可以推测这是针对初学者的Java编程课程,旨在帮助学员掌握Java的基础知识。 在课程的第4天,可能讲解了以下核心概念: 1. **类(Class)**:`Demo.class...

    黑马程序员_毕向东_Java基础视频教程第18天-12-IO流(文本文件读取练习).zip

    在这个“黑马程序员_毕向东_Java基础视频教程第18天-12-IO流(文本文件读取练习)”中,毕向东老师将深入讲解如何使用Java IO流来读取文本文件。Java IO流提供了多种类和方法,使得开发者可以灵活高效地处理输入和输出...

    黑马程序员_Java基础辅导班教程课件[第01期]第7天

    5. **异常处理**:Java提供了异常处理机制,通过try-catch-finally语句块来捕获和处理程序运行时可能出现的错误,保证程序的健壮性。 "视频下载地址.txt"可能提供了该堂课的视频教程链接,视频通常更直观地展示了...

    黑马程序员_毕向东_Java基础视频教程第18天-13-IO流(拷贝文本文件).zip

    本教程《黑马程序员_毕向东_Java基础视频教程第18天-13-IO流(拷贝文本文件)》专注于讲解如何利用IO流来实现文本文件的复制操作。这个过程涉及到了对文件读取、数据缓冲以及写入等基础知识,对于初学者来说是理解和...

    黑马程序员-Java语言进阶-源码、教程笔记.zip

    day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda表达式 day08_File类、递归 day09_字节流、字符流 day10_缓冲流、转换流、序列化流、Files day11_网络编程 day12_函数式接口 day13_Stream...

    黑马程序员_从零开始征服Android之旅(第二季)源码和笔记(上)

    《黑马程序员_从零开始征服Android之旅(第二季)源码和笔记(上)》是一部针对初学者的全面Android开发教程,旨在帮助学员系统地掌握Android应用开发的基础知识和实战技巧。通过本教程的学习,你可以从理论出发,...

    黑马程序员_毕向东_Java基础视频教程第18天-11-IO流(文本文件读取方式二).zip

    在本教程“黑马程序员_毕向东_Java基础视频教程第18天-11-IO流(文本文件读取方式二)”中,主讲人毕向东将深入讲解如何使用Java有效地读取文本文件,特别是第二种常用的方法。以下是关于Java IO流和文本文件读取的...

    黑马程序员入学Java精华总结

    ### 黑马程序员入学Java精华总结 #### 一、Java概述与基础知识 1. **何为编程?** - 编程是指通过编写计算机能够理解的指令来解决问题或完成特定任务的过程。这些指令通常被组织成算法,并使用某种编程语言实现。...

    黑马程序员_毕向东最新经典Java基础视频

    根据提供的文件信息,我们可以推断出这是一套由知名IT教育机构“黑马程序员”出品、由讲师毕向东主讲的Java基础教学视频。由于实际视频内容无法直接获取,本篇将依据标题、描述以及部分标签内容,综合分析并展开相关...

    黑马程序员_struts2框架开发2016版讲义和笔记资料_day01_day02_day03_day04

    总的来说,这份"黑马程序员_struts2框架开发2016版讲义和笔记资料"是一个全面学习和掌握Struts2框架的宝贵资源,涵盖了从基础到实践的所有重要方面,对于提升Java EE开发者的技能水平大有裨益。通过系统学习,开发者...

Global site tag (gtag.js) - Google Analytics