异常总结

异常:
* 编译时异常: 需要定义类继承自Exception
* 格式: public class 类名 extends Exception{...}
*
* 运行时异常: 需要定义类继承自RuntimeException
* 格式: public class 类名 extends RuntimeException{...}

* 在java中所有的错误或者是异常都可以使用一个类来表示: java.lang.Throwable;
* 里面有很常用的三个类来表示:
* Error: 表示错误的信息,一旦出现程序立即停止
* Exception: 表示异常(编译时的异常)的信息,一旦出现处理完程序正常运行.
* RuntimeException: 表示运行时候的信息,是Exception的子类.

// 1. Error: 表示错误的信息,一旦出现程序立即停止
// int[]array = new int[1000000000];

// 2. Exception表示异常(编译时的异常)的信息,一旦出现处理完程序正常运行.
// FileReader fr = new FileReader("abc.txt");

// 3. RuntimeException: 表示运行时候的信息,是Exception的子类.

* 异常的解析流程:
* 1. 一旦程序出现异常,JVM自动创建异常类的对象(如果是自定义的异常需要手动创建)
* 2. 一旦检测到异常产生,JVM就会马上抛出异常,(如果是自定义的异常需要手动抛出)
* 3. 接下来需要处理抛出来的异常,有两种方式:
* 方式一: 使用关键字throws 抛
* 格式: public static void method() throws 异常类名{...}
*
* 方式二: 使用try_catch的方式处理(真处理)
* 格式:
* try{
* //编写有可能出现问题的代码
* }catch(异常类名 变量名){
* //处理方式,是一种预案
* }

* 如果自定创建一个异常类对象,该如何抛出,需要使用到关键字throw
* throw: 主动将产生的对象进行抛出
* 格式: throw 异常对象;
如:

public class Demo04ExceptionThrow {
public static void main(String[] args) {

int []array = {1,2,3,4,5};

int number = getElement(array, 20);

System.out.println("number = " + number);
}

public static int getElement(int[]array , int index){

// 判断数组是否为空
if(array == null){
NullPointerException kong = new NullPointerException("你传的数组是空地");
throw kong;
}

// 判断数组的索引是否越界了
if(index < 0 || index>=array.length){
ArrayIndexOutOfBoundsException yuejie = new ArrayIndexOutOfBoundsException("索引越界异常了:"+index);
throw yuejie;
//throw new ArrayIndexOutOfBoundsException("索引越界异常了:"+index);
}

return array[index];
}
}

  

* 检测到异常之后的处理方式,有两种:
* 方式一: 使用关键字throws, 声明抛出的异常
* 格式: public static void method(参数)throws 异常类名{...}
*
* 方式二: 使用try_catch的方式
* try{
* // 用来编写可能出现问题的代码
* }catch(异常类名 对象名){
* // 处理异常的一种方式,预案
* }finally{
* // 一般不管怎么样都会执行的,用来使用释放资源
* }

package cn.itcast.demo03;
/*
* 方式二: 使用try_catch的方式
* try{
* // 用来编写可能出现问题的代码
* }catch(异常类名 对象名){
* // 处理异常的一种方式,预案
* }finally{
* // 一般不管怎么样都会执行的,用来使用释放资源
* } 
* 
* try: 用来编写可能出现问题的代码
* catch: 处理异常的一种方式,预案,不一定会执行
* finally: 一般不管怎么样都会执行的,用来使用释放资源
*/

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Demo05ExceptionTryCatch {

public static void main(String[] args) {

FileReader fr = null;

try {
// 1.创建FileReader对象,绑定源文件
fr = new FileReader("abc1.txt");

// 2.读取文件内容
int ch = fr.read();

} catch (IOException e) {// IOException e = new IOException();

System.out.println("我正在拼命的处理异常.....");
//e.printStackTrace();// 打印异常信息

} finally{
System.out.println("finally中的代码执行了....");
// 3.关闭流
if(fr != null){
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}


System.out.println("程序结束了......");
}
}

  


*
* 注意点:
* 1. 在使用throws声明抛出异常的时候,如果异常之间存在继承关系,只需要写父类异常即可.
* 2. 如果有多个异常,不存在继承关系,可以使用逗号隔开.


* 在使用try_catch处理异常的时候,根据实际情况还有几种格式:
* 1. try_catch结构中,如果出现类多个异常,想要一种处理方式,异常之间不存在继承关系,可以在catch中并列写出多个异常
* 格式: try{}catch(异常类名 A | 异常类名B 变量名){}finally{...}
*
* 2. try_catch结构中,如果出现多个异常存在继承关系,大的异常需要写在后面,并且希望单独去处理每一个异常,使用多个catch
* 格式: try{}catch(异常类名A 变量名A){...}catch(异常类名B 变量名B){...}....
*
* 3. try_catch结构中,可以省略catch,确认没有什么异常要抓取,可以省略掉catch,配合finally
* 格式: try{}finally{}
*
* 4. try_catch结构中,可以没有finally.一般对于没有什么资源想要释放的.
* 格式: try{}catch(异常类名 变量名){}
*
* 5. try_catch结构中,任何结构中不能省略try, 并且不能只有try




* 在继承结构体系中,如果子类重写了父类的方法,异常该如何处理
* 1. 如果父类方法没有异常, 那么子类中出现了异常不能抛(throws), 只能try.(父亲不坏, 儿子不能坏)
* 2. 父类中如果方法有异常, 子类中的异常和父类中异常如果有继承关系,那么不能大于父类异常.(父亲坏, 而不能更坏)
* (实际使用场景,父类什么异常子类什么异常就好了.)

人生就像一场路途,尝遍酸甜苦辣,方知人生苦甜.
原文地址:https://www.cnblogs.com/zennon/p/8127984.html