Java 异常之 RuntimeException和Exception的区别

Java 异常之 RuntimeException和Exception的区别在java的异常类体系中,Error和RuntimeException是非检查型异常,其他的都是检查型异常。所有方法都可以在不声明throws的情况下抛出RuntimeException及其子类不可以在不声明的情况下抛出非RuntimeException简单的说,非RuntimeException必要自己写catch块处理掉。RuntimeExce

大家好,又见面了,我是你们的朋友全栈君。

在java的异常类体系中,Error和RuntimeException是非检查型异常,其他的都是检查型异常。

所有方法都可以在不声明throws的情况下抛出RuntimeException及其子类 

不可以在不声明的情况下抛出非RuntimeException

简单的说

非RuntimeException必要自己写catch块处理掉。如果不处理,程序将出现编译错误。

RuntimeException不用try catch捕捉将会导致程序运行中断,若用则不会中断。

 

总结地说明:

  • 运行时异常是RuntimeException类及其子类的异常,是非受检异常,如NullPointerException、IndexOutOfBoundsException等。由于这类异常要么是系统异常,无法处理,如网络问题;
    要么是程序逻辑错误,如空指针异常;JVM必须停止运行以改正这种错误,所以运行时异常可以不进行处理(捕获或向上抛出,当然也可以处理),而由JVM自行处理。Java Runtime会自动catch到程序throw的RuntimeException,然后停止线程,打印异常。

  • 非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类,是受检异常。非运行时异常必须进行处理(捕获或向上抛出),如果不处理,程序将出现编译错误。一般情况下,API中写了throws的Exception都不是RuntimeException。

 

1.RuntimeException

 

今天摩根IT电面的时候被问到Exception和RuntimeException的区别,当时答不出来,大囧,晚上来学习一下。

首先看一段代码,主要内容就是将字符串类型的数字转化为整型的数字,然后让两个数字相乘,代码如下:

Java 异常之 RuntimeException和Exception的区别View Code

public class RuntimeException {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String str="123";
        int temp=Integer.parseInt(str);
        System.out.println(temp*temp);
    }
}

产看parseInt方法的源代码如下:

Java 异常之 RuntimeException和Exception的区别View Code

   public static int parseInt(String s) throws NumberFormatException {
    return parseInt(s,10);
    }

我们发现这个方法中抛出了NumberFormatException异常,但是在上面的代码中我们没有找到try…catch来处理,这是为什么呢。按照我们异常处理的知识,如果一个方法通过throws抛出了异常,那么可以在抛出异常的方法中不适用try…catch,但是在调用这个方法的地方必须有try…catch来处理。

下面来观察NumberFormatException类的继承关系:

Java 异常之 RuntimeException和Exception的区别

从上图我们可以发现NumberFormatException是RuntimeException的子类,那么这就需要我们清楚Exception和RuntimeException的概念:

  1. Exception:在程序中必须使用try…catch进行处理。
  2. RuntimeException:可以不使用try…catch进行处理,但是如果有异常产生,则异常将由JVM进行处理。

对于RuntimeException的子类最好也使用异常处理机制。虽然RuntimeException的异常可以不使用try…catch进行处理,但是如果一旦发生异常,则肯定会导致程序中断执行,所以,为了保证程序再出错后依然可以执行,在开发代码时最好使用try…catch的异常处理机制进行处理。

2.User Defined Exception

下面给出一个自定义异常的实例:

Java 异常之 RuntimeException和Exception的区别View Code

class MyException extends Exception{
    public MyException(String msg){
        super(msg);
    }
}

public class DefaultException {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try{
            throw new MyException("自定义异常");
        }catch(Exception e){
            System.out.println(e);//edu.sjtu.ist.comutil.MyException: 自定义异常
            //System.err.println(e);
//            e.printStackTrace();
//            StackTraceElement[] sts = e.getStackTrace();
//            for (StackTraceElement st : sts){
//                System.err.println(st);
//            }

        //    System.err.println(e.getStackTrace());
        }

    }

}

输出结果为:

MyException: 自定义异常

 

 

 

常见的RuntimeException- –

 

                                      

RuntimeException是开发中最容易遇到的,下面列举一下常见的RuntimeException:

