• Java进阶API第四章


    Java进阶API第四章

    一.异常的介绍 

     

    1.错误 Error

     特点:

    1. 不常见
    2. 基本上不能解决
    3. 尽量避免

    2.异常 Exception

    特点: 

    1. 常见
    2. 可以定位,通过修改代码解决
    3. 不是编译失败问题,代码语法没有问题

     二. 异常举例以及解决常见错误bug方案

    • 定位错误:编写好程序后,运行程序,在输入运行结果栏中会存在异常提示,红色中蓝色链接,就能找到自己的代码错误
    • 解决错误:先阅读异常提示,如果了解就直接修改,如果不了解那就搜索异常提示,了解问题所在,解决问题

    三.RuntimeException 

    这样刚才那个异常生成的可执行文件(Class),说明此异常为执行时异常的子类(RuntimeException)。

     异常类有两个主要的子类:IOException 类和 RuntimeException 类。

    1.运行时异常

    • 运行时异常可修改也可不修改,不会对项目运行产生影响
    • 运行时异常像游戏漏洞,它不影响我们玩游戏,但是我们有一些漏洞可以捡,比如更新以后某个英雄的技能,在某个时间可以无限的放或者平A就能秒死人

    2.非运行时异常

    • 非运行时异常必须修改,因为这样会使得项目直接无法运行(现在的编译器比较智能,一定会让你try catch)但是非运行时异常导致你进不去游戏
    • 编译器中,运行时异常不会要求你捕获,但是非运行时异常会强制要求你捕获,所以我们在编写自定义异常的时候不会定成运行时异常

    四. 捕获异常 try catch

    1.定位一个代码块的异常,运行完成这个代码块后,抛出这个代码块的异常

    快捷键: 选中对象使用Ctrl+Alt+t 

    1. // try表示监控区域
    2. try {
    3. // 监控对象
    4. System.out.println(1 / 0);
    5. // catch表示捕获异常,()Exception内表示异常类型,e表示异常对象
    6. } catch (Exception e) {
    7. // 捕获成功后,输出语句
    8. throw new RuntimeException(e);
    9. }

    如果没有throw new RuntimeException(e);或e.printStackTrace();语句,就不抛出与输出异常语句。

    2.try catch可以搭配finally使用

    1. // try表示监控区域
    2. try {
    3. // 监控对象
    4. System.out.println(1 / 0);
    5. // catch表示捕获异常,()Exception内表示异常类型,e表示异常对象
    6. } catch (Exception e) {
    7. // 捕获成功后,输出语句
    8. e.printStackTrace();
    9. // finally表示善后工作,可以不写,因为默认存在。
    10. // 但在一些情况中,必须写,如io流,资源,等等
    11. } finally {
    12. System.out.println("善后工作");
    13. }

    3.捕获错误 

    1. public class TestOne {
    2. @Test
    3. public void testOne() {
    4. // 这段代码可以理解为创建了一个 TestOne 类的对象,并调用了该对象的 one() 方法。
    5. // 具体来说,new Test() 创建了一个 Test 类的匿名对象,并通过该对象调用了 one() 方法。
    6. // 这种方式常用于一次性调用某个类的方法而不需要保留对象的引用。
    7. new TestOne().one();
    8. }
    9. public void one() {
    10. two();
    11. }
    12. public void two() {
    13. one();
    14. }
    15. }

    1. public void testOne() {
    2. try {
    3. new TestOne().one();
    4. } catch (Error e) {
    5. System.out.println("虚拟机出现错误");
    6. } finally {
    7. System.out.println("善后工作");
    8. }
    9. }
    10. public void one() {
    11. two();
    12. }
    13. public void two() {
    14. one();
    15. }

    四.多层捕获

    如果不知道异常类型可以使用多层捕获,但括号中的捕获类型必须从小到大。

    1. public void testOne() {
    2. try {
    3. System.out.println(1/0);
    4. } catch (Exception e) {
    5. System.out.println("Exception");
    6. } catch (Error e) {
    7. System.out.println("Error");
    8. } catch (Throwable e) {
    9. System.out.println("Throwable");
    10. } finally {
    11. System.out.println("善后工作");
    12. }
    13. }

    五.NullPointerException空指针异常 

     空指针异常的情况:

    • Calling the instance method of a null object. 调用空对象的实例方法
    • Accessing or modifying the field of a null object.访问或修改空对象的字段
    • Taking the length of null as if it were an array.将null的长度当作一个数组
    • Accessing or modifying the slots of null as if it were an array.访问或修改null的插槽,就好像它是一个数组一样
    • Throwing null as if it were a Throwable value.将null视为Throwable值

     

    六.抛出异常 throws 

    • 通过捕获异常的功能,我们可以写判断或抛出异常的方法
    • 在不通过的情况下提醒程序员,这样程序员可以快速的更改代码,以防止程序在后面出现更严重的问题

    抛出异常: throw,throws,一般在方法中使用 

    1. public class TestOne {
    2. @Test
    3. public void testOne() {
    4. new TestOne().test(1,0);
    5. }
    6. public void test(int one,int two) {
    7. if(two == 0) {
    8. // two等于0,就抛出异常
    9. throw new ArithmeticException();
    10. }
    11. }
    12. }

    throws 

    1. public class TestOne {
    2. @Test
    3. public void testOne() {
    4. new TestOne().test(1,0);
    5. }
    6. // 如果方法中,处理不了这个异常,那就方法上抛出异常
    7. public void test(int one,int two) throws ArithmeticException {
    8. if(two == 0) {
    9. // two等于0,就抛出异常
    10. throw new ArithmeticException();
    11. }
    12. }
    13. }

    七.自定义异常

    自定义异常一般由企业里的架构师负责。

    1.第一步:创建ErrorCode接口。

    1. public interface ErrorCode {
    2. /**
    3. * 获取错误码
    4. * @return
    5. */
    6. String getcode();
    7. /**
    8. * 获取错误信息
    9. * @return
    10. */
    11. String getMsg();
    12. }

    2.创建MyCodeEnum枚举类,编写代码实现接口中的所有方法。 

    1. public enum MyCodeEnum implements ErrorCode{
    2. // 错误端口与信息
    3. NOT_FOUND_PAGE("404","找不到网站资源"),
    4. NOT_FOUND_FILE("888","找不到文件"),
    5. NOT_O_TEN("bad", "只能求10以内的加法")
    6. ;
    7. // 此处必须有一个code,Msg
    8. private final String code;
    9. private final String Msg;
    10. // 有参构造
    11. MyCodeEnum(String code, String msg) {
    12. this.code = code;
    13. Msg = msg;
    14. }
    15. // 实现接口中的所有方法
    16. @Override
    17. public String getcode() {
    18. return code;
    19. }
    20. @Override
    21. public String getMsg() {
    22. return Msg;
    23. }
    24. }

    3.创建MyException类继承Exception

    1. public class MyException extends Exception{
    2. // 有参构造,参数为自己写的异常接口与调用接口的getMsg方法(获取错误信息)
    3. public MyException(ErrorCode errorCode) {
    4. super(errorCode.getMsg());
    5. }
    6. }

    4.使用异常

    1. public class TestOne {
    2. public int sum(int a,int b) throws MyException {
    3. if(a > 10 || b > 10 || a < 0 || b < 0) {
    4. // 抛出自己写的异常MyException,参数为错误信息为自己写的MyCodeEnum
    5. throw new MyException(MyCodeEnum.NOT_O_TEN);
    6. }
    7. return a+b;
    8. }
    9. @Test
    10. public void testOne() {
    11. // 自己写的异常,继承Exception,就必须使用try catch捕获
    12. try {
    13. sum(10,33);
    14. } catch (MyException e) {
    15. throw new RuntimeException(e);
    16. }
    17. }
    18. }

  • 相关阅读:
    Golang基础之关键字
    9 JDBC
    地理知识:墨卡托坐标系
    【自用总结】正项级数审敛法的总结
    【Vue3+Ts】—— webpack打包其他资源学习笔记(二)
    ArcgisForJS如何使用ArcGIS Server的缓冲区几何服务?
    SSM公司企业绩效考核管理系统
    uniapp进行表单效验
    我在玛莎拉蒂的广告上,加了9个特效后,科技感拉满!
    汉明码原理
  • 原文地址:https://blog.csdn.net/2301_76556912/article/details/134491430