一些常见的RuntimeException

本文介绍了Java的强制异常捕捉机制,它提高了程序可靠性但也带来麻烦。将Java异常分为Error、Exception、RuntimeException三类,并举例说明。还列举了常见的RuntimeException,如NullPointerException、NumberFormatException等,强调理解异常处理机制的重要性。

Java中采用了强制异常捕捉机制,这样一方面提高了程序的可靠性,不过有时候也带来一些麻烦。比如: int i= Integer.parseInt("33");这个我知道它不可能会抛出异常,但是不捕捉异常的话就过不了编译这关,当然这个代码没有意义的。

Java中所有异常或者错误都继承Throwable,我们把它分为三类吧:
1.Error:所有都继承自Error,表示致命的错误,比如内存不够,字节码不合法等。
2.Exception:这个属于应用程序级别的异常,这类异常必须捕捉。
3.RuntimeException:奇怪RuntimeException继承了Exception,而不是直接继Error,  这个表示系统异常,比较严重。

Error我们很少遇到,但是并不是说Error就一定非常致命,举个例子,NoSuchMethodError表示没有这个方法,你调用的方法不存在,你一定觉得奇怪,不存在怎么编译的过去呀?很简单的,你先编译好一个被调用的类A,给一个方法。然后在你的程序调用它,编译没问题,运行也没问题。现在再把A类中这个方法去掉,重新编译一遍,你再运行你的程序就知道错误是怎么回事了。
Exception不用说,我们要自己捕捉。
RuntimeException可以说见的最多了,下面我们说明一下常见的RuntimeException:

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;
}

NumberFormatException:继承IllegalArgumentException,字符串转换为数字时。
比如int i= Integer.parseInt("ab3");

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

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

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

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

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

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

这些异常一看到名字就知道是怎么回事了,其实只要理解了java的异常处理机制,这些都不是问题。

 

### 如何避免 Java 中的 `RuntimeException` 及其最佳实践 #### 了解 `RuntimeException` `RuntimeException` 是 Java 编程语言中的一类未检查异常,这类异常通常表示程序逻辑错误或不当操作。常见的子类有 `NullPointerException`, `ArrayIndexOutOfBoundsException`, 和 `IllegalArgumentException` 等[^1]。 #### 使用防御性编程预防常见运行异常 为了防止这些异常的发生,在编写代码应采取一些预防措施: - **验证参数的有效性** 当函数接收来自其他组件的数据作为输入,应当先对其进行有效性检验再继续后续流程。对于可能为空的对象引用,可以在使用之前通过条件语句来判断是否为 null;而对于数组索引,则要确保它处于合法范围内。 ```java public static int getElement(int[] array, int index){ if(array == null || index < 0 || index >= array.length){ throw new IllegalArgumentException("Invalid arguments"); } return array[index]; } ``` - **初始化对象实例变量** 确保所有的对象成员都已经被适当地赋初值之后才被访问。这可以通过构造器内设置默认状态或是提供 setter 方法让用户自行设定达到目的。 ```java class Person { private String name; public Person(String n) { this.name = Objects.requireNonNull(n); } // getter and setters... } ``` #### 设计良好的 API 接口减少潜在风险 创建清晰易懂且不易误用的应用接口(API),比如采用 Builder 模式代替多个参量重载构造器,利用枚举替代魔法字符串等手段提高系统的稳定性和安全性。 此外,遵循面向契约的设计理念(COD),即明确声明前置条件(preconditions), 后置条件(postconditions)以及不变约束(invariants)[^2]。 #### 正确处理并发环境下的资源共享问题 多线程环境下资源竞争可能导致诸如死锁(deadlock)、竞态条件(race condition)等问题进而触发不可预见性的 runtime exception 。因此合理运用同步机制(synchronization primitives)如 volatile 关键字、synchronized block 或者更高级别的工具库(java.util.concurrent包下提供的各种实用设施)就显得尤为重要了[^3]. 例如下面这段改进过的代码展示了如何优雅地中止长间等待的任务而不至于丢失中断信号: ```java while (!Thread.currentThread().isInterrupted()) { try{ Thread.sleep(100_000L); }catch (InterruptedException ie){ Thread.currentThread().interrupt(); break; } } doSomethingCool(); ``` #### 调整开发环境配置规避特定平台引发的问题 有某些类型的 RuntimeException 并不是由应用程序本身引起的而是由于外部因素造成的,像不同版本JDK之间的兼容性差异可能会引起意想不到的结果。此调整编译/运行所依赖的基础软件栈可能是解决问题的关键所在[^5]。 例如遇到 `/packages cannot be represented as URI` 错误提示,可通过指定合适的 JDK 安装路径并更新相应的环境变量(JAVA_HOME) 来修复此类故障。 ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值