IT评测·应用市场-qidao123.com

标题: Java入门7(异常处理,list集合) [打印本页]

作者: 温锦文欧普厨电及净水器总代理    时间: 2023-5-8 10:22
标题: Java入门7(异常处理,list集合)
异常处理(try-catch)

错误的种类

一般来讲,程序出现错误的时候,大致情况有三种:
⭐Java中的异常处理机制主要用于处理运行时错误
异常的定义

​        运行时发生的错误,叫做异常,处理这些异常的代码叫做异常处理,一旦发生异常,程序将会中止在异常发生的地方,之后的代码都不会被运行
  1. public static void main(String[] args) {
  2.     // 这句输出会抛出异常
  3.     System.out.println(1/0);
  4.     // 这句输出就不会被执行
  5.     System.out.println("tmp_text");
  6. }
复制代码
异常的处理方式

​        Java使用面向对象的方法来处理异常,在方法的执行过程中,如果出现了异常,该方法就会自动创建一个代表该异常的一个对象,将其交给运行时的系统,运行时系统自动查找对应的代码来处理这个异常,在这个过程中,生成异常,并且将其交给运行时系统的过程叫做抛出异常(throw),运行时系统,找到能处理该异常的对象的过程叫做捕获异常(catch)
异常类(Throwable类)

​        根据javac对异常处理的要求,把异常分为两类
处理异常的方法(Try--Catch)

​        Try 负责存放可能会产生异常的代码,catch 负责捕捉异常
​        异常处理在很多的时候,只能保证哪怕发生了异常,代码整体也可以正常的运行,但是不能解决异常的问题,还是需要有开发者自己修改代码,从根源上解决问题
  1. // 运行时异常
  2. // 除数为0异常是个典型的运行时异常,运行时异常并不一定需要做异常处理,不做异常处理,代码也可以通过编译
  3. public void test(){
  4.     try{
  5.         // 会产生除数为0的异常
  6.         System.out.println(1/0);
  7.     }catch (Exception e){
  8.         // 打印异常相关的堆栈信息,但是并不是一定要写
  9.         e.printStackTrace();
  10.     }
  11.     System.out.println("异常被处理了之后,程序依旧可以往下运行!");
  12. }
  13. // 检查时异常
  14. // 不管代码是否发生异常,都需要进行异常处理,负责无法通过编译,检查时异常大部分情况下和开发者无关,只和代码之外的环境有关
  15. public void test(){
  16.     try {
  17.         // 检查时异常,必须使用try——catch进行处理
  18.         Class.forName("com.test");
  19.     } catch (ClassNotFoundException e) {
  20.         e.printStackTrace();
  21.     }
  22.     System.out.println("异常被处理了之后,程序依旧可以往下运行!");
  23. }
  24. // 如果有多条可能发生异常的语句,最好每一个语句单独处理,多条语句同时进行异常处理,会出现代码少运行的问题
复制代码
finally关键字

​        确保在异常发生的时候,所有的收尾工作可以正常的完成,无论是否发生异常,finally代码块中的语句都会执行
⭐如果在catch代码块中出现了return,那么也必须先执行finally中的代码之后,再return退出
  1. // 发生异常时: try -> catch -> finally
  2. // 没有发生异常时:try -> finally
  3. public void test(int tmp) {
  4.     try {
  5.         System.out.println("test -> try()");
  6.         tmp = 1 / tmp;
  7.     } catch (ArithmeticException e) {
  8.         System.out.println("test -> catch()");
  9.     } finally {
  10.         System.out.println("test -> finally()");
  11.     }
  12. }
  13. // tmp = 1:
  14. //         test -> try()
  15. //         test -> finally()
  16. // tmp = 0:
  17. //         test -> try()
  18. //         test -> catch()
  19. //         test -> finally()
复制代码
throw关键字

​        可以借助throw关键字,主动抛出一个指定类型的异常
  1. public void test(){
  2.     try {
  3.         // 主动抛出一个空指针异常
  4.         throw new NullPointerException();
  5.     }catch (NullPointerException e){
  6.         System.out.println("捕获了异常");
  7.     }
  8. }
复制代码
throws关键字

​        如果某个方法不想处理异常,可以使用throws向上抛出异常,让上层的调用者进行异常处理
  1. public class Test04 {
  2.     // test01负责抛出异常
  3.     public void test01(){
  4.         throw new NullPointerException();
  5.     }
  6.     // test02运行test01时触发异常,但是并没有处理,使用throws向上抛出了此异常
  7.     public void test02() throws NullPointerException{
  8.         test01();
  9.     }
  10.     // test03处理test02向上抛出的异常
  11.     public void test03(){
  12.         try {
  13.             test02();
  14.         }catch (NullPointerException e){
  15.             System.out.println("捕获了异常");
  16.         }
  17.     }
  18. }
复制代码
throw 和throws 的区别

常见异常类型

自定义异常

