• 涨姿势:Java 异常?尝试自定义异常


    1.异常

    在Java中,每个异常都是一个名叫Throwable的类的一个实例

    我们常用的try-catch-finally语句

    • try

    尝试去执行try语句块里的内容,如果有异常,将其捕获,并执行catch语句块中的代码

    • catch

    在catch语句的参数中我们定义了具体的异常类型,但是这些具体的异常都是Exception的子类,所以我们可以通过将参数改为Exception e 来捕获所有异常(但是不建议这么做,或者把捕获异常基类放到最后,因为有的时候你需要针对不同的异常做出一些不同的动作)

    • finally

    finally "最后",语句块中的内容最后都会被执行

    • 处理异常

    在捕获了异常之后,我们还需要处理这些异常,我们可以将这些异常的消息输出,或者在捕获之后再抛出另外的异常: 常用的消息输出方式就是getMessage()以及printStackTrace()

    2. 自定义异常

    官方给出的异常类型(JDK 8)大部分都是没见过的,(羞羞

    不要紧,我们可以自己来定义属于自己的异常。

    具体的异常都是继承自Exception类,所以我们要自定义的异常也需要继承这个基类。

    我们自定义异常命名MyException,需要继承基类Exception,然后我们调用基类的构造方法,带一个参数:

    public class MyException extends Exception {
       public MyException(String message){
           super(message);
       }
    }

    然后我们测试这个异常,因为是测试,所以直接抛出定义的异常:

    public class Test {
        public static void main(String[] args)throws MyException{
            try{
                throw new MyException("自定义异常");
            }catch (MyException e){
                System.out.println(e.getMessage());
            }
        }
    }

    打印异常结果

    3. 查看异常信息

    有时候我们会需要查看异常信息来进行调试,JDK中给出了3种继承自Throwable基类的方法

    toString()方法

    在讲方法前我们先看看 Throwable类中覆盖了的toString()方法:

    image

    这里面的意思是: toString()方法返回一个字符串,代表了Throwable实例(异常)的信息,具体格式为:对象名字: 本地化的信息

    示例:

    image

    运行出来的结果第二行:

    java.io.FileNotFoundException: test.txt(系统找不到指定的文件。)
    at ...

    java.io.FileNotFoundException就是Throwable的实例,text.txt...后面的信息就是本地化的信息了,针对不同的位置给出具体的信息,用来调试就能很快进行定位

     

    getMessage() :

    the detail message string of this Throwable instance (which may be null)
    将Throwable实例(通常所说的异常)的具体信息以String类型给出(可能不存在)
    

    printStackTrace()

    这个方法有三种类型:无参,带参数PrintStream和带参数PrintWriter

    无参的printStackTrace()方法也就是我们平常使用的查看异常信息的方式,直接在控制台打印
    带参数PrintStream(打印输出流):能够将信息通过流输出至其他地方,

    做个测试:

    import java.io.*;
    
    public class Test {
        public static void main(String[] args) throws IOException{
            OutputStream out;
            try{
                throw new RuntimeException();
            }catch (RuntimeException e){
                out = new FileOutputStream("C:\Users\94545\Desktop\test.txt");
                //将FileOutputStream作为PrintStream的输出流
                PrintStream printStream = new PrintStream(out);
                e.printStackTrace(printStream);
                out.close();
                printStream.close();
            }
        }
    }

    成功打印

     
    带参数PrintWriter(字符打印输出流):将信息输出至其他地方
    import java.io.*;
    
    public class Test {
        public static void main(String[] args) throws Exception{
            OutputStream out;
            try{
                throw new RuntimeException();
            }catch (RuntimeException e){
                out = new FileOutputStream("C:\Users\94545\Desktop\test.txt");
                PrintWriter printWriter = new PrintWriter(out,true);
                e.printStackTrace(printWriter);
                out.close();
                printWriter.close();
            }
        }
    }

    打印成功!

    扩展

    你知道 throw和throws有什么区别?

    举个例子来说: 在方法A中,如果在产生异常的时候,不需要马上捕获,在方法B调用方法A的时候再进行捕获,那么就在A的方法名后添加throws,如果需要在方法A中进行捕获,则直接使用throw

    所以两者区别,其实在于究竟在哪个地方处理异常

    小结

    看捕获异常的对象是谁,再决定应该如何来使用

    用户输入数据的格式永远都是正确的,选择打开的文件也一定存在,并且永远不会出现bug ——《Java核心技术 卷一》

  • 相关阅读:
    merge into update
    buffer overflow
    在表中循环插入日期
    判断表是否存在 存储
    listagg( ) within group ( order by ) 与 wm_concat
    Oracle导入SQL脚本执行 scott 用户下的表删除了
    数据导入时注意点,修改登录密码不区分大小写
    分页
    创建触发器在表中播入数据时ID自动增长
    insert 另外一种用法
  • 原文地址:https://www.cnblogs.com/yizhiamumu/p/9118579.html
Copyright © 2020-2023  润新知