java基础笔记-异常


五 异常

? 没有完美的程序员,也没有完美的机器,真要是崩了,不写异常就直接error退出了

? 异常分为两种:

? >Error:stackOverflowError(栈溢出,没设置出口),OOM(OutOfMemory)

? >Exception 编程原因,偶然因素,问题不大,还能挽救下

? 空指针异常

? 文件读取不到

? 网络连接中断

? 数组交表越界(区分与空指针)

1.异常分类

java.lang.Throwable
	|------java.lang.Error:一般不表写针对性的代码处理
	|------java.lang.Exception:可以进行异常的处理
		|------编译时异常(checked)
			|------IOXeception
				|------FileNotFoundException
			|------ClassNotFoundException
		|------RuntimeException:运行时异常(unchecked)
			|------NullPointerException
			|------ArrayIndexOutOfBoundsExecption
			|------ClassCastExcption 类型转换异常
			|------NumberFormatException
			|------InputMismatchException 输入异常,比如给了nextInt一个字符串
			|------ArithmaticException 算数运算异常

2.异常处理:

? try-catch-finally

? 有可能出事,那我放在try里,出事了如果我能解决,就catch

? throws

? 我解决不了,我往上报(给调用方),直到一个能解决的,上报到main还解决不了,大家一起完蛋

? 做法:

? >try里面运行,遇到异常之后,jvm就会生成一个对应异常的对象,并将此对象抛出,后面的的代码就不运行了

? >catch异常的处理方式:try-catch-finally 或者 throws

? 使用try-catch处理编译时异常, 使其不报错,但是运行时仍可能报错,相当于将编译时异常延迟成运行时异常

? 运行时异常比较常见,一般不做处理,

2.1 try-catch-finally

如果声明的异常存在子父类关系,子类必须放前面

常用的异常处理方式

? >System.out.pringln(e.getMessage());

? >e.printStackTrace();

try{

}catch(异常类型1 对象名1){
    //处理异常的方式
}catch(异常类型2 对象名2){
    //给你机会了,你得把握住
}finally{
	//一定会执行的代码
    比如一些物理的连接:socket,io流,数据库连接,等需要手动连接(防止catch里仍有异常)
}

2.2 throws

如果让main也抛,则会抛给虚拟机,解决不了的挂掉

public void method() throws FileNotFoundException,IOException{
	File file =new File("12.txt");
	FileInputStream  fis =  new FileInputStream(file);
	int data= fis.read();
	while(data!= -1){
		sout((char)data);
		data= fis.read();
	}
	fis.close();
} 
public void method2()throws FileNotFoundException,IOException {
    method1();
}
main()throws FileNotFoundException,IOException {//方式1
    try{    
    	method2();
    }catch (IOException e){
        e.printStackTrace();
    }
}

2.3重写方法 涉及的异常

? 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常

? 因为多态

? 父类没用throws,则子类也不能用,意味着子类只能用trycatch

2.4手动抛出异常

? 之前,异常都是系统自动生成的。

? 可以手动产生一个异常对象,并抛出(throw)

class Student{
	private int id;
    public void regist(int id){
        if(id>0){
            thid.id=id;
        }else{
            //手动抛出异常
            throw new RuntimeException("输入数据错误");
        }
    }
}

2.5自定义一个异常类

? 1.继承一个异常 RunTimeException(不用显式的处理),Exception(需要处理)

? 2.提供一个全局常量serialVersionUID

? 3.提供重载的构造方法

class MyException extends RunTimeException{
    static final long serialVersionUID = -793489746458756785678L//序列化的唯一标识号
    public MyException(){
    }   
    public MyException(String msg){
        super(msg);
    }
        
}