java基础 注解、异常(编译时异常、运行时异常)

目录

16、注解

1、注解

2、注解的声明

3、细节

@Override的使用说明

@Deprecated的使用说明

@SuppressWarnings:抑制编译器警告

4、元注解

1.种类

17、异常

1、概念

2、异常图

3、常见运行时异常

4、编译异常

5、异常处理的方式

1、方式

2、细节

6、自定义异常

7、throw和throws的区别


16、注解

  1. 注解(Annotation)也被称为源数据(Metadata),用于修饰解释(包、类、方法、属性、构造器、局部变量等数据信息)

  2. 和注释一样,注解不影响程序的逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息

  3. 在javaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在javaEE中,注解占据了更重要的角色,例如配置应用程序的任何切面,代码javaEE旧版中所遗留的代码和XML配置

1、注解

1、@Override :限定某个方法,是重写父类方法,该注解只能用于方法

2、@Derpecated:用于表示某个程序元素(类、方法等)过时

3、@SuppressWarnings:抑制编译器警告

2、注解的声明

注解的声明 @interface 代表是一个注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

3、细节

  • @Override的使用说明

@Override 表示指定重写父类的方法 (从编译层面验证)如果父类没有定义该方法,则编译期间就会报错
如果不写@Override注解,而父类中仍然有这个方法,仍然构成重写
@Override只能修饰方法,不能修饰其他类,包,属性等等
@Target 是修饰注解的注解,称为元注解
  • @Deprecated的使用说明

用于表示某个成员元素 (类,方法 属性等)已经过时
可以修饰方法 类 字段 包 参数等等
即使修饰了,只是代表已经过时,不建议使用,但是还是可以使用  (修饰后的方法 类 等会出现 中划线)
@Deprecated 这是旧版本到新版本过渡的使用
  • @SuppressWarnings:抑制编译器警告

有警告也不会出错
这个注解有很多值,不用记录,直接点击左侧的黄色提示,就可以选择(注意生产的位置)

4、元注解

1.种类

  1. Retention 指定注解的作用范围 SOURCE CLASS RUNTIME

    • RetentionPolicy.SOURCE :编译器使用后,直接丢弃之恩重策略的注解

    • RetentionPolicy.CLASS:编译器将注解记录在class文件中,当运行java程序的时候,jvm不会保留注解。这是默认值

    • RetentionPolicy.RUNTIME:编译器会将注解记录在class文件中,当运行java程序的时候,jvm会保留这个注解,程序可以通过反射获取该注解

  2. Target 指定注解可以在哪些地方使用

    ElementType类中的枚举  可以写多个
    ​
    public enum ElementType {
        /** 类、接口(包括注释类型)或枚举声明*/
        TYPE,
    ​
        /** 字段声明(包括枚举常量) */
        FIELD,
    ​
        /** 方法声明*/
        METHOD,
    ​
        /** 方法参数声明*/
        PARAMETER,
    ​
        /** 构造器声明*/
        CONSTRUCTOR,
    ​
        /**局部变量声明 */
        LOCAL_VARIABLE,
    ​
        /**注解类型声明*/
        ANNOTATION_TYPE,
    ​
        /** 包声明 */
        PACKAGE,
    ​
        /**
         * 用来标注类型参数    即能标注在泛型中
         *
         * @since 1.8
         */
        TYPE_PARAMETER,
    ​
        /**
         * 能标注任何类型名称  即哪里有可以
         *
         * @since 1.8
         */
        TYPE_USE
    }
    ​

  3. Documented 指定该注解是否在javadoc中显示

  4. Inherited 子类会继承父类注解

    被@Inherited修饰的注解将具有继承性,如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解

17、异常

当出现异常,没有捕获的时候,到达出现异常的地方就停止了,这样对于整个程序的健壮性是非常不好的

因此 java设计者,认为一段代码可能出现异常/问题,可以使用try-catch异常处理机制来解决 ,从而保证程序的健壮性

IDEA的快捷方式 ctrl + alt + t 进行try catch捕获

重点: 如果使用了异常处理,那么即使出现异常,程序也可以继续执行,而不是直接崩溃

1、概念

java语言中,将程序执行中发生的不正常请称为“异常” (开发过程中语法错误和逻辑错误不是异常)