​        自定义异常类,必须是Throwable类的子类,我们需要在某一个固定场景下,通过throw去抛出这个异常
  1. // 自定义异常 TestException
  2. public class TestException extends Throwable{
  3.     public TestException(String tmp){
  4.         super(tmp);
  5.     }
  6. }
  7. // test中使用自定义异常
  8. public void test(String name){
  9.     try {
  10.         throw new TestException(name);
  11.     } catch (TestException e){
  12.         e.printStackTrace();
  13.     }
  14. }
复制代码
集合

两大类集合

Collection接口

​        该接口定义的是所有单列集合所具有的共性方法
  1. public void test(){
  2.     // 使用多态的方法新建ArrayList集合
  3.     Collection c01 = new ArrayList();
  4.     Collection c02 = new ArrayList();
  5.     // 往集合里添加数据
  6.     for (int i = 0; i < 5; i++) {
  7.         c01.add("robot0" + i);
  8.     }
  9.     for (int i = 6; i < 10; i++) {
  10.         c02.add("robot0" + i);
  11.     }
  12.     // 删除集合内元素
  13.     c01.remove("robot01");
  14.     // 判断集合是否为空
  15.     System.out.println(c01.isEmpty());
  16.     // 输出集合内元素个数
  17.     System.out.println(c01.size());
  18.     // 合并两个集合
  19.     c01.addAll(c02);
  20.     // 遍历集合
  21.     for (Object o : c01) {
  22.         System.out.print(o + "\t");
  23.     }
  24.     System.out.println();
  25.     // 判断c01中是否含有c02中的所有元素
  26.     System.out.println(c01.containsAll(c02));
  27.     // 判断c01中是否有"robot03"这个元素
  28.     System.out.println(c01.contains("robot03"));
  29.     // 从c01中移除所有c02中的元素
  30.     c01.removeAll(c02);
  31.     // 重新遍历集合
  32.     for (Object o : c01) {
  33.         System.out.print(o + "\t");
  34.     }
  35. }
复制代码
集合的泛型

​        泛型大部分情况下适用于集合,泛型的作用,在使用的时候去限制数据的类型范围
  1. public class Dog {
  2.     private String name;
  3.     private String type;
  4. }
  5. public class Student {
  6.     private int sno;
  7.     private String name;
  8. }
  9. // 创建一个集合,这个集合只能存储dog类的对象的地址
  10. public void test(){
  11.     List<Dog> dogList = new ArrayList<>();
  12.     Dog dog01 = new Dog("001","Dog01");
  13.     Dog dog02 = new Dog("002","Dog02");
  14.     Dog dog03 = new Dog("003","Dog03");
  15.     // 这个dogList只能存储Dog类型的对象,因此集合使用泛型,可以限制集合中存储的数据类型
  16.     dogList.add(dog01);
  17.     dogList.add(dog02);
  18.     dogList.add(dog03);
  19. }
  20. // 创建一个集合,这个集合只能存储dog类和Student类的对象的地址
  21. // 扩展集合类型,需要使用接口的概念
  22. public class Student implements Animal{
  23.     private int sno;
  24.     private String name;
  25. }
  26. public class Dog implements Animal{
  27.     private String name;
  28.     private String type;
  29. }
  30. //两个类同时继承同一个接口类
  31. public void test(){
  32.     List<Animal> animalList = new ArrayList<>();
  33.     Dog dog01 = new Dog("001","Dog01");
  34.     Dog dog02 = new Dog("002","Dog02");
  35.     Dog dog03 = new Dog("003","Dog03");
  36.     Student student01 = new Student(1001,"Robot01");
  37.     // 这个dogList只能存储Dog类型的对象,因此集合使用泛型,可以限制集合中存储的数据类型
  38.     animalList.add(dog01);
  39.     animalList.add(dog02);
  40.     animalList.add(dog03);
  41.     animalList.add(student01);
  42. }
复制代码
List接口常用实现类

list接口相对于collection额外多了一些get,set方法
三个常用实现类:ArrayList(不保证线程安全,性能稍好),LinkedList(底层是链表),Vector(已经弃用)
List特点:
  1. 1. 有序集合:存储元素的顺序和读取元素的顺序一致
  2. 1. 允许存储重复的元素
  3. 1. 有索引,可以使用普通的for循环进行遍历
复制代码
  1. public void test(){
  2.     List list01 = new ArrayList();
  3.     // list添加元素
  4.     for (int i = 0; i < 5; i++) {
  5.         list01.add("robot0 " + i);
  6.     }
  7.     // 遍历list
  8.     System.out.println(list01);
  9.     // 指定位置改变
  10.     list01.set(1,"ROBOT");
  11.     System.out.println(list01);
  12.     // 指定位置插入
  13.     list01.add(5,"robot pro");
  14.     System.out.println(list01);
  15. }
复制代码
List的遍历方式

[code]// 1. for循环遍历for(int i = 0 ; i




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4