异常处理机制、部分集合

异常

Java程序运行过程中所发生的异常事件可分为两类

  • 错误(Error):JVM系统内部错误、资源耗尽等严重情况
  • 异常(Exception):其它因编程错误或偶然的外在因素导致的一般性问题

程序执行到异常发生处,JVM会创建一个当前异常类对象,并且通过throw关键字throw new 异常名称() 抛出异常,并且打印异常信息,程序不会继续往下执行

可处理异常 Exception:

学习java的核心面向对象(OOP)之后,在java中很多功能的实现都是通过定义类的方式去完成,包括异常机制,java针对在程序中可能会出现的每一种异常,都是通过类的方式去声明,异常在java中也是对象的存在。可处理异常又分为运行时异常和编译时异常, 在程序执行时,如果出现了异常那么java就会针对该异常创建异常对象。java的异常机制是十分强大的,可以帮助开发人员进行排错,这正是java的优势。
​ Exception和RunTimeException的父类都是Throwable

  • 运行时异常:

    一般针对发生概率相对特别小的异常,会定义成运行时异常

    运行时异常会直接或间接的继承RunTimeException

    NullPointerException:空指针异常是程序中经常遇见的一种异常情况,接收过来的引用为空,拿着该引用调用方法。空指针异常的解决方案:对接收过来的引用数据类型做非空校验

    ArrayIndexOutofBoundsException:数组下标越界异常,调用数组元素下标超过数组大小

    ArithmeticException:算术运算异常,比如0作为被除数

  • 编译时异常:

    一般针对发生概率相对特别大的异常,会定义成编译时异常

    编译时异常会直接或间接的继承Exception

    编译时异常要求开发人员一定要做处理

    FileNotFoundException:文件未找到异常

不可处理异常 Error:

​ 系统内部异常

异常处理机制:

​ try{
​ 具体需要被检测的代码
} catch (异常类 异常类的引用) {
​ 针对该异常的处理
} finally{
​ 该语句体中的内容是无论如何都会执行的,一般是用于资源回收
​ 回收的资源一般是指会造成对系统资源浪费的对象
}

​ 通过这种方式去处理异常,在捕获到异常后,会创建该异常对象,该异常对象会被catch语句块捕获,具体用异常类来接收该异常对象,然后做相应的处理,程序会继续往下执行(try里面捕获到异常,就不会执行后续的语句,继续往下执行指的是try语句块外面后续的内容)。catch语句块可以有多个,因为可能会有多种异常,当catch里异常类用某一特定异常类比如NullPointerException、FileNotFoundException 来接收而不是直接用最大父类 Exception 的时候,可以针对不同的异常做不同的操作,使用不同的catch语句块内容

​ FileNotFoundException案例:

//FileNotFoundException
import java.io.FileInputStream;

public class ExceptionDemo02 {

