java常用异常类

java异常

对于我们程序可能会出现的一些异常,可能无法通过我们写的代码去避免(空指针,文件没有找到,ClassNotfoundException,用户输入的格式),异常如果出现,我们需要在程序中进行处理,如果不进行处理很可能会影响程序的正常运行,导致当前线程停止。以及由于JVM内部出现的一些错误


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

java中异常大体可以分为两类:错误error和异常exception,对于错误,通常是JVM内部错误或者资源消耗过多引起,异常excpetion一般使我们我们的代码或者逻辑出现问题。都是可以通过trycatch处理的,但是通常不会去处理error系统错误,而是解决我们程序出现异常(空指针,格式转换),如果没有处理,那么会通过方法调用向上抛出,最终到达当前线程,但是无法处理,线程终止


提示:以下是本篇文章正文内容,下面案例可供参考

一、异常类继承结构图

各个类均为继承关系,Throw是一个类实现了Serializable接口

二、异常

       java中的异常大致可以分类两类:编译时异常(程序编译阶段)和运行时异常(程序运行阶段)。
       编译时异常:是必须处理的,不然程序编译出错。是我们认为可能会出现的异常。比如,ClassNotoundException,FileNotfoundException,IOException,SQLExceptin.
       运行时异常:可以不用处理,是指程序中代码运行可能(概率很小)出现的异常(数组越界,空指针,格式化,除数为0),我们无法确定是哪一个异常,RuntimeExcpetion及其子类都属于运行时异常。

1、 编译时异常

public class TestCompileException {
    public static void main(String[] args) {
        FileInputStream fis = new FileInputStream("fds");//必须进行处理,不然无法通过编译
    }
}

2、运行时异常


public class MyRuntimeException {
    public static void main(String[] args) {
        //ClassCastException:强转异常;
        Date date = (Date) new Object();
        
        //ArrayIndexOutOfBoundsException:数组越界
        int a [] = new int[]{1,2};
        System.out.println(a[3]);
        
        //NullPointerException:空指针
        Object obj = null;
        System.out.println(obj.toString());
        
        //ArithmeticException:除数为0
        int a = 3/0;

        //NumberFormatException:格式转换,捕捉
        try{
            int a  = Integer.parseInt("fsd");
        }catch (NumberFormatException e){
            System.out.println("格式转换异常");
        }
    }
 }

3、异常处理

1)处理机制

①对于编译时异常我们是必须处理的,不然编译时会报错。如果不处理也可以交给当前方法进行抛出,交给方法的调用者进行处理,以此类推,如果一直抛出不处理的话,那么最终会抛给主方法导致程序终止(对于多线程来说,当前线程会终止,)。所以我们应该在合适的地方采用trycatchfinally处理

②对于运行时异常,由JVM自动抛出异常,而且会一直上抛,可以不用处理,因为这些异常是不可预知的错误,

③try/catch/finally
将可能会出现的异常的代码包裹,
catch声明捕获的异常类(可以有多个,但是层级关系必须依次增大,不能是同一层级的,在我们自定义异常类时一定要注意,而且在捕捉编译时异常时,如果try语句块中没有出现编译时异常,那么不能捕捉,可以使用超类Excpetion捕捉,运行时异常可以捕捉
finally语句块肯定会执行,但不包括try中JVM就已经停止运行(错误,手动停止),即使try中有return语句,还是会执行finally(但是对变量的操作无效)
重写方法不能抛出比被重写方法范围更大的异常类型。
    在多态的情况下,对methodA()方法的调用-异常的捕获按父类声明的异常处理。
   即使方法体中没有抛出异常,方法中也可以抛出,但是如果方法体抛出了,那么方法上抛出的异常必须相关

2)异常抛出

  对于所有的异常都是可以抛出的。运行时异常由JVM自动抛出。而且在方法上不需要我们手动抛出异常。我们也可以手动抛出运行时异常,也是不需要处理的。
    public static void main(String[] args) {
        start();
    }

    public static void  start(){start2();
    }
    public static void  start2(){start3();
    }
    public static void  start3(){start4();
    }
    public static void  start4(){start5();
    }
    public static void  start5(){start6();
    }
    public static void start6() {start7();
    }public static void  start7(){throw new RuntimeException();
    }

/*打印结果:
Exception in thread "main" java.lang.RuntimeException
	at com.zy.exception.test01.Buzhuo.start7(Buzhuo.java:24)
	at com.zy.exception.test01.Buzhuo.start6(Buzhuo.java:23)
	at com.zy.exception.test01.Buzhuo.start5(Buzhuo.java:21)
	at com.zy.exception.test01.Buzhuo.start4(Buzhuo.java:19)
	at com.zy.exception.test01.Buzhuo.start3(Buzhuo.java:17)
	at com.zy.exception.test01.Buzhuo.start2(Buzhuo.java:15)
	at com.zy.exception.test01.Buzhuo.start(Buzhuo.java:13)
	at com.zy.exception.test01.Buzhuo.main(Buzhuo.java:10)
	*/

3)代码测试

①编译时异常

     byte a [] = new byte [8];
           FileInputStream fis = new FileInputStream("test.txt");
           fis.read(a);//读取所有的值
           System.out.println(Arrays.toString(a));//注意使用read()方法读取的是一个0-255范围的数,为什么负数变正数?
           fis.close();
       } catch (FileNotFoundException e) {
           System.out.println(e.getMessage());
       } catch (IOException e) {
           System.out.println(e.getMessage());
       }

②运行时异常

       try{
           Date date = (Date)new Object();
           System.out.println(date);
       }catch(ClassCastException e){
           System.out.println("强转异常");
       }

3、自定义异常

1)规范

我们可以自己声明一个类继承Throwable类,就可以实现抛出异常的效果(throw关键字抛出的异常必须是Throwable的子类,才可以

2)测试

    public static void main(String[] args) {
       try {
           methodA();
       } catch (MyException e) {
           System.out.println(e.getMessage());
           e.printStackTrace();
       }
   }


   public static void methodA() throws MyException {
       throw new MyException("my exception");
   }

三、总结

了解异常的用处(防止一些代码无控制的错误发生而导致程序出错,用户输入),熟悉常见的异常和继承关系,熟练异常的抛出机制和处理机制(编译时异常:catch只能捕捉try语句块中出现的),和自定义异常(继承Throwable类)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值