zoukankan      html  css  js  c++  java
  • JAVA异常处理

    * 程序的异常:Throwable
    * 严重问题:Error 我们不处理。这种问题一般都是很严重的,比如说内存溢出。
    * 问题:Exception
    * 编译期问题:不是RuntimeException的异常 必须进行处理的,因为你不处理,编译就不能通过。
    * 运行期问题:RuntimeException 这种问题我们也不处理,因为是你的问题,而且这个问题出现肯定是我们的代码不够严谨,需要修正代码的。
    *

    * 我们自己如何处理异常呢?
    * A:try...catch...finally
    * B:throws 抛出
    *
    * try...catch...finally的处理格式:
    * try {
    * 可能出现问题的代码;
    * }catch(异常名 变量) {
    * 针对问题的处理;
    * }finally {
    * 释放资源;
    * }
    *
    * 变形格式:
    * try {
    * 可能出现问题的代码;
    * }catch(异常名 变量) {
    * 针对问题的处理;
    * }
    *
    * 注意:
    * A:try里面的代码越少越好
    * B:catch里面必须有内容,哪怕是给出一个简单的提示

    * A:一个异常
    * B:二个异常的处理
    * a:每一个写一个try...catch
    * b:写一个try,多个catch
    * try{
    * ...
    * }catch(异常类名 变量名) {
    * ...
    * }
    * catch(异常类名 变量名) {
    * ...
    * }
    * ...
    *
    * 注意事项:
    * 1:能明确的尽量明确,不要用大的来处理。
    * 2:平级关系的异常谁前谁后无所谓,如果出现了子父关系,父必须在后面。
    *
    * 注意:
    * 一旦try里面出了问题,就会在这里把问题给抛出去,然后和catch里面的问题进行匹配,
    * 一旦有匹配的,就执行catch里面的处理,然后结束了try...catch
    * 继续执行后面的语句。

    * JDK7出现了一个新的异常处理方案:
    * try{
    *
    * }catch(异常名1 | 异常名2 | ... 变量 ) {
    * ...
    * }
    *
    * 注意:这个方法虽然简洁,但是也不够好。
    * A:处理方式是一致的。(实际开发中,好多时候可能就是针对同类型的问题,给出同一个处理)
    * B:多个异常间必须是平级关系。

    * 编译时异常和运行时异常的区别
    * 编译期异常:Java程序必须显示处理,否则程序就会发生错误,无法通过编译
    * 运行期异常:无需显示处理,也可以和编译时异常一样处理

    * 在try里面发现问题后,jvm会帮我们生成一个异常对象,然后把这个对象抛出,和catch里面的类进行匹配。
    * 如果该对象是某个类型的,就会执行该catch里面的处理信息。
    *
    * 异常中要了解的几个方法:
    * public String getMessage():异常的消息字符串
    * public String toString():返回异常的简单信息描述
    * 此对象的类的 name(全路径名)
    * ": "(冒号和一个空格)
    * 调用此对象 getLocalizedMessage()方法的结果 (默认返回的是getMessage()的内容)
    * printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。把信息输出在控制台。

    * 有些时候,我们是可以对异常进行处理的,但是又有些时候,我们根本就没有权限去处理某个异常。
    * 或者说,我处理不了,我就不处理了。
    * 为了解决出错问题,Java针对这种情况,就提供了另一种处理方案:抛出。
    *
    * 格式:
    * throws 异常类名
    * 注意:这个格式必须跟在方法的括号后面。
    *
    * 注意:
    * 尽量不要在main方法上抛出异常。
    * 但是我讲课为了方便我就这样做了。
    *
    * 小结:
    * 编译期异常抛出,将来调用者必须处理。
    * 运行期异常抛出,将来调用可以不用处理。

    * throw:如果出现了异常情况,我们可以把该异常抛出,这个时候的抛出的应该是异常的对象。
    *
    * throws和throw的区别(面试题)
    throws
    用在方法声明后面,跟的是异常类名
    可以跟多个异常类名,用逗号隔开
    表示抛出异常,由该方法的调用者来处理
    throws表示出现异常的一种可能性,并不一定会发生这些异常
    throw
    用在方法体内,跟的是异常对象名
    只能抛出一个异常对象名
    表示抛出异常,由方法体内的语句处理
    执行throw则一定抛出了某种异常

    1     public static void method() {
    2         int a = 10;
    3         int b = 0;
    4         if (b == 0) {
    5             throw new ArithmeticException();
    6         } else {
    7             System.out.println(a / b);
    8         }
    9     }

    原则:如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws 区别: 后续程序需要继续运行就try 后续程序不需要继续运行就throws

    * finally:被finally控制的语句体一定会执行
    * 注意:如果在执行到finally之前jvm退出了,就不能执行了。
    *
    * A:格式
    * try...catch...finally...
    * B:用于释放资源,在IO流操作和数据库操作中会见到

    * 面试题:
    * 1:final,finally和finalize的区别
    * final:最终的意思,可以修饰类,成员变量,成员方法
    * 修饰类,类不能被继承
    * 修饰变量,变量是常量
    * 修饰方法,方法不能被重写
    * finally:是异常处理的一部分,用于释放资源。
    * 一般来说,代码肯定会执行,特殊情况:在执行到finally之前jvm退出了
    * finalize:是Object类的一个方法,用于垃圾回收
    *
    * 2:如果catch里面有return语句,请问finally里面的代码还会执行吗?
    * 如果会,请问是在return前,还是return后。
    * 会。前。
    *
    * 准确的说,应该是在中间。
    *
    * 3:try...catch...finally的格式变形
    * A:try...catch...finally
    * B:try...catch
    * C:try...catch...catch...
    * D:try...catch...catch...finally
    * E:try...finally
    * 这种做法的目前是为了释放资源。

    * java不可能对所有的情况都考虑到,所以,在实际的开发中,我们可能需要自己定义异常。
    * 而我们自己随意的写一个类,是不能作为异常类来看的,要想你的类是一个异常类,就必须继承自Exception或者RuntimeException
    *
    * 两种方式:
    * A:继承Exception
    * B:继承RuntimeException

    1 public class MyException extends Exception {
    2     public MyException() {
    3     }
    4 
    5     public MyException(String message) {
    6         super(message);
    7     }
    8 }
    1 public class Teacher {
    2     public void check(int score) throws MyException {
    3         if (score > 100 || score < 0) {
    4             throw new MyException("分数必须在0-100之间");
    5         } else {
    6             System.out.println("分数没有问题");
    7         }
    8     }
    9 }
     1 import java.util.Scanner;
     2 
     3 /*
     4  * 自定义异常测试类
     5  */
     6 public class StudentDemo {
     7     public static void main(String[] args) {
     8         Scanner sc = new Scanner(System.in);
     9         System.out.println("请输入学生成绩:");
    10         int score = sc.nextInt();
    11 
    12         Teacher t = new Teacher();
    13         try {
    14             t.check(score);
    15         } catch (MyException e) {
    16             e.printStackTrace();
    17         }
    18     }
    19 }

    * 异常注意事项:
    * A:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
    * B:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
    * C:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws

     1 public class ExceptionDemo {
     2 
     3 }
     4 
     5 class Fu {
     6     public void show() throws Exception {
     7     }
     8 
     9     public void method() {
    10     }
    11 }
    12 
    13 class Zi extends Fu {
    14     @Override
    15     public void show() throws ArithmeticException {
    16 
    17     }
    18 
    19     @Override
    20     public void method() {
    21         // String s = "2014-11-20";
    22         // SimpleDateFormat sdf = new SimpleDateFormat();
    23         // Date d = sdf.parse(s);
    24         // System.out.println(d);
    25     }
    26 }


    * File:文件和目录(文件夹)路径名的抽象表示形式
    * 构造方法:
    * File(String pathname):根据一个路径得到File对象
    * File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
    * File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象

    *创建功能:
    *public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了
    *public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
    *public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来

     *注意:你到底要创建文件还是文件夹,你最清楚,方法不要调错了。

     1         // 需求:我要在e盘目录下创建一个文件夹demo
     2         File file = new File("e:\demo");
     3         System.out.println("mkdir:" + file.mkdir());
     4 
     5         // 需求:我要在e盘目录demo下创建一个文件a.txt
     6         File file2 = new File("e:\demo\a.txt");
     7         System.out.println("createNewFile:" + file2.createNewFile());
     8 
     9         // 需求:我要在e盘目录test下创建一个文件b.txt
    10         // Exception in thread "main" java.io.IOException: 系统找不到指定的路径。
    11         // 注意:要想在某个目录下创建内容,该目录首先必须存在。
    12         // File file3 = new File("e:\test\b.txt");
    13         // System.out.println("createNewFile:" + file3.createNewFile());
    14 
    15         // 其实我们有更简单的方法
    16         File file7 = new File("e:\aaa\bbb\ccc\ddd");
    17         System.out.println("mkdirs:" + file7.mkdirs());
    18 
    19         // 看下面的这个东西:
    20         File file8 = new File("e:\liuyi\a.txt");
    21         System.out.println("mkdirs:" + file8.mkdirs());

    * 删除功能:public boolean delete()
    *
    * 注意:
    * A:如果你创建文件或者文件夹忘了写盘符路径,那么,默认在项目路径下。
    * B:Java中的删除不走回收站。
    * C:要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹

    * 重命名功能:public boolean renameTo(File dest)
    * 如果路径名相同,就是改名。
    * 如果路径名不同,就是改名并剪切。
    *
    * 路径以盘符开始:绝对路径 c:\a.txt
    * 路径不以盘符开始:相对路径 a.txt

    1         File file2 = new File("东方不败.jpg");
    2         File newFile2 = new File("e:\林青霞.jpg");
    3         System.out.println("renameTo:" + file2.renameTo(newFile2));

    * 判断功能:
    * public boolean isDirectory():判断是否是目录
    * public boolean isFile():判断是否是文件
    * public boolean exists():判断是否存在
    * public boolean canRead():判断是否可读
    * public boolean canWrite():判断是否可写
    * public boolean isHidden():判断是否隐藏

    1         // 创建文件对象
    2         File file = new File("a.txt");
    3 
    4         System.out.println("isDirectory:" + file.isDirectory());// false
    5         System.out.println("isFile:" + file.isFile());// true
    6         System.out.println("exists:" + file.exists());// true
    7         System.out.println("canRead:" + file.canRead());// true
    8         System.out.println("canWrite:" + file.canWrite());// true
    9         System.out.println("isHidden:" + file.isHidden());// false

    * 获取功能:
    * public String getAbsolutePath():获取绝对路径
    * public String getPath():获取相对路径
    * public String getName():获取名称
    * public long length():获取长度。字节数
    * public long lastModified():获取最后一次的修改时间,毫秒值

    * 获取功能:
    * public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
    * public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组

     1         // 指定一个目录
     2         File file = new File("e:\");
     3 
     4         // public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
     5         String[] strArray = file.list();
     6         for (String s : strArray) {
     7             System.out.println(s);
     8         }
     9         System.out.println("------------");
    10 
    11         // public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组
    12         File[] fileArray = file.listFiles();
    13         for (File f : fileArray) {
    14             System.out.println(f.getName());
    15         }

     * 判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称

    方法一:

     1         // 封装e判断目录
     2         File file = new File("e:\");
     3 
     4         // 获取该目录下所有文件或者文件夹的File数组
     5         File[] fileArray = file.listFiles();
     6 
     7         // 遍历该File数组,得到每一个File对象,然后判断
     8         for (File f : fileArray) {
     9             // 是否是文件
    10             if (f.isFile()) {
    11                 // 继续判断是否以.jpg结尾
    12                 if (f.getName().endsWith(".jpg")) {
    13                     // 就输出该文件名称
    14                     System.out.println(f.getName());
    15                 }
    16             }
    17         }

    方法二:

    * 要想实现这个效果,就必须学习一个接口:文件名称过滤器
    * public String[] list(FilenameFilter filter)
    * public File[] listFiles(FilenameFilter filter)

     1         // 封装e判断目录
     2         File file = new File("e:\");
     3 
     4         // 获取该目录下所有文件或者文件夹的String数组
     5         // public String[] list(FilenameFilter filter)
     6         String[] strArray = file.list(new FilenameFilter() {
     7             @Override
     8             public boolean accept(File dir, String name) {
     9                 // return false;
    10                 // return true;
    11                 // 通过这个测试,我们就知道了,到底把这个文件或者文件夹的名称加不加到数组中,取决于这里的返回值是true还是false
    12                 // 所以,这个的true或者false应该是我们通过某种判断得到的
    13                 // System.out.println(dir + "---" + name);
    14                 // File file = new File(dir, name);
    15                 // // System.out.println(file);
    16                 // boolean flag = file.isFile();
    17                 // boolean flag2 = name.endsWith(".jpg");
    18                 // return flag && flag2;
    19                 return new File(dir, name).isFile() && name.endsWith(".jpg");
    20             }
    21         });
    22 
    23         // 遍历
    24         for (String s : strArray) {
    25             System.out.println(s);
    26         }
  • 相关阅读:
    SCAU 9504 面试
    SCAU 9503 懒人选座位
    SCAU 8628 相亲
    SCAU 10691 ACM 光环
    SCAU 8626 原子量计数
    SCAU 10674 等差对
    HDU ACM 1048 The Hardest Problem Ever (水题)
    SCAU 9502 ARDF
    SCAU 10686 DeathGod不知道的事情
    SCAU 8629 热身游戏(高精度)
  • 原文地址:https://www.cnblogs.com/samuraihuang/p/9889418.html
Copyright © 2011-2022 走看看