1、NullPointerException:见的最多了,其实很简单,一般都是在null对象上调用方法了。
      String s=null;
      boolean eq=s.equals(“”); // NullPointerException
   这里你看的非常明白了,为什么一到程序中就晕呢?
   public int getNumber(String str){

  if(str.equals(“A”)) return 1;
   else if(str.equals(“B”)) return 2;
   }
   这个方法就有可能抛出NullPointerException,我建议你主动抛出异常,因为代码一多,你可能又晕了。
   public int getNumber(String str){

  if(str==null) throw new NullPointerException(“参数不能为空”);
                                   //你是否觉得明白多了
  if(str.equals(“A”)) return 1;
      else if(str.equals(“B”)) return 2;
   }

2、NumberFormatException:继承IllegalArgumentException,字符串转换为数字时出现。比如int i= Integer.parseInt(“ab3”);

3、ArrayIndexOutOfBoundsException:数组越界。比如 int[] a=new int[3]; int b=a[3];

4、StringIndexOutOfBoundsException:字符串越界。比如 String s=”hello”; char c=s.chatAt(6);

5、ClassCastException:类型转换错误。比如 Object obj=new Object(); String s=(String)obj;

6、UnsupportedOperationException:该操作不被支持。如果我们希望不支持这个方法,可以抛出这个异常。既然不支持还要这个干吗?有可能子类中不想支持父类中有的方法,可以直接抛出这个异常。

7、ArithmeticException:算术错误,典型的就是0作为除数的时候。

8、IllegalArgumentException:非法参数,在把字符串转换成数字的时候经常出现的一个异常,我们可以在自己的程序中好好利用这个异常。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/161483.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • nevicat15激活码_通用破解码[通俗易懂]

    nevicat15激活码_通用破解码,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • java程序日志管理

    java程序日志管理初入软件开发这一行的人,可能对日志管理的概念并不是很明确,大概是由于经验所限,以至于根本还考虑不到这个问题。而从某种意义上来说,日志管理实际上也不需要初入这一行的人来管,他们只需要负责实现自己的主要业务逻辑和功能就好了。我当初刚入行的时候就有很长一段时间完全不用去关心日志,到后来偶尔涉及到的时候,也都是从其他地方采用cv大法直接搬用。不过,随着工作时间的变化,随着手头上任务重要程度的变化

  • 发现 Google Buzz 与 Google Code 进行了集成[通俗易懂]

    发现 Google Buzz 与 Google Code 进行了集成[通俗易懂]提交B3logSolo(运行在GAE/J上的博客程序)代码后发现GoogleCode版本控制系统会将提交日志同步发布到GoogleBuzz中:但在Buzzconnectedsites里并没有看到与GoogleCode关联:现在一提交代码就Buzz,还是比较无奈的….本文是使用B3logSolo从简约设计の艺术进行同步发布的原文地址:…

    2022年10月16日
  • Chain of Responsibility职责链[通俗易懂]

    Chain of Responsibility职责链[通俗易懂]职责链 Chain of Responsibility动机模式定义实例结构要点总结笔记动机在软件构建过程中,一个请求可能被多个对象处理.但是每个请求在运行时只能有一个请求者.如果显示指定.将必不可少地带来请求发送者与接收者地紧耦合如何使请求地发送者不需要指定具体地接收者?让请求地接收者自己在运行时决定来处理请求,从而使两者解耦模式定义使多个对象都有机会处理请求 从而避免请求地发送者和接收者之间地耦合关系.将这些对象形成一条链.并沿着这条链传递请求.直到有一个对象处理它为止实例#include&

  • oracle数据库迁移到新服务器_oracle库对库迁移数据

    oracle数据库迁移到新服务器_oracle库对库迁移数据一、创建用户1.1步骤1.2注意事项二、处理空表(1)描述Oracle11g中的新特性,当一个表中的数据为0时不分配segment,所以就不能够被导出。(2)解决方法方法一:先insert一条数据,再rollback就产生segment了,该方法是在空表中先插入一条数据,再删除就产生segment了,执行exp或者expdp时就可以导出了此空表了。方法二:修改deferred_segment_creation参数,该参数默认为TRUE,当修改为F..

    2022年10月21日
  • 使用Go来模拟Java中的接口 实现类

    使用Go来模拟Java中的接口 实现类

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号