1.程序运行过程中难免会有设计上的漏洞,比如输入的格式不规范,打开某个文件时这个文件格式不对或者不存在了,还有读取数据库数据不存在或者为空等,程序跑着跑着内存或者硬盘满了等等问题。对于一些运行时碰到的一些异常的问题,在java中统称为异常,英文名也叫Exception,也意为例外。异常就可以让我们的程序碰到这些问题不至于崩溃。
2.异常指程序运行中出现的不期而至各种情况(注意不是在编译时候报错这种,是在运行时发生的情况),比如:文件找不到了,非法参数,网络连接失败了等等。
3.异常发在在程序运行期间,它影响了正常程序的执行流程。
2.异常的体系结构
1.java中异常被当做对象处理,并且定义了一个基类:java.lang.Throwable作为所有异常类的超类(所有异常都可以被当做Throwable类来处理,只是不够详细)
2.java API中已经定义了许多异常类,这些异常分为两大类,错误Error(十分严重的异常)和异常Exception
可以看到所有异常都是Threwable的子类
3.然后在Exception分支中有一一个重要的子类RuntimeException (运行时异常)
ArrayIndexOutOfBoundsException (数组下标越界)二__
NullPointerException (空指针异常)
ArithmeticException (算术异常)~-
MissingResourceException (丢失资源)
ClassNotFoundException (找不到类)等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。
这些异常-般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生;
4.Error和Exception的区别: Error通常是灾难性的致命的错误,是程序无法控制和处理的,当一出现这些异常时,Java虚拟机(JVM)一般会选择终止线程; Exception通常情况 下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。
异常的处理机制合理使用ctrl+alt+t快捷键键
异常处理的五个关键字
try 、catch、finally、throw、throws
捕获异常
package exception;
public class Demo01 {
public static void main(String[] args) {
int a=1;
int b=0;
//try{}catch(){}是异常必须存在的结构,finally{}是可以省略的
try {//try为监控区域,监控区域一旦发现异常,会进入catch语句被捕获
System.out.println(a/b);
new Demo01().a();//a()和b()都是无限循环的
} catch (Exception e) {//这里catch后面()里的格式为 (异常类名 形式参数名) 可能会靠这个参数调用一些方法
System.out.println("异常错误,进入了catch的代码块,异常被捕获到了");
//e.printStackTrace(); 使用快捷生成会输出原本报错输出的的异常类型
}catch(Throwable e){
System.out.println("范围更大的类一定要在范围小的类之后,不然会直接报错");
}finally{//finally作善后工作,可以省略
System.out.println("必定会执行finally里面的语句");
}
}
public void a(){
b();
}
public void b(){
a();
}
}
抛出异常
//抛出异常throws和throw关键字
package exception;
public class Demo02 {
public static void main(String[] args) {
int a=1;
int b=0;
//直接使用
try{
if(b==0){
throw new ArithmeticException();//算数异常,主动抛出异常,一般在方法中使用
}
System.out.println(a/b);
}catch (Exception e){
System.out.println("异常");
}
//方法中只用了throw可以不进行捕获
System.out.println("==============================");
System.out.println(new Demo02().test(2,1));
System.out.println("==============================");
//方法中只用了throws必须进行捕获
try {
System.out.println(new Demo02().test1(2,0));
} catch (Exception e) {
System.out.println("已经捕获");;
} finally {
}
}
public int test(int a,int b){
if(b==0){
throw new ArithmeticException();
}
int x=a/b;
return x;
}
public int test1(int a,int b)throws Exception{
if(b==0){
throw new ArithmeticException();
}
int x=a/b;
return x;
}
}
自定义异常
//自定义异常类
package exception;
public class myException extends Exception {//自定义异常类要进行继承异常类
private int test1;
public myException(int a) {
this.test1 = a;
}
@Override
public String toString() {//重写toString方法
return "myException{" + test1 + "}";
}
}
package exception;
//自定义异常的测试类
public class test {
public static void main(String[] args) {
//方法一在方法内直接处理了异常
test1(8);
//方法而在将方法内异常选择抛出,调用者调用时必须对其进行捕获
try{
test2(11);
}catch(myException e){
System.out.println("调用者调用方法时捕获到异常");
}
}
//1.在方法中直接进行捕获处理的方法
public static void test1(int a){
if (a>5){
try {
throw new myException(a);//myException构造器是有参构造器
} catch (myException e) {//1.在方法中直接进行捕获处理
System.out.println("在方法内直接抛出并捕获");
}
}else{
System.out.println("传递的参数为"+a);
}
}
//2.方法直接抛出异常通过调用者处理异常
public static void test2(int a) throws myException{
if(a>10){
throw new myException(a);
}
System.out.println("传递的参数为"+a);
}
}


