八、可变参数、stream流、异常

news2024/12/23 12:31:23

可变参数

介绍

  • 定义方法参数的一种方式,方法的参数类型已经确定,个数不确定,我们可以使用可变参数

格式

修饰符 返回值类型 方法名(数据类型… 变量名) {  }

注意事项

  • 可变参数的变量其实是一个数组
  • 如果一个方法有多个参数,包含可变参数,可变参数要放在最后

基本使用

    public static void main(String[] args) {
        //int[] arr = new int[]{4, 56, 6, 2, 2, 4, 5, 6, 7, 3};
        //sum(arr);

        sum(4, 56, 6, 2, 2, 4, 5, 6, 7, 3);
        sum();
        sum(10, 20);
        sum(10, 20, 30);

    }

    //计算数组中所有的数据的和 打印
    //int...是可变参数  表示可以接受任意数量的int类型数据 ,可变参数的本质是一个数组
    public static void sum(int... arr) {
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        System.out.println(sum);
    }

    //public static void sum(int[] arr) {
    //    int sum = 0;
    //    for (int i = 0; i < arr.length; i++) {
    //        sum += arr[i];
    //    }
    //    System.out.println(sum);
    //}

可变参数放到参数的最后面

在这里插入图片描述

创建不可变集合(理解)

  • static <E> List<E> of(E…elements) 创建一个具有指定元素的List集合对象
  • static <E> Set<E> of(E…elements) 创建一个具有指定元素的Set集合对象
  • static <K , V> Map<K,V> of(E…elements) 创建一个具有指定元素的Map集合对象
  • 常用来作为创建集合的构造参数

代码

  • method1是List.of练习
  • method2是 Set.of练习 ,注意不要传入重复数据 ,会报错
  • method3是 Map.of练习 ,传入多个键和值
  • method4是 Map.ofEntries练习 ,传入多个Entry对象
    private static void method1() {
        List<String> list = List.of("a", "b", "c", "d");
        System.out.println(list);
        //list.add("Q");报错
        //list.remove("a");报错
        //list.set(0,"A");报错

        //集合的批量添加。
        //首先是通过调用List.of方法来创建一个不可变的集合,of方法的形参就是一个可变参数。
        //再创建一个ArrayList集合,并把这个不可变的集合中所有的数据,都添加到ArrayList中。
        ArrayList<String> list3 = new ArrayList<>(List.of("a", "b", "c", "d"));
        System.out.println(list3);
    }

    private static void method2() {
        //传递的参数当中,不能存在重复的元素。下面的a重复 会报异常 IllegalArgumentException: duplicate element: a
        Set<String> set = Set.of("a", "b", "c", "d", "a");
        System.out.println(set);
    }

    private static void method3() {
        //传入多个键值
        Map<String, String> map = Map.of("zhangsan", "江苏", "lisi", "北京", "wangwu", "天津");
        System.out.println(map);
    }

    private static void method4() {
        //传入一个个Entry对象
        Map<String, String> map = Map.ofEntries(
                Map.entry("zhangsan", "江苏"),
                Map.entry("lisi", "北京")
        );
        System.out.println(map);
    }

Collections.addAll 添加数据

ArrayList<String> list = new ArrayList<>();

//利用Collections的addAll方法添加数据
Collections.addAll(list, "aaa", "bbb", "ccc", "ddd");

System.out.println(list);

Stream流(理解,掌握常用的中间操作)

案例需求

按照下面的要求完成集合的创建和遍历

  • 创建一个集合,存储多个字符串元素
  • 把集合中所有以"张"开头的元素存储到一个新的集合
  • 把"张"开头的集合中的长度为3的元素存储到一个新的集合
  • 遍历上一步得到的集合

原始方式示例代码

ArrayList<String> list1 = new ArrayList<>(List.of("张三丰","张无忌","张翠山","王二麻子","张良","谢广坤"));

//遍历list1把以张开头的元素添加到list2中。
ArrayList<String> list2 = new ArrayList<>();
for (String s : list1) {
    if(s.startsWith("张")){
        list2.add(s);
    }
}
//遍历list2集合,把其中长度为3的元素,再添加到list3中。
ArrayList<String> list3 = new ArrayList<>();
for (String s : list2) {
    if(s.length() == 3){
        list3.add(s);
    }
}
for (String s : list3) {
    System.out.println(s);
}     

