Throwable: 异常的顶级父类
            ----Error:错误,程序无法处理
            ----Exception:异常,可通过编码修复
                        ----编码异常:未运行已经报错
                        ----运行异常:可编译,运行报错

1.  Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
    at cn.tedu.basic.TestArray.main(TestArray.java:11)
    ------数组下标溢出异常
    
2.    There is no default constructor available in 包名 
    ------没有可用的默认构造函数
    ---解释:父类的含参构造覆盖了默认的无参构造,子类默认不显示的super()
    不能调用父类对应参数的构造方法,
    -解决办法:子类添加super(参数)
    
3.    ArithmeticException
    ----算术异常
    --例子:10/0 :0不能作为除数
    
4.    InputMismatchException
    ----输入不匹配异常
    --解释:输入的数据类型与自己预先定义的数据类型不匹配
    
5.    StackOverflowError
    ----堆栈溢出错误
    --解释:内部类和外部类一直互相调用占据了所有内存
            一直在创建内部类或外部类对象
例:Outer o = new Outer();o.eat();/*创建外部类对象,调用外部类*/---Inner i = new Inner();i.eat2();/*一直创建内部类对象,调用内部类*/---Inner i = new Inner();/*一直创建内部类对象*/

public class TestInner {
     public static void main(String[] args) {
         //Outer.Inner oi =new Outer().new Inner();
         Outer o = new Outer();
         o.eat();
         //oi.eat2();
     }
 }
 class Outer{
     private String name ="小二";
             int a =10;
     public void eat(){
         Inner i = new Inner();
         i.eat2();
         System.out.println(i.sum);
         System.out.println("外部类eat");
         System.out.println(i.toString());
         try {
             finalize();
         } catch (Throwable throwable) {
             throwable.printStackTrace();
         }
     }
     public static void good(){        System.out.println("外部类静态good()");
    }
    class Inner{
         Inner i = new Inner();
             //private double S =10.1;
             int sum =10;
         public void eat2(){
             System.out.println(i.toString());
             //Outer.good();
             System.out.println(name);
             System.out.println(a);
             System.out.println("内部类eat2()");
         }    }
 }

6.    NullPointExcept -- 空指针异常
    ----调用空对象的实例方法。
        访问或修改字段或空对象。
        以null的长度作为数组。
        访问或修改null插槽,就好像它是一个数组一样。
        将null视为Throwable值。
        --解决办法:可以通过适当地初始化给定对象(该对象将设置该对象的实例)来解决或解决。 因此,该对象将具有一个实例,并且不会为null,这是Null Pointer Exception的原因。
                    在捕获异常外面加一个非空判断
        --例:FileReader in = null;//定义的变量为空值,所以在下面需要赋值,否则后面使用对象in时一直为空
              new FileReader("D:\\ready\\1.txt");          
              
              
7.    FileNotFoundException -- 文件无法找到
    ----文件位置更换
        文件名、目录名或卷标语法不正确。

8.    InvalidClassException -- 无效类异常
    ----解释:stream classdesc serialVersionUID = -3193364654654535741,  自动生成的默认UID
              local class serialVersionUID = 3102686376622831557, 改动代码后生成的UID
        --解决办法:使前后UID保持一致:序列化与反序列化同时或者按顺序一个一个执行,
                    再或者手动将序列化版本号写出固定值 //private static final long serialVersionUID = 1L;
                    
9.    NotSerializableException -- 不可序列化异常
    ----要序列化对象所在的类并没有实现序列化接口,即没有implements父接口
        --解决方案:实现序列化接口
        
10.    Error:(27, 25) java: 未报告的异常错误java.lang.InterruptedException; 必须对其进行捕获或声明以便抛出
    ----中断异常:当阻塞方法收到中断请求的时候就会抛出InterruptedException异常
        --/*让每个进来循环的线程对象,都经历休眠10ms,增加错误出现的概率*/
                Thread.sleep(10);//让线程休眠10秒
例:

/**
  * 设计多线程编程模型,4个窗口共计售票100张
  * 本方案使用多线程实现方案1:implements Runnable来完成
  */
 public class TestThread2 {
     public static void main(String[] args) {
         //创建自定义类对象
         TicketRunnable target = new TicketRunnable();
         创建自定义线程对象
         Thread t1 = new Thread(target);
         Thread t2 = new Thread(target);
         Thread t3 = new Thread(target);
         Thread t4 = new Thread(target);
         t1.start();
         t2.start();
         t3.start();
         t4.start();
     }
 }//1.创建自定义多线程类实现多线程接口
 class TicketRunnable implements Runnable{
     //定义变量用来保存要收买的票数
     int tickets = 100;
     //重写run(),完成业务
     @Override
     public void run() {
         //循环卖票
         while (true){
             synchronized (TicketRunnable.class){
                 if(tickets>0){
                     try {
                         /*让每个进来循环的线程对象,都经历休眠10ms,增加错误出现的概率
                          * 问题一:产生重卖的现象:同一张票卖给了多人--同步锁synchronized (类名.class){}
                          * 问题二:产生了超卖的现象:超出了规定的票数100,出现了0,-1,-2这样的票 --if(tickets>0){}*/
                         Thread.sleep(10);//让线程休眠10秒
                     } catch (InterruptedException e) {
                         e.printStackTrace();
                     }
                     //打印当前正在卖票的线程名称,并且票数减一
                     System.out.println(Thread.currentThread().getName()+"="+tickets--);
                 }
                 //做判断,如果没票了就停止循环卖票
                 if (tickets<=0)break;
             }
         }
     }
 }

11.    NoSuchMethodException -- 没有这个方法异常
    ----构造方法的含参及全参,使用反射创建含参对象时,不报错但会出异常
    
12. ClassCastException -- 类抛出异常,
    ----即是类型转换错误,通常是进行强制类型转换时候出的错误
例子:a1和a2都是动物,但是a1这只动物是一只狗,而a2这只动物是猫,所以要把a1转换成狗可以,因为a1本身就是狗,而a2是一只猫,所以要转换成狗就出错

class Animal{}
 class Dog extends Animal{}
 class Cat extends Animal{}
 public class Test7 {
     public static void main(String[] args){
         Animal a1 = new Dog();//父类引用指向子类对象                                                                                                                                                                                                                                                                                                                                                
         Animal a2 = new Cat();
         Dog d1 = (Dog)a1;//强制父类引用类型转换为子类引用类型
         Dog d2 = (Dog)a2;
     }
 }

13. IllegalArgumentException -- 非法参数异常
    ----传入的参数违反了一个方法要求的某些特性
    
14. MyBatisSystemException -- MyBatis 系统异常