异常介绍
我要你输入的是数字 但是你偏偏要输入abc
语法错误 逻辑错误 这些都不算做异常
异常处理就是在开发过程中 程序员写的代码不能保证是十全十美的
总会出现小问题,这个时候就需要异常处理 但是异常的处理最佳阶段是在编译时
如果在编译时能够发现异常 我们就能在运行之前就处理好)并不是所有异常都能够在编译时发现
更多的异常是在运行时才被发现的
java.util.InputMismatchException
输入类型不匹配
java.lang.StackOverflowError
栈溢出
public static void main(String[] args) {
main(args);
}
java.lang.OutOfMemoryError
堆溢出 OOM
Integer[] integers = new Integer[1024*1024*1024];
java.lang.NullPointerException
空指针异常
int [] i = null;
System.out.println(i[2]);
java.lang.ArrayIndexOutOfBoundsException
下标越界
int[] is = new int[] {1,3,4};
System.out.println(is[4]);
java.lang.ClassCastException
类型转换异常
Object object = new Integer[3];
String string = (String)object;
FileNotFoundException
文件不存在的异常
红色是喜庆的颜色。有异常就往上抛,谁调用谁处理。## 异常的分类
Throwable异常的顶级父类
异常分为Error和Exception
异常的分类
Error
但凡你看见结尾是Error的 那就是jvm无法处理的异常 严重错误异常
针对此种异常 我们一般不做处理
Exception
Exception 分为两种 一种叫做编译时异常(又称已检查异常) 一种叫做运行时异常 —- RuntimeException
平时异常我们主要处理编译时异常 很少对运行时异常进行处理
异常还可以分为 受检异常 和非受检异常
检查性异常:
最代表的检查性异常是用户错误或问题引起的异常,这是无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
运行时异常:
运行时异常可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
错误:
错误不是异常,而是剥离程序员控制的问题。代码中的错误通常被忽略。例如,当堆栈溢出时,一个错误就发生了,它们在编译时也检查不到的。
异常的处理方式
异常的处理
1 抓 处理的过程 我们需要将异常捕获并进行处理
2 抛 在程序运行的时候还在编译的时候 遇到异常 会自动生成
一个异常对象 程序会将这个异常对象抛出 之后这段代码就不在执行了
异常的处理方式
1、try catch finally
try里面放入可以发生异常的代码
catch 是与异常进行匹配,匹配就执行相应的代码。
finally 一般在try catch 里面担任关闭资源的,finally 强制执行即使try catch已经退出
2、throws 抛出
一般定义在方法上 他只负责将异常往上抛 谁调用谁负责 当然调用者继续往上抛
3、throw 手动抛出
通常抛出我们自定义的异常 或者自己手动抛出想要的异常
异常处理之 throws
RuntimeException 运行时异常 一般不做处理
Exception 里面包含运行时异常和编译时异常 一定要处理(因为里面包含了编译时异常)
throws写在方法后面 他的作用是将异常抛出 谁调用谁负责处理 当然调用者也可以继续往上抛出
最终一定会有调用者去处理他的
注意如果你throws的是运行时异常 那么调用者可以不去处理
如果你throws是编译时 调用者一定要处理 不然程序无法运行
本质上 异常处理 大多数处理是编译时异常
throw 手动抛出
自定义异常
第一步 继承异常
第二步重写异常的方法
class MyExecption extends Exception {
//建议写上 如果不知道怎么写 找父类的
static final long serialVersionUID = -7034897190745766939L;
public MyExecption() {}
public MyExecption(String string) {
super(string);
}
}
public class ch {
public static void main(String[] args) {
int cound;
ch ch =new ch();
try {
cound=19;
//比如取出钱多于余额时 我需要提醒你
throw new MyExecption("所缺乏的钱"+cound);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在自己需要自定义异常的时候使用
自定义异常 如果你继承的是运行时异常 则不需要一定处理
如果你继承的是编译时异常 则一定要处理 建议你throws