流的实现方式

        ArrayList<String> list1 = new ArrayList<>(List.of("张三丰", "张无忌", "张翠山", "王二麻子", "张良", "谢广坤"));

        //1 获取流  list1.stream()

        //2 过滤 姓张的数据   filter(s -> s.startsWith("张"))
        //3 过滤 长度为3的数据  filter(s -> s.length() == 3)

        //4 打印  终结操作   forEach(s -> System.out.println(s))

        list1.stream().filter(s -> s.startsWith("张")).
                filter(s -> s.length() == 3).
                forEach(s -> System.out.println(s));

Stream流的思想

  • 类似流水线,在过程中可以多次处理流数据

Stream流的三类方法

  • 获取Stream流
    • 创建一条流水线,并把数据放到流水线上准备进行操作
  • 中间方法
    • 流水线上的操作
    • 一次操作完毕之后,还可以继续进行其他操作
  • 终结方法
    • 一个Stream流只能有一个终结方法
    • 是流水线上的最后一个操作

生成Stream流的方式

  • 1 Collection体系集合
    • 使用默认方法stream()生成流
  • 2 Map体系集合
    • 把Map转成Set集合(keySet,entrySet),间接的生成流
    • keySet().stream() 或者 entrySet().stream()
  • 3 数组
    • 通过Arrays中的静态方法stream生成流 Arrays.stream(arr)
  • 4 同种数据类型的多个数据
    • 通过Stream接口的静态方法of(T… values)生成流 , 原理还是数组变流

代码演示

// - 1  Collection体系集合
//  - 使用默认方法stream()生成流
List<String> list = new ArrayList<>();
Stream<String> listStream = list.stream();

Set<String> set = new HashSet<>();
Stream<String> setStream = set.stream();


//- 2  Map体系集合
//  - 把Map转成Set集合(keySet,entrySet),间接的生成流
Map<String, String> map = new HashMap<>();
//先获取key的集合 再获取流
Stream<String> mapKeyStream = map.keySet().stream();
//先获取Entry对象的集合 再获取流
Stream<Map.Entry<String, String>> entryStream = map.entrySet().stream();


//- 3  数组
//  - 通过Arrays中的静态方法stream生成流
int[] arr = new int[]{4,56,7,8,4,3};
IntStream intStream = Arrays.stream(arr);

//4 通过of方法 把同一类型的多个数据 转为流对象
Stream<Integer> is = Stream.of(3, 4, 6, 7, 8);
Stream<String> ss = Stream.of("z", "l", "x");

Stream流中间操作方法【熟练应用】

概念

  • 中间操作的意思是,执行完此方法之后,Stream流依然可以继续执行其他操作

常见方法

方法名说明
Stream filter(Predicate predicate)用于对流中的数据进行过滤
Stream limit(long maxSize)返回流中最前面 指定参数个数的数据组成的流
Stream skip(long n)跳过指定参数个数的数据,返回由该流的剩余元素组成的流
static Stream concat(Stream a, Stream b)合并a和b两个流为一个流
Stream distinct()返回 去掉流数据中 重复的元素后剩余数据组成的流

filter代码

  • 流的操作不影响原集合的数据
        ArrayList<String> al = new ArrayList<String>(List.of("周润发", "成龙", "小明", "刘德华", "吴京", "周星驰", "李连杰"));

         //流的操作不影响原集合的数据
        al.stream().filter(s -> s.length() >= 3).forEach(s -> System.out.println(s));

        //会把流数据里的每一条数据 传到test方法中 获取返回值,返回为true的数据留下,为false的删除
        al.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.length() == 3;
            }
        });

limit skip代码

 ArrayList<String> al = new ArrayList<String>(List.of("周润发", "成龙", "小明", "刘德华", "吴京", "周星驰", "李连杰"));
 
System.out.println("--------------------------------------------------------------");
//  Stream<T> limit(long maxSize)           	返回流中最前面指定参数个数的数据组成的流
al.stream().limit(4).forEach(s -> System.out.println(s));

System.out.println("--------------------------------------------------------------");

