zoukankan      html  css  js  c++  java
  • (十五)、常见的几种RuntimeException

    一般面试中java Exception(runtimeException )是必会被问到的问题
    RuntimeException是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。可能在执行方法期间抛出但未被捕获的RuntimeException 的任何子类都无需在 throws 子句中进行声明。它是Exception的子类。
     
    常见的异常列出四五种,是基本要求。更多的。。。。需要注意积累了
     
    常见的集中RuntimeExcetion
     
    NullPointerException - 空指针引用异常
     
    当程序运行时,对象为初始化或为空时,NullPointException就出现了,写java程序时要特别注意这个异常,该异常不捕获,直接导致整个程序奔溃。
    java是纯粹面向对象的编程语言,一切都是对象。对象就有方法和属性,在为空的对象中调用方法就会出现NullPointerException。
    一个很简单的栗子:
    public String getName(Cat c){
        return c.name;
    }

    这段代码用来获取Cat对象:c的姓名,这里的c为null时,100%会出现空指针错误了。

    保险的作法是在执行name方法前先检查u是否为空?

     
    public String getName(Cat c){
        if (c == null){
            return null;
        }
        return c.name;
    }

    这样就不会导致出现空指针异常了,一个经验,对于那些可能为空的对象进行操作时,一定要检查是否为空,可避免空指针异常。

    在java 8 中引入了 OPtional 类,专门用来解决null的安全问题,上面的代码用Optional改写成:
    public static String getName(Cat c){
        Optional<Cat> cat = Optional.ofNullable(s);
        if (!cat.isPresent()){
            return "is Null";
        }
        return c.get().name;
    }

    或者简写:

    public static String getName(Cat s){
        return Optional.ofNullable(s).map(sl-> sl.name).orElse("is Null");
    }
    IllegalArgumentException - 传递非法参数异常
     
    一个简单的小栗子:
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class test{
        public static void main(String[] args) {
            Date day = new Date();
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String date = df.format(day);
    
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM");
            String format = dateFormat.format(date);
            System.out.println(format);
        }
    }

    运行会报错:

    无法将给定的对象作为日期格式化,即因为传递了一个错误的参数。

     
    IndexOutOfBundsException - 下标越界异常
    该异常通常是指数组下标越界异常。
    *调用的数组或者字符串的下标值是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了
    *还有一种情况,是程序中定义的数组的长度是通过某些特定方法决定的,不是事先声明的,这个时候,最好先查看一下数组的length,以免出现这个异常
    例如:一个ArrayList数组中没有元素,而你想获取第一个元素,运行是就会报此类型的错误。
     
    import java.util.*;
    
    public class test{
        public static void main(String[] args){
            List<String> list = new ArrayList<>();
            System.out.println(list.get(0));
        }
    }

    运行时会报错

    ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
    当试图将类型不兼容类型的对象存入一个Object[]数组时将引发异常
    测试示例1:
    public class test{
        public static void main(String[] args) {
            String[] array = {"a", "b"};
            Object[] o = array;
            System.out.println(o.getClass());
            o[0] = new Object();
        }
    }

    运行时会报错

    代码中将String[]类型的数组向上转型成为Object[]数组,而真正在运行时,打印出来该数组的实际类型依旧是String[]数组,之后向该数组插入一个Object类型的元素时,抛出异常。

    测试示例2:

    import java.util.*;
    
    public class test{
        public static void main(String[] args) {
            List<String> list = Arrays.asList("a", "b");
            System.out.println(list.getClass());
            Object[] o = list.toArray();
            System.out.println(o.getClass());
            o[0] = new Object();
        }
    }

    运行时报错

    代码中声明了一个List<String>的集合,运行时得到的是Arrays的内部类ArrayList类型。通过toArray()方法后,实际得到的是String[]数组,也不是Object[]数组,之后插入Object类型的元素时,抛出异常。

     
    NumberFormatException - 数据类型转换异常
    当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常。
    例如将字符型的数据"123456"转换成数值型数据时,是允许的。
    但是如果字符型数据中包含了非数字型的字符,如"123#56",此时转换成数值型时就会出现异常。系统会捕获这个异常,并进行处理。
    示例:
    import java.util.*;
    
    public class test{
        public static void main(String[] args) {
            String str = "a123";
            int i = Integer.parseInt(str);
            System.out.println("Integer value = " + i);
            System.out.println("value = " + str);
        }
    }

    运行时报错

    解决方案:

    只需删除任何非数字字符;

    System.out.println("Integer value = " + str.replaceAll("[^0-9]", ""));

    ClassCastException - 类型强制转换异常
    ClassCastExceptio错误是指类型强制转换出错了。当我们用子类对象去强制转换父类对象就会报错,或者使用子类对象 = 父类对象,同样会抛出java.lang.ClassCastException
    public class BaiDu {
        String name = "baidu";
    }
    
    public class JingYan extends BaiDu{
        String Cname = "jingyan";
    }
    
    public class test{
        public static void main(String[] args) {
            BaiDu baidu = new BaiDu();
            JingYan jingyan = new JingYan();
            //这里将定义了的baidu赋值给jingyan
            //由于类型不一致,所以要进行强制转换,用JingYan这个类来进行强制转换
            jingyan = (JingYan) baidu;
            System.out.println(jingyan);
        }
    }

    运行时报错

    修改代码

    public class test{
        public static void main(String[] args) {
            BaiDu baidu = new BaiDu();
            JingYan jingyan = new JingYan();
            baidu = (BaiDu) jingyan;
            System.out.println(jingyan);
        }
    }

    这里是把jingyan赋值给baidu,由于类型不一致,所以要进行类型强制转化,用BaiDu这个类来进行强制转换。

    由此我们可以知道,可以用父类对象去强制转换为子类对象,但是不能用子类对象去强制转换呈匪类对象就会报错,或者使用子类对象 = 父类对象。

     
    ArithmeticException - 算术运算异常
     ArithmeticException是出现异常的运算条件时,抛出此异常。
     
    例如 java.lang.ArithmeticException: / by zero
    原因,定义的被除数为整型(short、int、long)会抛出异常,被除数为整型时不可为零。
     解决方案:检查整型的被除数。
     
    SecurityException - 安全异常
     一个SecurityException调用方没有所需访问资源的权限时将引发异常。
     
     
    UnsupportedOperationException - 不支持的操作异常
     在调用 Arrays.asList() 方法时把一个数组转化成 List 列表时,对得到的 List列表进行add() 和 remove() 操作时出现 java.lang.UnsupportedOperationException 异常。把数组转化为 List 的操作代码如下
    String[] stringArray = ResourcesUtils.getStringArray(R.array.home_channel);
    List<String> stringList = Arrays.asList(stringArray);
    stringList.remove(0)

    运行时报错

    Caused by: java.lang.UnsupportedOperationException

    原因:

    java.lang.UnsupportedOperationException 是指请求的方法不被支持的异常。

    在从 Arrays.asList() 转化过来的 List 的不支持 add() 和 remove() 方法,这是由于从 Arrays.asList() 返回的是返回 java.util.Arrays$ArrayList ,而不是 ArrayList。

    Arrays$ArrayList和ArrayList 都是继承 AbstractList,add() 和remove()等方法在AbstractList中默认 throw UnsupportedOperationException 而不做任何操作。ArrayList 重写这些方法对 List 进行操作,而 Arrays$ArrayList 却没有重写 add() 和 remove() 等方法,所以对从 Arrays.asList() 转化过来的 List 进行 add() 和 remove() 会出现 UnsupportedOperationException 异常。
    一句话:使用 Arrays.asList() 方式转将数组转换为的集合,是不可被更改
     
    解决:
    使用 Iterator 迭代器或者转化成 ArrayList;
     
    NegativeArraySizeException - 创建一个大小为负数的数组错误异常
     这个是因为传入的数值是负数,检查数组的大小是否成负数了。

    一般首先要判断一下传入是是否大于0才做出相应的操作,这样就不会提示错误。
     
     
    参考自:https://blog.csdn.net/qq635785620/article/details/7781026
    很想高飞,但我不能;不想天空,剩我一人。
  • 相关阅读:
    shell中test命令方法详解
    Linux 查看端口使用情况
    jboss 报错处理及端口修改
    jboss的使用和安装
    python 关于列表的增删改查及个别的命令
    Cisco Cat4500系列High CPU故障步骤摘要
    Services: ARP Caching
    Passive Client Feature
    BGP前缀过滤(正则表达式)
    Cisco Spectrum Expert(Wave2 AP)
  • 原文地址:https://www.cnblogs.com/lixiansheng/p/11299880.html
Copyright © 2011-2022 走看看