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 系统异常