Java:异常的处理

简介:

异常分两种大的异常类型,运行时异常和受检查异常。

用户既可以使用系统的异常类来处理异常信息,也可以创建系统的异常类的子类来自定义异常,这种方式比较灵活,虚拟机可以报出自己设置的异常信息,清楚明白。

1、运行时异常

     运行时异常的特点时java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即时没有有try---catch语句捕获它,也没有使用throws语句抛出它,还是会编译通过。

2、受检查异常

  除了运行异常外,其他异常都属于受检查异常,这种异常的特点是要么用try...catch捕获处理,要么用throws语句声明抛出,否则编译不会通过。

3、两者的区别

  运行时异常表示无法让程序恢复运行的异常,导致这种异常的原因通常是由于执行了错误的操作。一旦出现错误,建议让程序终止。

  受检查异常表示程序可以处理的异常。如果抛出异常的方法本身不处理或者不能处理它,那么方法的调用者就必须去处理该异常,否则调用会出错,连编译也无法通过。当然,这两种异常都是可以通过程序来捕获并处理的。

  对于运行异常,建议不要用try...catch...捕获处理,应该在程序开发调试的过程中尽量的避免,当然有一些必须要处理的,自己知道了那个部分会出现异常,而这种异常你要把它处理的你想要的结果,例如:空值处理。

 

异常的处理方式有三种:(1)用户完全自己处理、(2)抛给主方法,主方法再抛给虚拟机处理、(3)先抛出来,用户再自己处理

使用系统异常举例如下:

第一种处理方式(用户自己检测、捕获、处理):

复制代码
class ExceptionDemo
{
    public int  method(int a,int b)
    {
       return a/b;
    }
}
class ExceptionDemoTest 
{
    public static void main(String[] args) 
    {   
        ExceptionDemo ed = new ExceptionDemo();
        try
        {
           int x = ed.method(4,0);
           System.out.println("x = "+x);
        }
        catch (Exception e)
        {
           System.out.println(e.toString()); //输出异常的类的对象
           System.out.println("除零了");
        }
        finally
        {
            System.out.println("over");
        }
    }
}
复制代码

第二种处理方式(用户的功能方法抛出异常,交给主方法抛出异常,最后由虚拟机JVM进行处理):

复制代码
class ExceptionDemo
{
    public int  method(int a,int b) throws Exception
    {
       return a/b;
    }
}
class ExceptionDemoTest 
{
    public static void main(String[] args) throws Exception
    {   
        ExceptionDemo ed = new ExceptionDemo();
        ed.method(4,0);
        System.out.println("over");
    }
}
复制代码

 第三种处理方式(用户的功能方法抛出异常,接着由用户自己检测、捕获、处理):

复制代码
class ExceptionDemo
{
    public int  method(int a,int b) throws ArithmeticException,ArrayIndexOutOfBoundsException
    {
       int[] array = new int[a];
       System.out.println(array[4]);
       return a/b;
    }
}
class ExceptionDemoTest 
{
    public static void main(String[] args) 
    {   
        ExceptionDemo ed = new ExceptionDemo();
        try
        {
         //int x = ed.method(4,0);  //所传两个数据均发生了异常,即数组下标越界异常和除数为0异常,但这两个
                                    //异常不能同时检测到,因为检测时有循序,但第一个检测到处理完时即停止
                                    
        // int x = ed.method(4,1);  //检测到数组越界异常
           int x = ed.method(5,0);  //检测到除0异常
           System.out.println("x = "+x);
        }
        catch (ArithmeticException e)
        {  
           System.out.println("异常的数据信息为"+e.getMessage());
           System.out.println(e.toString());  //输出异常的类的对象
           System.out.println("除零了");
           //e.printStackTrace();    //其实它是虚拟机的处理机制
        }
        catch (ArrayIndexOutOfBoundsException e)
        {
          System.out.println("异常的数据信息为"+e.getMessage());
          System.out.println(e.toString());     //输出异常的类的对象
          System.out.println("数组角标越界异常");
          //e.printStackTrace();    //其实它是虚拟机的处理机制
        }
        catch(Exception e)     //这个是上面的子类异常的父类异常,多用于处理不在具体的异常之外的异常
        {
          System.out.println(e.toString());     //输出异常的类的对象
        }
        finally
        {
            System.out.println("over");
        }
    }
}
复制代码

使用系统异常类Exception的子类来自定义异常

具体举例如下:

例子1:

需求:人为自定义异常(除数不能为负数)