执行过程中所发生的异常可以分为两类

  • Error(错误) Java虚拟机无法解决的严重问题。如 JVM系统内部错误、资源耗尽等严重情况,Error是严重错误,程序会崩溃

  • Exception 异常:因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针异常,读取不存在的文件等等

    Exception分为两类 运行时异常 【程序运行时发生的异常】和 编译时异常【编程时,由编译器检查出的异常】

2、异常图

 

异常分为两大类,运行时异常 和 编译时异常

  1. 运行时异常,编译器不强制要求处理的异常。一般是指编程时的逻辑错误,是程序员应该避免其出现的异常 java.lang.RuntimeException类及它的子类都是运行时异常

  2. 对应运行时异常,可以不全部做处理,因为这类异常很普遍,如果全部处理可能会对程序的可读性和效率有影响

  3. 编译时异常,是编译器要求必须处置的异常

3、常见运行时异常

  • NullPointerException 空指针异常

    当应用程序试图在需对象调用方法的时候,但是该对象为null ,抛出该异常

    public class NullPointerException$ {
        public static void main(String[]args){
            String str = null;
            str.length();
        }
    }
  • ArithmeticException 数学运算异常

    当出现异常额运算条件时,抛出异常 例如 一个整数除以零 抛出异常

    public class ArithmeticException$ {
        public static void main(String[]args){
             int i = 10 / 0;
        }
    }
  • ArrayIndexOutOfBoundsException 数组下标越界异常

    用非法的索引访问数组时抛出的异常。如果索引为负数或者大于数组的大小,则该所索引为非法异常

    public class ArrayIndexOutOfBoundsEXception$ {
        public static void main(String[]args){
           int[] array = {1,2,3};
           System.out.println(array[3]);
        }
    }
  • ClassCastException 类型转换异常

    当试图将对象强转为不是该实例的子类时,抛出该异常

    public class ClassCastException$ {
        public static void main(String[]args){
          A b = new B(); //向上转型  
          B b2 = (B)b; //向下转型  ok
          C c = (C)b; //这里会抛出ClassCastException异常
        }
    }
    class A {
    ​
    }
    class B extends A {
    ​
    }
    class c extends A {
    ​
    }
  • NumberFormatException 数字格式不正确异常

当应用程序试图将字符串准换成一种数值类型,但是该字符串不能转换为适当格式时,抛出异常 ==》使用异常我们可以确保输入的数据 是满足条件的数字

public class NumberFormatException$ {
    public static void main(String[]args){
       String str = "w13";
       int num = Integer.parseInt(str); //就会抛出异常
    }
}

4、编译异常

编译异常就是在编译期间,就必须处理的异常,否则代码不能通过编译

常见的编译异常

  • SQLException 操作数据库的时候,查询表可能发生异常

  • IOException 操作文件是,发生的异常

  • FileNotFoundException(父类是IOException) 当操作一个不存在的文件时,发生的异常

  • ClassNotFoundException 加载类,而该类不存在时,异常

  • EOFException 操作文件,到文件末尾发生异常

  • IllegalArgumentException 参数异常

5、异常处理的方式

1、方式

  1. try-catch-finally

    程序员在代码中捕获发生的异常,自行处理

  2. throws

    将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM

总结

  1. try-catch-finally 和 throws 二选一

  2. 如果程序员,没有显示的处理异常,默认是throws Exception 最终交给jvm处理

  3. jvm处理异常的方法是 ①输出异常信息 ②中断程序

2、细节

  1. 如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块

  2. 如果异常没有发生,则顺序执行try中代码,不会进入到catch中,如果有finally,最后还需要执行finally里面的语句

  3. 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用finally

  4. 可以捕获多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前(范围小的在前,范围大的在后) 如果发生异常,只会匹配一个catch

  5. 可以进行try-finally 配合使用,这种用法没有捕获异常,一旦发生异常程序会崩掉(应用场景:执行一段代码,不管是否发生异常,都必须执行某个业务逻辑)

  6. 如果出现异常,则try块中异常发生后,try块中剩下的语句不在执行。将执行catch中的语句,如果有finally,最后还需要执行finally里面的语句!

6、自定义异常

定义类:自定义异常类名(程序员自己写)继承Exception或者RuntimeException

如果继承Exception属于编译异常

如果继承RuntimeException 属于运行异常(一般来说我们继承RuntimeException)

一般与throw new 自定义异常 进行配合使用,当符合条件后主动抛出异常

7、throw和throws的区别

关键字意义位置后面跟的东西
throws异常处理的一种方式方法声明处异常类型
throw手动生成异常对象的关键字方法体中异常对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值