//  Stream<T> skip(long n)                  	跳过指定参数个数的数据,返回由该流的剩余元素组成的流
al.stream().skip(2).forEach(s -> System.out.println(s));

concat 和distinct

//  static <T> Stream<T> concat(Stream a, Stream b)	合并a和b两个流为一个流
ArrayList<String> al1 = new ArrayList<String>(List.of("林心如", "张曼玉", "林青霞", "柳岩", "林志玲", "小明", "王祖贤"));
Stream.concat(al.stream(), al1.stream()).forEach(s -> System.out.println(s));

System.out.println("--------------------------------------------------------------");
//  Stream<T> distinct()         返回 去掉流数据中 重复的元素后剩余数据组成的流
Stream.concat(al.stream(), al1.stream()).distinct().forEach(s -> System.out.println(s));

skip和limit一起操作

ArrayList<String> al = new ArrayList<String>(List.of("周润发", "成龙", "小明", "刘德华", "吴京", "周星驰", "李连杰"));
//跳过前2个数据 剩余的数据再获取前面2个
al.stream().skip(2).limit(2).forEach(s -> System.out.println(s));

Stream流终结操作方法

概念

  • 终结操作的意思是,执行完此方法之后,Stream流将不能再执行其他操作

常见方法

方法名说明
void forEach(Consumer action)对此流的每个元素执行操作
long count()返回此流中的元素数

代码

ArrayList<String> al = new ArrayList<String>(List.of("周润发", "成龙", "小明", "刘德华", "吴京", "周星驰", "李连杰"));

al.stream().skip(2).limit(2).forEach(s -> {
    System.out.println(s);
});

long count = al.stream().skip(2).count();//获取数据的数量
System.out.println(count);

collect收集操作

  • collect方法 获取流中剩余的数据,但是他不负责创建容器,也不负责把数据添加到容器中.
  • Collectors提供了具体的收集方式
    • 收集到List 、收集到Set、收集到Map
方法名说明
public static Collector toList()把元素收集到List集合中
public static Collector toSet()把元素收集到Set集合中
public static Collector toMap(Function keyMapper,Function valueMapper)把元素收集到Map集合中

收集到list和set的代码

  • 把集合转为流,然后把偶数留下,收集到新的集合中(list或者set)返回
public static void main(String[] args) {
    ArrayList<Integer> al = new ArrayList<>();
    for (int i = 1; i <= 10; i++) {
        al.add(i);
    }
    //添加一些重复数据  为了后面set集合演示去重复
    al.add(10);
    al.add(10);
    al.add(10);
    al.add(10);

    //使用流 获取所有的偶数 最后collect收集到List集合里
    List<Integer> list = al.stream().filter(number -> number % 2 == 0).collect(Collectors.toList());
    System.out.println(list);

    //使用流 获取所有的偶数 最后collect收集到set集合中返回,这里返回的是set集合,重复的数据最后会默认去除
    Set<Integer> set = al.stream().filter(number -> number % 2 == 0).collect(Collectors.toSet());
    System.out.println(set);
    
    
}

收集到map

  • 把学生的名字作为key , 年龄作为value
    public static void main(String[] args) {
        ArrayList<Student> al = new ArrayList<Student>();
        al.add(new Student("zhangsan", 15));
        al.add(new Student("lisi", 17));
        al.add(new Student("xiaoming", 19));

        //数据收集为map集合
        Map<Object, Object> map = al.stream().limit(2).collect(
                Collectors.toMap(
                        new Function<Student, Object>() {
                            @Override
                            public Object apply(Student student) {
                                //返回值作为key
                                return student.getName();
                            }
                        },
                        new Function<Student, Object>() {
                            @Override
                            public Object apply(Student student) {
                                //返回值作为value
                                return student.getAge();
                            }
                        }
                )
        );

        Map<Object, Object> map1 = al.stream().limit(2).collect(
                Collectors.toMap(
                        student -> student.getName(),
                        student -> student.getAge()
                )
        );

        System.out.println(map);

    }

Stream流综合练习

案例需求

  • 现在有两个ArrayList集合,分别存储6名男演员名称和6名女演员名称,要求完成如下的操作
    • 男演员只要名字为3个字的前三人
    • 女演员只要姓林的,并且不要第一个
    • 把过滤后的男演员姓名和女演员姓名合并到一起
    • 把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据
  • 演员类Actor已经提供,里面有一个成员变量,一个带参构造方法,以及成员变量对应的get/set方法

