博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第十九节(异常的基本概念, 异常的分类, 异常的捕获和处理,自定义异常,方法覆盖与异常)...
阅读量:4659 次
发布时间:2019-06-09

本文共 9618 字,大约阅读时间需要 32 分钟。

1: Java 异常处理   异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。  异常发生的原因有很多,通常包含以下几大类:   1. 用户输入了非法数据。   2. 要打开的文件不存在。    网络通信时连接中断,或者JVM内存溢出。这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。   要理解Java异常处理是如何工作的,要掌握以下三种类型的异常:    检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。    运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的     错误: 错误不是  2:所有的异常类是从java.lang.Exception类继承的子类。Exception类是Throwable类的子类。除了Exception类外,Throwable还有一个子类Error 。Java程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。Error用来指示运行时环境发生的错误。异常类有两个主要的子类:IOException类和RuntimeException类  3:异常的分类 异常主要分为:错误、一般性异常(受控异常) 、运行期异常(非受控异常) 错误:如果应用程序出现了 Error,那么将无法恢复,只能重新启动应用程序,最典型的 Error 的异常是:OutOfMemoryError受控异常:出现了这种异常必须显示的处理,不显示处理 java 程序将无法编译通过非受控异常: 此种异常可以不用显示的处理,例如被 0 除异常, java 没有要求我们一定要处理4:异常的捕获和处理需要采用 try 和 catch 来处理try 中包含了可能产生异常的代码1. try 后面是 catch ,catch 可以有一个或多个,catch 中是需要捕获的异常2. 当 try 中的代码出现异常时, 出现异常下面的代码不会执行, 马上会跳转到相应的 catch语句块中,如果没有异常不会跳转到 catch 中3. finally 表示,不管是出现异常,还是没有出现异常,finally 里的代码都执行,finally 和catch 可以分开使用,但 finally 必须和 try 一块使用5:getMessage 和 printStackTrace(): 如何取得异常对象的具体信息,常用的方法主要有两种:1.  取得异常描述信息:getMessage()2.  取得异常的堆栈信息(比较适合于程序调试阶段) :printStackTrace()
/*    1. 什么是异常                <1> 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的        <2> 在Java中采用“类” 去模拟异常        <3> 类是可以创建对象的c    2. 异常机制的作用是什么?            Java 语言为我们提供一种完善的异常处理机制        作用是: 程序发生异常事件的之后,为我们输出详细信息        开发者通过这个信息 就可以对程序进行一些处理,这样使我们的程序变得更加健壮*/public class ExceptionTest01{    // Java入口    public static void main(String[] args){                int i = 8;        int j = 0;                /*            编译通过了,但是运行时出现了异常,表示发什么某个异常事件                        实质:                                程序执行过程中发生了算数异常这个事件,JVM为我们创建了一个ArithmeticException类型的对象                并且这个对象包含了 详细的异常信息,并且JVM会将这个对象中的信息输出到控制台        */                int k = 8/0; // java.lang.ArithmeticException:                System.out.println("Ming太帅了 !" + k);             }}
/*    异常处理机制 能够使我们的程序变得更加的健壮*/public class ExceptionTest02{    public static void main(String[] args){                int i = 6;        int j = 0;                if(j != 0){            int k = i / j;            System.out.println(i + "/" + j + "=" + k);            } else {            System.out.println("除数不能为零 !");        }            }}
/*    处理异常的有两种方式:            1. 声明抛出: throws        2. try ... catch*/import java.io.*;public class ExceptionTest03{    //public static void main(String[] args) throws FileNotFoundException {
public static void main(String[] args) throws Exception{ // FileInputStream fis = new FileInputStream("C:\\work\\Java\\course\\vip\\JavaSE-Course-Arry\\chapter21\\ExceptionTest01.java"); } }//import java.io.*;public class ExceptionTest04{ public static void main(String[] args) throws FileNotFoundException{ // arry1(); /* 使用 throws 处理异常不是真正处理 而是推卸责任 谁调用我我就抛给谁 上边的arry1如果出现了异常,可以采用 上抛是,给我们的JVM ,JVM遇到了这个异常就会退出JVM */ // 真正处理 try{ arry1(); //FileInputStream fis = new FileInputStream("C:\\worfsdfsfk\\Java\\course\\vip\\JavaSE-Course-Arry\\chapter21\\ExceptionTest01.java"); } catch(FileNotFoundException e){ System.out.println("太棒了 !"); } } public static void arry1() throws FileNotFoundException{ arry2(); } public static void arry2() throws FileNotFoundException{ System.out.println("执行了Arry2"); new FileInputStream("C:\\1.txt"); } //最后输出太棒了/*在程序运行过程中产生了 FileNotFoundException类型的异常JavaJVM 我们创建了一个 FileNotFoundException类型的对象该对象中携带了下边的错误信息JVM负责将该对象的信息打印到控制台并且javaJVM停掉了程序的运行Exception in thread "main" java.io.FileNotFoundException: C:\1.txt (系统找不到指定的文件。) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.
(Unknown Source) at java.io.FileInputStream.
(Unknown Source) at ExceptionTest04.arry2(ExceptionTest04.java:31) at ExceptionTest04.arry1(ExceptionTest04.java:26) at ExceptionTest04.main(ExceptionTest04.java:9)*/}
import java.io.*;public class ExceptionTest06{    /* 抛出多个异常    public static void main(String[] args) throws FileNotFoundException,IOException{                            FileInputStream fis = new FileInputStream("c:/11.txt");         fis.read();                                  */         /*    直接使用更大的        public static void main(String[] args) throws IOException{                            FileInputStream fis = new FileInputStream("c:/11.txt");         fis.read();    }*/            public static void main(String[] args){                  try{            FileInputStream fis = new FileInputStream("c:/11.txt");             fis.read();         } catch(FileNotFoundException e){                 System.out.println("文件没有找到");                 System.out.println(e);         } catch(IOException e){             System.out.println(e);             System.out.println("其他IO的错误异常");         }                  System.out.println("Ming太帅了 !");             }           最后输出:
文件没有找到
Exception in thread "main" java.io.FileNotFoundException: C:\1.txt (系统找不到指定的文件。)        at java.io.FileInputStream.open(Native Method)        at java.io.FileInputStream.
(Unknown Source) at java.io.FileInputStream.
(Unknown Source) at ExceptionTest04.arry2(ExceptionTest04.java:31) at ExceptionTest04.arry1(ExceptionTest04.java:26) at ExceptionTest04.main(ExceptionTest04.java:9)
Ming太帅了 !
}
/*    关于 getMessage 和 printStackTrace 方法的应用如何取得异常对象的具体信息,常用的方法主要有两种:1.取得异常描述信息:getMessage().  2.取得异常的堆栈信息(比较适合于程序调试阶段)printStackTrace();*/import java.io.*;public class ExceptionTest07{        public static void main(String[] args){            try{        FileInputStream fis = new FileInputStream("c:/11.txt");        }catch(FileNotFoundException e){                        // 取得异常的堆栈信息,比较适合于程序调试阶段            e.printStackTrace();                        /*                java.io.FileNotFoundException: c:\11.txt (系统找不到指定的文件。)                        at java.io.FileInputStream.open(Native Method)                        at java.io.FileInputStream.
(Unknown Source) at java.io.FileInputStream.
(Unknown Source) at ExceptionTest07.main(ExceptionTest07.java:18) c:\11.txt (系统找不到指定的文件。) */ // 取得异常描述信息 String meg = e.getMessage(); System.out.println(meg); //c:\11.txt (系统找不到指定的文件。) } }}
/*    finally 语句块        1. finally语句块可以直接和try语句块联用 try... finally ...        2. try ... catch ... finally 也可以        3. 在finally中的代码是一定会执行的*/import java.io.*;public class ExceptionTest08{        public static void main(String[] args) throws Exception{            /*        try{            System.out.println("ABC");            return;        }finally{            System.out.println("太帅了!");        }        *//*        try{                FileInputStream fis = new FileInputStream("c:/1.txt");                // 这个是不会执行的        System.out.println("Ming就是帅 !");        }finally{            // 总是执行        System.out.println("总是那么帅 !");        }*/    // 只要在执行finally语句块之前退出了Jvm,否则 finally语句块会执行    try{                // 退出Java JVM        System.exit(0);        } finally{        // 不会执行        System.out.println("太爽了!");    }                   }}
public class ExceptionTest09{        public static void main(String[] args){                int i = arry();        System.out.println(i);//输出为1;            }        public static int arry(){        int i = 1;        try{            return i;        } finally{            i++;            System.out.println("i = " + i);        }                    /* 执行原理            int i = 1;            try{                int temp = i;                return temp;            }finally{                i++;                System.out.println("i = " + i);            }                */            }}
/*    finally语句块 一定会执行,所以通常在程序中为了保证某资源一定会释放    所以一般在finally语句块中释放资源        1. 受控异常:就是编译异常    2. 非受控异常:就是运行时异常    */import java.io.*;public class ExceptionTest10{    public static void main(String[] args){            // 必须声明在外边        FileInputStream fis = null;            try{            fis = new FileInputStream("c:/11.txt");            }catch(FileNotFoundException e){            e.printStackTrace();                    }finally{            // 为了保证资源的释放            if(fis != null){                try{                    fis.close();                }catch(IOException e){                    e.printStackTrace();                    }            }                    }    }}
/*    自定义异常*/import java.io.*;public class ExceptionTest12{        public static void main(String[] args){                try{            arry1(8,0);        } catch(MyException e){            String myMsg = e.getMessage();            System.out.println("myMsg = " + myMsg);        }                    }        private static void arry1(int i,int j) throws MyException{  // 如果是受控异常 必须声明        if(j == 0){            throw new MyException("除数为0");            }         int k = i / j;        System.out.println("k = " + k);    }        }// 定义异常class MyException extends Exception{        public MyException(){        // 调用父类默认的构造函数        super();        }        public MyException(String message){        // 手动调用父类的构造方法        super(message);    }}

 

转载于:https://www.cnblogs.com/Deng1185246160/p/4231226.html

你可能感兴趣的文章
使用Struts2标签遍历集合
查看>>
angular.isUndefined()
查看>>
第一次软件工程作业(改进版)
查看>>
网络流24题-飞行员配对方案问题
查看>>
引入css的四种方式
查看>>
iOS开发UI篇—transframe属性(形变)
查看>>
3月7日 ArrayList集合
查看>>
jsp 环境配置记录
查看>>
Python03
查看>>
LOJ 2537 「PKUWC2018」Minimax
查看>>
使用java中replaceAll方法替换字符串中的反斜杠
查看>>
Some configure
查看>>
流量调整和限流技术 【转载】
查看>>
1 线性空间
查看>>
VS不显示最近打开的项目
查看>>
DP(动态规划)
查看>>
chkconfig
查看>>
2.抽取代码(BaseActivity)
查看>>
夏天过去了, 姥爷推荐几套来自smashingmagzine的超棒秋天主题壁纸
查看>>
反射的所有api
查看>>