复制代码
//继承Exception的异常类
class
FuShuException extends Exception { /* private String msg; FuShuException(String msg) { this.msg = msg; } public String getMessage() //输出异常信息 { return msg; } */ private int vaule; FuShuException(String msg,int vaule) { super(msg); //父类throwable已经完成了异常的处理,子类直接可以调用,所以上面的异常初始化方法不用再写 this.vaule = vaule; } public int getVaule() { return vaule; } }
//异常类
class ExceptionDemo { public int method(int a,int b) throws FuShuException { if(b<0) throw new FuShuException("出现了除数是负数的情况:/by fushu",b); //通过手动throw抛出自定义异常对象 return a/b; } }
//主方法测试
class ExceptionDemoTest { public static void main(String[] args) { ExceptionDemo ed = new ExceptionDemo(); try { int x = ed.method(4,-1); System.out.println("x = "+x); } catch (FuShuException e) { System.out.println(e.toString()); //输出自定义异常类,自动去调用前面的get Message(); System.out.println("错误的负数是:"+e.getVaule()); //System.out.println("除数为负数了"); } finally { System.out.println("over"); } } }
复制代码

 例子2:

 异常的举例描述:老师用电脑讲课

 (封装成对象)异常类:

   1、电脑蓝屏(BuleScreenException),抛出后老师可以捕获解决。

   2、电脑冒烟(SystemSmokingException),抛出后老师解决不了,可以转换为课程进度异常抛出,老师可以捕获解决  即产生第三个异常类NoPlanExecption

 提炼需求类:

       1、老师:成员变量(name)、成员方法(lecture)

        2、电脑:成员方法(run、reset)

复制代码
//继承Exception的电脑蓝屏异常类
class
BlueScreenException extends Exception { private String message; public BlueScreenException(String message) { super(message); } }
//继承Exeption的系统冒烟异常类
class SystemSmokingException extends Exception { private String message; public SystemSmokingException(String message) { super(message); } }
//继承Exception的转换异常类
class NoPlanExecption extends Exception { private String message; public NoPlanExecption(String message) { super(message); } }
//定义一个老师类
class Teacher { private String name; private Computer c; public Teacher(String name) { this.name = name; c = new Computer(3); //设置电脑目前的状态(1或2或3) } void lecture() throws NoPlanExecption { try { c.run(); } catch (BlueScreenException e) { System.out.println(e.toString()); c.reset(); } catch(SystemSmokingException e) { test(); throw new NoPlanExecption("讲课不能继续,"+e.getMessage()); //冒烟异常老师解决不了,转换为课程进度异常抛出 } System.out.println(name+"讲课"); } public void test() { System.out.println("学生自己做练习"); } }
//定义一个电脑类
class Computer { private int state; //电脑状态:数字1代表正常运行、数字2代表蓝屏、数字3代表冒烟 public Computer(int state) { this.state = state; } void run() throws BlueScreenException,SystemSmokingException { if(state==2) throw new BlueScreenException("电脑蓝屏了"); else if(state==3) throw new SystemSmokingException("电脑冒烟了"); System.out.println("电脑运行"); } public void reset() { state = 1; //重新将电脑状态设置成数字1 System.out.println("电脑重新启动"); } }
//测试类
class CustomizeExceptionDemo { public static void main(String[] args) { Teacher t = new Teacher("毕老师"); try { t.lecture(); } catch (NoPlanExecption e) { System.out.println(e.toString()); System.out.println("换老师或放假"); } } }
复制代码

 

 

 

 

 

 

 

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!
本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4915402.html ,如需转载请自行联系原作者
相关文章
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
496 1
|
Java API 调度
如何避免 Java 中的 TimeoutException 异常
在Java中,`TimeoutException`通常发生在执行操作超过预设时间时。要避免此异常,可以优化代码逻辑,减少不必要的等待;合理设置超时时间,确保其足够完成正常操作;使用异步处理或线程池管理任务,提高程序响应性。
630 13
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
289 1
|
10月前
|
Java 程序员 数据库连接
我们详细地讲解一下 Java 异常及要如何处理
我是小假 期待与你的下一次相遇 ~
224 1
|
SQL Java 中间件
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
776 14
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
4165 5
|
IDE 前端开发 Java
怎样避免 Java 中的 NoSuchFieldError 异常
在Java中避免NoSuchFieldError异常的关键在于确保类路径下没有不同版本的类文件冲突,避免反射时使用不存在的字段,以及确保所有依赖库版本兼容。编译和运行时使用的类版本应保持一致。
620 8
|
Java 编译器
如何避免在 Java 中出现 NoSuchElementException 异常
在Java中,`NoSuchElementException`通常发生在使用迭代器、枚举或流等遍历集合时,尝试访问不存在的元素。为了避免该异常,可以在访问前检查是否有下一个元素(如使用`hasNext()`方法),或者使用`Optional`类处理可能为空的情况。正确管理集合边界和条件判断是关键。
412 6
下一篇
开通oss服务