java异常处理

来源:互联网 发布:java 线程中断机制 编辑:程序博客网 时间:2024/06/07 04:58

一、java错误包含:

1、编译错误:编译器(把java代码编译成class文件)能识别的错误,必须执行前修改。

2、运行时的错误(简称异常):运行时才会报错。报错可以在consale通过行号查看异常的代码

二、异常的原理:

1、java代码在JVM中运行,如果发生了异常,JVM抛出异常。

2、JVM如果能找到异常处理程序(能处理异常里面的错误程序),来处理该异常。Java Runtime(java运行时),让Java程序继续执行。

3、JVM如果不能找到异常处理程序,整个Java程序被异常终止。

三、java内置异常

1、java自带一些异常类

2、Throwable是java所有的异常基类(父类)


3、异常的分类

1)Exception 与程序相关的错误(可以处理的错误),分为:

     a.检查到的异常: 编译错误,编译器会强制程序员修改。

      

     b.未检查到的异常:编译错误,编译器会强制程序员修改。

       

2)Error 与运行环境相关的错误(无法补救的错误),比如内存不足,跟代码无关

4、空指针异常 NullPointerException引用了没有地址的对象

int[] numbers=null;//没有实例化,没有分配内存System.out.println(numbers.length);
四、实现异常处理:优点是让异常后面的代码可以继续执行

1、使用try...catch处理异常(catch用来捕获异常):

public static void main(String[] args) {int i=10;int j=0;try{//写可能会发生异常的代码System.out.println(i/j);}catch(ArithmeticException e)//小括号里面必须写参数,参数写认为可能会发生异常的类型{//如果发生了ArithmeticException异常,就执行catch//如果没有发生异常 或者发生的是其他异常,catch语句就不会执行System.out.println("因为除数为0,商以0来计算");}}
1)也可以同时写多个catch

public static void main(String[] args) {int i=10;int j=0;try{System.out.println(i/j);}catch(NullPointerException e){System.out.println("空指针");} catch(ArithmeticException e){System.out.println("因为除数为0,商以0来计算");}
2)如果多个catch语句的异常类里面有继承关系时,要注意catch顺序:

      先写 catch 子类异常,再写 catch 父类异常 

public static void main(String[] args) {int i=10;int j=0;try{System.out.println(i/j);}catch(ArithmeticException e){System.out.println("因为除数为0,商以0来计算");} catch(Exception e){System.out.println("因为除数为0,商以0来计算");}
3)多个 catch 可以合并(但是catch里面不能存在继承关系)

public static void main(String[] args) {int i=10; int j=0;try{//写可能会发生异常的代码System.out.println(i/j);}catch(ArithmeticException <span style="color:#FF0000;">|</span> NullPointerException e){System.out.println("因为除数为0,商以0来计算");}
2、throw语句:显示抛出异常,转移异常

语法:throw 异常类 (Throwable类子类)

//抛出异常方法public void throwException(){throw new NullPointerException();//在正常代码中抛出异常,比如验证的错误}

//抛出异常后可以写try...catch处理,在调用时进行实现public class ExceptionDemo {public static void main(String[] args) {int i=10;int j=0;ExceptionDemo e=new  ExceptionDemo();e.throwException();//方法里面因为有异常抛出,所以可以在这里进行异常处理。        try        {System.out.println(i/j);        }catch(ArithmeticException h)        {        throw new NullPointerException();        }}}

3、throws关键字:只能写在方法签名中,说明方法里面发生的异常,用于抛出方法里面的异常(抛出的异常与方法里面的异常相同)

      在调用方法的地方,需要进行异常处理

//throws的用法public void testThrows throws <span style="color:#FF0000;">Exception()</span>{throw new <span style="color:#FF0000;">Exception()</span>;//testThrows方法里面发生了检查到的异常}
ExecptionDemo e=new  ExecptionDemo();e.testThrows();//抛出异常后在调用方法的地方,进行异常处理

4、finally 语句:无论是否发生异常都会执行的代码

public static void main(String[] args) {int i=10;int j=0;        try        {System.out.println(i/j);        }catch(NullPointerException h)        {        throw new NullPointerException();        }<span style="color:#FF0000;">finally</span>{            //<span style="color:#FF0000;">收尾工作,比如关闭资源</span>            System.out.println("无论是否发生异常,都会执行的代码");        }}
5、try-with-resources 执行完try语句块后,自动关闭资源

        try(Scanner sc1=new Scanner(System.in))        //执行完try语句块后,自动关闭Scanner        {        //代码        }catch(Exception a){        //代码        }
6、自定义异常,步骤如下:

1)创建异常类:定义一个类 继承 Throwable类或者其子类

public class ageException extends Exception {//一般重写构造方法,在抛出异常(实例化new)时执行代码public ageException(){System.out.println("自定义ageException年龄异常");}}
2)使用自定义异常

public class TestAgeException {public static void main(String[] args) {        int age=-1;        try{        if(age<0 || age>200)        {//调用构造方法,输出:自定义ageException年龄异常        throw new ageException();        }        }catch(ageException e)        {        e.printStackTrace();//打印堆栈信息(输出异常类的全路径,以及发生异常的代码的位置)        }}}
输出内容:

自定义ageException年龄异常<span style="color:#FF0000;">cn.exception.study.ageExceptionat cn.exception.study.TestAgeException.main(TestAgeException.java:11)</span>
7、断言:

1)用法:用于软件测试阶段;判断某个表达式,是否成立,若不成立抛出异常(AssertionError),确认程序错误的原因和错误的源。

2)实现断言:格式为assert 需要判断的表达式。

public static void main(String[] args) {int age=0;System.out.println("请输入年龄: ");Scanner san=new Scanner(System.in);age=san.nextInt();<span style="color:#FF0000;">assert 1==2;</span><span style="color:#FF0000;">assert(age>0 && age<100);</span>}
3)打开Eclipse断言的功能:添加vm参数-ea,运行后就可以看到对应断言表达式是否成立。

      a. 右键运行的代码,在弹出的菜单中选择Run AS--Run Configurations...,弹出Run Configurations窗口

      b. 在Run Configurations窗口左侧选择运行的类,在右侧窗口的Arguments标签中VM arguments中输入-ea,点击Run按钮

     

     运行结果:

    (请输入年龄:
   1
   Exception in thread "main" java.lang.AssertionError
     at cn.exception.study.Testassert.main(Testassert.java:12))





0 0
原创粉丝点击