演员类代码

public class Actor {
    private String name;

    public Actor(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

测试类代码

public static void main(String[] args) {
    ArrayList<String> manList = new ArrayList<String>();
    manList.add("周润发");
    manList.add("成龙");
    manList.add("刘德华");
    manList.add("吴京");
    manList.add("周星驰");
    manList.add("李连杰");
    //名字为3个字的前三人
    Stream<String> manStream = manList.stream().filter(s -> s.length() == 3).limit(3);

    ArrayList<String> womanList = new ArrayList<String>();
    womanList.add("林心如");
    womanList.add("张曼玉");
    womanList.add("林青霞");
    womanList.add("柳岩");
    womanList.add("林志玲");
    womanList.add("王祖贤");
    //只要姓林的,并且不要第一个
    Stream<String> womanStream = womanList.stream().filter(s -> s.startsWith("林")).skip(1);

    //合并过滤后的男演员和女演员
    Stream<String> newStream = Stream.concat(manStream, womanStream);
    newStream.forEach(s -> {
        //创建演员对象 把名字传入
        Actor actor = new Actor(s);
        //获取演员的对象的名字打印
        System.out.println(actor.getName());
    });
}

自学Stream里的 map reduce 方法

异常(重点)

异常介绍

  • 指程序在运行后,JVM遇到无法执行的代码,从而会中断程序

举例

例如:
    int[] arr = new int[3];
    System.out.println(arr[3]);
执行结果:
           Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
           at com.itheima.demo20.Demo01.main(Demo01.java:8)
               
例如:
    int[] arr = null;
   	 System.out.println("数组长度:" + arr.length);
执行结果:
           Exception in thread "main" java.lang.NullPointerException
           at com.itheima.demo20.Demo01.main(Demo01.java:8)
    
    
例如:
Scanner sc = new Scanner(System.in);
System.out.println("请输入年龄:");
int age = sc.nextInt()
System.out.println("你的年龄是:" + age);
执行结果:
	请输入年龄:
	呵呵
    	Exception in thread "main" java.util.InputMismatchException
           ......
   	    at com.itheima.demo20.Demo01.main(Demo01.java:9)

上面的三个程序都有一个特点:

  • 编译通过,运行后程序会中断!!
  • 出现这种现象带来的后果:
    • 如果是桌面程序,会出现卡死、闪退…等现象;
    • 如果是WEB程序,服务器端需要重启,用户无法访问。

异常处理效果演示

  • Java提供了一种“异常处理机制”,它是一种语法,可以在JVM遇到异常时,“跳过”有异常的代码,使程序继续运行下去
  • 异常处理机制的作用:可以让JVM跳过有异常的代码,继续运行下去!!
Scanner sc = new Scanner(System.in);
System.out.println("请输入年龄:");
try {
    int age = sc.nextInt();
    System.out.println("你的年龄是:" + age);//上一行代码出现异常,这一行代码会跳过,不会被执行
} catch (InputMismatchException e) {
    System.out.println("你的输入有误!");
}

System.out.println("后续代码...");
  • jvm如何处理异常呢???

当JVM执行,遇到有异常的代码时:

  • 1 JVM会先识别出这个异常
  • 2 然后JVM会到类库,找到描述这个异常的“异常类”,并创建此类对象
  • 3 随后JVM会到代码中查看是否catch(捕获)(之前必须有try)
    • 没有:在控制台打印异常信息,然后结束程序!!(没有异常处理机制)
    • 有:则将“异常对象”传给catch语句,然后执行catch语句,程序不会被结束!!(有异常处理机制)

在这里插入图片描述

  • RuntimeException(运行时异常):通常由程序逻辑引起的异常,程序员应通过良好的编码避免这种异常情况—可防!
  • 除RuntimeException外的其它异常(编译期异常):由外界原因导致的异常, 例如:磁盘坏道、网络中断等—意外!

小结

1. 异常的概念:
      指代码运行时,JVM遇到了无法处理的代码,这种情况称为“异常”。
2. 异常处理的作用:
     通过一些异常处理的语法,可以使JVM在执行到有异常的代码时,跳过这段代码,使程序可以继续运行下去。
3. 常见的几种异常:
     1). NullPointerException:空指针异常
     2). ArrayIndexOutOfBoundsException:数组索引越界异常
     3). InputMismatchException:输入不匹配异常
     4). ArithmeticException :算术运算异常(整数 / 0)
     5). StringIndexOutOfBoundsException:字符串索引越界 