    public static void main(String[] args) {

        FileInputStream fileInputStream=null;
        try{
            //编译时异常
             fileInputStream= new FileInputStream("F:\\java_work\\day0611");

             return;
        }
        catch (Exception exception)//多态的体现 用最大Exception父类来接收各种异常
        {
            //打印日志的方法
            System.out.println("捕捉到异常");
            exception.printStackTrace();
        }
        //即使在前面try中调用了return finally也是会被执行的
        //除非强制结束虚拟机的进程 finally的语句才不会被执行
        finally {
            if (fileInputStream !=null) {
                try {
                    System.out.println("程序执行到finally");
                    fileInputStream.close();//成功或者失败,流对象使用系统的资源,需要关闭
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            else System.out.println("文件流对象为空");
        }
        System.out.println("程序成功执行到这");
    }
}

​ 执行结果:

捕捉到异常
文件流对象为空
程序成功执行到这
java.io.FileNotFoundException: F:\java_work\day0611 (系统找不到指定的文件。)
	...

​ 结果分析:
​ 这里给了一个无效的路径名,因此会产生异常,然后catch捕获,做catch语句块中的相应操作,然后执行finally语句块的内容,然后跳出try语句块,继续执行余下部分。

​ 当给出一个正确的文件路径,即不会产生异常时,执行结果:

程序执行到finally

​ 这说明,finally语句块的内容无论如何都是会被执行的。即使在创建流对象后,return语句结束掉本方法,也是先执行finally语句块后才实现return。

​ 但是当强制退出虚拟机结束虚拟机进程的时候finally里的语句块不会被运行,强制退出虚拟机System.exit();

异常处理机制的第二种:

​ throws 关键字把异常向上抛给方法的调用处,只是往调用处,那么最终还是要在调用处处理的。
​ throw 关键字,是出现异常后抛出异常

public void getMethod01(String s) throws NullPointerException
{
    //方法体
}

自定义异常:

​ 除了java提供的异常外,有时还需要我们自定义异常。自定义异常的方式,直接声明一个类,根据需要确定想自定义成编译时异常还是运行时异常,如果要定义成编译时异常,让该类去继承Exception类,如果是运行时异常,让该类去继承RunTimeException类,然后需要提供一个构造,通过super把异常信息告诉父类即可。

​ 当自定义异常时,定义为编译时异常,在throw new MyException()的方法体前还需要加上throws MyException

自动装箱和自动拆箱:

​ java中所有的基本数据类型都有对应的封装类(引用数据类型),我们学习的集合是只能存放引用数据类型的容器。

自动装箱:

  • 自动把基本数据类型转换成引用数据类型

自动拆箱:

  • 自动把引用数据类型转换为基本数据类型
//自动装箱:java自动把基本数据类型转换成引用数据类型
//int  --->  Integer
int i=100;//声明一个基本数据类型
Integer i2=i;
//double  --->  Double
double d=3.14;
Double d2=d;
//float  --->  Float
float f=0.12f;
Float f2=f;
//char  --->  Character
char c='i';
Character c2=c;
//byte  --->  Byte
byte b=10;
Byte b2=b;
//short  --->  Short
short s=10;
Short s2=s;
//long  --->  Long
long l=1000;
Long l2=l;
//boolean  --->  Boolean
boolean bo=true;
Boolean bo2=bo;
//自动拆箱 引用数据类型转为基本数据类型
Integer i3=500;
int i4=i3;
Test02 test02=new Test02();
test02.getFunction(1000);
/*传1000能用Object类对象 接收 是因为,自动装箱原理把int型的1000
转为Integer型,然后Integer是Object的子类,可以用Object进行接收,同时也是一种多态的体现*/
public void getFunction(Object object)
    {
        System.out.println(object);
    }

Integer.parseInt(String s)

将字符串类型的s转换成为整型int

String str1="1000";
String str2="1000";
System.out.println(str1+str2);
System.out.println(Integer.parseInt(str1)+
                   Integer.parseInt(str2));

执行结果:

2000
10001000

Collection

集合:

  •  集合是容器,只能存放引用数据类型
    
  •  每个集合的实现类底层都封装了一种数据结构
    
  •  集合是一个接口,继承于Iterable接口,里面只有抽象方法
    
  •  每个集合都可以获取迭代器接口
    

集合的结构:

//创建一个集合对象 接口不能实例化 要么new一个实现类要么用匿名对象{}
        Collection collection=new ArrayList();

        //添加元素 1000基本数据类型 这时候会自动装箱
        collection.add(1000);

        //添加浮点型
        collection.add(3.14);

        //添加引用数据类型
        collection.add(new Object());

        //添加接口的实例 (通过匿名内部类)
        collection.add(new myInterface(){
            @Override
            public void get() {
                //重写方法体
            }
        });
        System.out.println(collection.size());

        //遍历集合中的元素
        Iterator iterator =collection.iterator();
        while (iterator.hasNext())
        {
            System.out.println(iterator.next());
        }

    }
}
interface myInterface{
    void get();
}
class Student{
}

JDK API 1.6

Collection

方法摘要
boolean add(E e) 确保此 collection 包含指定的元素(可选操作)。
boolean addAll(Collection<? extends E> c) 将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。
void clear() 移除此 collection 中的所有元素(可选操作)。
boolean contains(Object o) 如果此 collection 包含指定的元素,则返回 true
boolean containsAll(Collection<?> c) 如果此 collection 包含指定 collection 中的所有元素,则返回 true
boolean equals(Object o) 比较此 collection 与指定对象是否相等。
int hashCode() 返回此 collection 的哈希码值。
boolean isEmpty() 如果此 collection 不包含元素,则返回 true
Iterator<E> iterator() 返回在此 collection 的元素上进行迭代的迭代器。
boolean remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
boolean removeAll(Collection<?> c) (Collection<?> c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
boolean retainAll(Collection<?> c) (Collection<?> c) 仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。
int size() 返回此 collection 中的元素数。
Object[] toArray() 返回包含此 collection 中所有元素的数组。
<T> T[] toArray(T[] a) 返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。
posted @ 2021-07-21 19:01  ins1mnia  阅读(54)  评论(0编辑  收藏  举报