(十五)、常见的几种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
很想高飞,但我不能;不想天空,剩我一人。
原文地址:https://www.cnblogs.com/lixiansheng/p/11299880.html