4. 异常类体系结构:
    Throwable
             |--Error(错误)
             |--Exception(异常)
                       |--RuntimeException:运行时异常
                       |--其它异常:编译期异常

异常捕获

格式

  • 可以catch捕获多个异常
  • 注意:
    • 进行多catch异常处理时,父类异常不能放在子类异常的前面
try {
	//可能出现异常的代码;
} catch(要捕获的异常类名 变量名) {
	//出现异常后执行的代码;
} catch(要捕获的异常类名 变量名) {
	//出现异常后执行的代码;
} ....
  • 例子 多个异常的捕获
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入年龄:");
        //捕获异常
        try {
            int age = sc.nextInt();
            System.out.println("你的年龄是:" + age);//上一行代码出现异常,这一行代码会跳过,不会被执行
            String a = null;
            System.out.println(a.length());

        } catch (NullPointerException e) {
            System.out.println("空指针了");
        } catch (InputMismatchException e) {
            System.out.println("你的输入有误!");
        }
        System.out.println("后续代码...");

    }
  • 例子父类异常不能放在子类异常的前面 如下图

在这里插入图片描述

执行流程

  • 第一种情况:try中的代码没有任何异常,那么代码会跳过catch继续向下执行。
  • 第二种情况:try中的代码有异常会从所有catch中对比,如果catch捕获到了这个异常,那么代码会从try直接跳到catch中。
  • 第三种情况:try中的代码有异常但是catch没有捕获到这个异常,这个异常会依旧向外抛

throws声明异常

注意:

  1. 如果声明抛出的是“运行时异常”,调用的代码可以不处理,语法上不强制
  2. 如果声明抛出的是“编译期异常”,调用的代码要么使用try_catch,要么使用throws必须处理,否则编译错误。

代码1编译期异常

在这里插入图片描述

代码2运行时异常

在这里插入图片描述

注意

  • 编译时异常:在编译时期必须要进行处理(try…catch或throws
  • 运行时异常:在编译时期,可以try catch处理,也可以不处理(运用代码逻辑去避免)。

在这里插入图片描述

throw关键字使用

  • 作用:用来手动向外抛出异常。
    格式: throw new 异常类名();

代码1

  • divide中如果传入的b为0,就抛出异常
  • getStudent中如果传入的age不在范围内,就抛出异常
    public static void main(String[] args) {

        divide(10, 0);
        Student stu = getStudent("zhansgan", 20);
        System.out.println(stu);
    }


    public static int divide(int a, int b) {
        if (b == 0) {
            throw new RuntimeException("除数不能为0");
        }

        return a / b;
    }


    public static Student getStudent(String name, int age) {
        if (age < 0 || age > 150) {
            throw new RuntimeException("age不在范围内");
        }
        return new Student(name, age);
    }

代码2 抛出处理过的异常 再次处理

  • 注意在getSum方法内的catch里有一个throw e
  • 这种表示,捕获异常后,把异常抛出,让调用方法的人继续去处理异常
public static void main(String[] args) {
        try {
            int[] arr = {13, 23, 12, 25, 76};
            int sum = getSum(null);
            //int sum = getSum(arr);
            System.out.println("sum = " + sum);
        } catch (Exception e) {
            System.out.println("把异常保存到文件里");
        }
    }
    public static int getSum(int[] arr) {
        int sum = 0;
        try {
            for (int i = 0; i < arr.length; i++) {  //arr.length可能会产生空指针异常
                sum += arr[i];
            }
            return sum;
        } catch (NullPointerException e) {
            System.out.println("空指针");//统一的异常处理方式
            throw e;//把异常对象抛出 希望调用的人也可以处理到这个异常
        } 
    }

代码3 抛出处理过的异常 再次处理

在这里插入图片描述

finally代码块

  • finally代码块的特点:

    • finally代码块的内容无论是否出现异常,都会执行。它通常用于方法中,
    • 当try以及catch中需要return值或者抛出异常的时候
  • 格式:

try {A】可能会出现异常的代码
} catch(要捕获的异常类名 变量名) {B】出现异常后执行的代码
} finally {C】一定会执行的代码
}

代码

  • 下面的代码 虽然有return和throw e,但是finally里的代码始终都会执行
  • 注意如果再finally里写里的return,try里的return和catch里的throw e就不执行了

执行流程 (【A】【B】【C】看上面的格式)

  • 第一种情况:如果try中的代码没有异常,执行流程为【A】【C】
  • 第二种情况:如果try中的代码有异常,并且catch捕获到了这个异常,执行流程为 【A】【B】【C】
  • 第三种情况:如果try中的代码有异常,但是catch没有捕获到这个异常,执行流程为 【A】【C】向外抛出异常
    public static void main(String[] args) {
        try {
            int[] arr = {13, 23, 12, 25, 76};
            int sum = getSum(null);
            //int sum = getSum(arr);
            System.out.println("sum = " + sum);
        } catch (Exception e) {
            System.out.println("把异常保存到文件里");
        }
    }


    public static int getSum(int[] arr) {
        int sum = 0;
        try {
            for (int i = 0; i < arr.length; i++) {  //arr.length可能会产生空指针异常
                sum += arr[i];
            }
            //return sum;
        } catch (NullPointerException e) {
            System.out.println("空指针");//统一的异常处理方式
            throw e;//把异常对象抛出 希望调用的人也可以处理到这个异常
        } finally {
            System.out.println("方法执行完毕,时间:" + System.currentTimeMillis());
        }
    }

异常的常见方法

  • public String getMessage() 返回此 throwable 的详细消息字符串
  • public String toString() 返回此可抛出的简短描述
  • public void printStackTrace() 把异常的错误信息输出在控制台(字体为红色的)

代码

  • 注意printStackTrace异常的错误信息为红色
    public static void main(String[] args) {
        int index = 10;
        test(index);
    }

    public static void test(int index) {

        try {
            int[] arr = {1, 2, 3, 4, 5};
            //虚拟机帮我们创建了一个异常对象 new ArrayIndexOutOfBoundsException();
            System.out.println(arr[index]);
        } catch (ArrayIndexOutOfBoundsException e) {
            //System.out.println("有越界");
            e.printStackTrace();
            System.out.println(e.toString());
            System.out.println(e.getMessage());
        }
        System.out.println("嘿嘿嘿");
    }

自定义异常

  • 我们之前用的异常很多都是Java中定义好的,在真正开发中,有很多在JDK中没有定义的异常,比如年龄异常,分数异常等等,如果使用这样的异常,那么就需要我们自己定义了。
  • 一般自定义异常会继承Exception,目的是让大家必须去处理

代码

  • 类AgeException继承Exception 是编译期异常
  • 注意 如果需要传入异常描述,需要要写构造方法
public class AgeException extends Exception {
    public AgeException(String message) {
        super(message);
    }
}

测试

public class Demo01 {
    public static void main(String[] args) {
        try {
            test(-2);
        } catch (AgeException e) {
            e.printStackTrace();
        }
    }
    public static void test(int age) throws AgeException{
        if (age < 0)
            throw new AgeException("年龄异常");
    }
}

小结

1. 异常处理的基本语句?
            try{
                 ...
            }catch(异常类型名 变量名){
                 ...
            }
2.catch语句?
           try{
                 ...
            }catch(异常类型名1 变量名){
                 ...
            } catch(异常类型名2 变量名){
                 ...
            }
3. finally语句?
           try{
                 ...
                 return xxx;
            }catch(异常类型名1 变量名){
                 ...
                 return xxx;
            } finally{
                 //无论是否出现异常,都会被执行的代码
            }
4. throws:方法声明处,声明抛出异常?
5. throw:方法内部,抛出一个异常对象?
6. Throwable中的常用方法?
      1.getMessage():获取异常信息
      2. toString():异常类名 + 异常信息(如果有)
      3. printStackTrace():打印异常详细信息

经验总结

1 编译期异常 必须处理  如果是在方法中,那么就看这个方法是写业务逻辑的还是工具型的被别人调用的
	1.1如果是写业务逻辑的,那么直接trycatch捕获
	1.2 如果是工具型的被别人调用的,那么直接throws声明,也可以捕获后,catch中再throw抛出,交给调用的程序员去处理这个异常
	
2 运行时异常 一般像空指针 越界这种异常,很多是因为自己的代码不够严谨导致,需要自己处理代码的逻辑bug,很少去捕获

3 一般公司中都会有自己规范的自定义异常的方式,要写详细的文档和注释。

4一般自定义异常会继承Exception,目的是让大家必须去处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/126903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ESP-Matter】matter协议学习笔记--以乐鑫方案为例

matter协议学习笔记--以乐鑫方案为例0. 写在前边的话1. matter 协议基本概念2. 设备间的本地自动化交互2.1 同步控制的实例&#xff1a;2.2 异步通知&#xff08;订阅、报告&#xff09;3. 桥接设备4. thread 边界路由器5. 专业名词0. 写在前边的话 以下学习笔记均参考乐鑫官方…

一位嵌入式初学者的2022年度总结

目录 学习过程 人工智能 嵌入式 51单片机 STM32 MicroPython Arduino 其他 未来计划 RT-Thread LIUNX 其他 总结 学习过程 今年二月份才开始写博客&#xff0c;到现在一共写了131篇文章&#xff0c;其中包含了Python&#xff0c;Mysql&#xff0c;51单片机&#…

阶段性回顾(1)

TIPS 1. 函数实参与形参地址不一样&#xff0c;形参的话有自己的内存空间与地址&#xff0c;当函数进行传值调用的时候&#xff0c;形参是实参的一份临时拷贝&#xff0c;各种对于形参的改变&#xff0c;对于实参来说不会产生任何影响。 2. 函数的实参与形参的关系就相当于两者…

Jacoco统计项目单元测试覆盖率

1.JaCoCo介绍&#xff1a; JaCoCo&#xff0c;即 Java Code Coverage&#xff0c;是EclEmma团队基于多年覆盖率库使用经验总结而研发的一个开源的Java代码覆盖率库。 代码覆盖&#xff08;英语&#xff1a;Code coverage&#xff09;是软件测试中的一种度量&#xff0c;描述程…

通信原理与MATLAB(九):DPSK的调制解调

目录1.差分编解码原理1.1差分编码原理1.2差分解码原理2.DPSK的调制原理3.DPSK的解调原理4.DPSK的代码5.结果图5.特点1.差分编解码原理 1.1差分编码原理 绝对码变相对码 如下图&#xff0c;绝对码10110&#xff0c;差分编码首先确定一个参考码元0&#xff0c;然后相对码bnan异…

像素旋转:一种在加密图像中实现安全的可逆数据隐藏方案

文章目录前言一、提出的PR-RDHEI方案二、算法步骤简介1.图像加密2.数据嵌入&#xff08;重点&#xff09;3.图像恢复&#xff08;重点&#xff09;总结收获与思考前言 原文题目《Reversal of pixel rotation: A reversible data hiding system towards cybersecurity in encry…

任意组件通信:全局事件总线、消息订阅与发布

全局事件总线&#xff1a;任意组件间通信 1、一个重要的内置关系&#xff1a; VueComponent.prototype.__proto__ Vue.prototype 2、为什么要有这个关系&#xff1a; 让组件实例对象&#xff08;vc&#xff09;可以访问到Vue原型上的属性&#xff0c;方法。 第一步&#xf…

mysql-JDBCDruid基本使用方法

JDBC 今日目标 掌握JDBC的的CRUD理解JDBC中各个对象的作用掌握Druid的使用 1&#xff0c;JDBC概述 在开发中我们使用的是java语言&#xff0c;那么势必要通过java语言操作数据库中的数据。 1.1 JDBC概念 JDBC 就是使用Java语言操作关系型数据库的一套API 全称&#xff1a;( …

网络编程 重叠IO模型

目录 1.概念 2.代码详解 事件通知实现逻辑​ 1.WSASocket函数 2.AcceptEx函数 3.WSARecv函数 4.WSAGetOverlappedTesult函数 5.WSAResetEvent函数 6.WSASend函数 ##重叠IO模型事件通知整体代码 完成例程实现逻辑​编辑 ##重叠IO模型完成例程的整体代码 1.概念 重叠IO模型是对…

微信小程序集成three.js--1.创建各种光源的场景

1.实例演示 微信小程序集成Three.js&#xff0c;各种光源效果演示2.源码 &#xff08;1&#xff09;引入three.js库文件 import * as THREE from ../../libs/three.weapp.js import {OrbitControls } from ../../jsm/controls/OrbitControls const app getApp() 库文件下载…

第七章面向对象编程

第七章面向对象编程 7.1对象在内存中存在形式 7.1.1属性/成员变量/字段&#xff08;field) 1.属性成员变量字段field&#xff0c;概念上相等 public class Object02 {//编写一个 main 方法public static void main(String[] args) {}} class Car {String name;//属性, 成员变…

数据防泄露之图文档及业务数据经验分享

场景描述 信息化时代发展迅速&#xff0c;数据防泄露一词也频繁的出现在我们身边。无论企业或政府单位&#xff0c;无纸化办公场景越来越多&#xff0c;数据泄露的时间也层出不穷。例如&#xff1a;世界最大职业中介网站Monster遭到黑客大规模攻击&#xff0c;黑客窃取在网站注…

跟着pink老师学JS的第三天总结

* 这个仿京东的商品放大镜效果真不好做&#xff01; 鼠标拖拽&#xff1a; * 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"…

FineReport报表设计工具- 配置DB2外接数据库(1)

1. 概述 1.1 版本 报表服务器版本 功能变更 11.0 - 11.0.3 1&#xff09;首次配置外接数据库时&#xff0c;支持自行选择是否「迁移数据至要启用的数据库」 2&#xff09;迁移外接数据库的过程提示细化&#xff0c;方便用户了解迁移进度 1.2 功能简介 报表系统配置外接数…

Seata使用教程

文章目录一、Seata简介1.Seata 概念介绍2.分布式事务3.Seata核心组件4.Seata 工作流程5.Seata四大模式二、Seata实战教程1.下载资源2.配置Seata-Server3.增加相关表结构4.代码配置三、常见报错解决一、Seata简介 1.Seata 概念介绍 Seata 是一款阿里巴巴开源的分布式事务解决方…

eNSP 设备启动失败,错误代码:40 解决方案

eNSP 路由器启动失败&#xff0c;错误代码&#xff1a;40 解决方案 eNSP 路由器启动失败&#xff0c;错误代码&#xff1a;40 解决方案 文章目录eNSP 路由器启动失败&#xff0c;错误代码&#xff1a;40 解决方案一、出现错误代码&#xff1a;40二、解决方法1.确定相关的软件安…

《设计模式》外观模式

《设计模式》外观模式《设计模式》设计模式的基本原则 《设计模式》单例模式 《设计模式》工厂模式 《设计模式》原型模式 《设计模式》建造者模式 《设计模式》适配器模式 《设计模式》桥接模式 《设计模式》装饰者模式 《设计模式》组合模式 《设计模式》外观模式 定义&#…

免费刷题!初级软件测试面试题目和答案这个小程序很全

有没有软件测试面试题库小程序&#xff1f;相信这是很多准备找工作的新手测试人都想要知道的吧&#xff01; 今天&#xff0c;我就根据大家的需求&#xff0c;为大家整理了一些有关初级软件测试的面试题目以及一个可以免费刷题的题库&#xff0c;希望能帮助你们早日拿下心仪的…

UDS-10 Diagnostic and communication management functional unit

10 诊断与通信管理功能单元 来自&#xff1a;ISO 14229-1-2020.pdf 10.1概述 表22指定了诊断和通信管理功能单元。 注&#xff1a; DiagnosticSessionControl&#xff1a;客户端请求控制服务器的诊断会话。ECUReset&#xff1a;客户端强制服务器执行重置。SecurityAccess&am…

知识蒸馏原理

文章目录0.知识蒸馏&#xff08;模型压缩的一种方法&#xff09;1.蒸馏2.为什么要蒸馏3.知识的表示与迁移4.蒸馏温度T5.知识蒸馏过程6.知识蒸馏的应用场景7.知识蒸馏背后的机理8.为什么用soft targets 而不用 label smoothing?9.知识蒸馏的研究方向10.知识蒸馏代码库11.扩展阅…