OpenJDK源码研究笔记(九)-可恨却又可亲的的异常(NullPointerException)

理解Java异常处理与最佳实践
本文深入探讨Java中常见的异常类型及其应用,通过案例分析展示如何利用异常进行错误提示和程序控制,强调异常处理在编写健壮代码中的重要性,并提供避免常见问题的策略。

可恨的异常

程序开发过程中,最讨厌异常了。

异常代表着程序出了问题,一旦出现,控制台会出现一屏又一屏的堆栈错误信息。

看着就让人心烦。

对于一个新人来讲,遇到异常经常会压力大,手忙脚乱,心生畏惧。

可亲的异常

但是,如果我们反过来看,异常可是非常好的错误提示。

在JDK中,定义了大量的异常,只要程序抛出了异常,我们根据异常的名字就能知道程序大概出了什么问题。

比如看到NullPointerException,我们就知道方法所属的对象是Null。

看到IndexOutOfBoundsException,我们就晓得数组的索引不在合法范围之内。

对于一个程序老鸟来说,看到异常的名字,就能够镇定自若,很快搞定问题。

没有异常,才是最难解决的问题。

最佳实践

熟悉JDK中的异常,知道异常所代表的问题和发生的原因,才能够更好地更快地解决实际编程问题。

预防胜于救火。

知道经常会出现哪些异常,才能够写出更加健壮的程序,才能够更加周全的考虑问题。

异常举例

下面这5个异常,出自java.lang包。更多异常,请参考OpenJDK源码,或JDK API参考手册。

ArithmeticException:当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。

ArrayIndexOutOfBoundsException:用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。

ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出该异常。

IndexOutOfBoundsException: 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。

StringIndexOutOfBoundsException:此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。对诸如 charAt 的一些方法,当索引等于字符串的大小时,也会抛出该异常。

典型案例

public class NullPointerException extends RuntimeException {
 private static final long serialVersionUID = 5162710183389028792L;

 /**
  * Constructs a {@code NullPointerException} with no detail message.
  */
 public NullPointerException() {
  super();
 }

 /**
  * Constructs a {@code NullPointerException} with the specified detail
  * message.
  *
  * @param s
  *            the detail message.
  */
 public NullPointerException(String s) {
  super(s);
 }
}


上述代码出自,OpenJDK源码包中的java.lang.NullPointerException。

我们可以看出,一个异常的定义非常简单,除了定义无参和有参的构造函数之外,没有别的任何业务方法。

异常很简单,就是用来清晰地表明程序发生的异常或错误。

代码示例

import java.util.List;

public class NullPointerExceptionExample {

 public static void main(String[] args) {
  List list = null;
  // 正常
  getLastGood(list);
  // 报错
  getLastBad(list);
 }

 // 不够健壮的代码
 public static Object getLastBad(List list) {
  // 如果传入的list为null,就会抛出NullPointerException
  int lastIndex = list.size() - 1;
  return list.get(lastIndex);
 }

 // 健壮的代码
 public static Object getLastGood(List list) {
  if (isEmpty(list)) {
   return null;
  }
  int lastIndex = list.size() - 1;
  return list.get(lastIndex);
 }

 // 判断一个list是否含有元素
 private static boolean isEmpty(List list) {
  boolean empty = false;
  if (list == null || list.size() == 0) {
   empty = true;
  }
  return empty;
 }
}


异常信息

Exception in thread "main" java.lang.NullPointerException
 at NullPointerExceptionExample.getLastBad(NullPointerExceptionExample.java:16)
 at NullPointerExceptionExample.main(NullPointerExceptionExample.java:10)

看到异常信息,我们很快就可以知道,第16行代码“  int lastIndex = list.size() - 1;”有问题。

而且,仔细看看这行代码,可以确定就是list为null引起的。

相关阅读

我的优快云博客专栏  OpenJDK源码研究笔记

OpenJDK源码研究过程中整理的学习笔记。 OpenJDK是GPL许可(GPL-licensed)的Java平台的开源实现。

原文参见http://FansUnion.cn/articles/3013 (小雷网-FansUnion.cn) 

转载于:https://www.cnblogs.com/qitian1/p/6463489.html

<think>好的,我现在需要帮助用户了解openjdk-11-jre-headless与其他软件包可能存在的冲突。首先,我需要回顾用户提供的引用内容,看看是否有相关的信息。 引用[2]提到用户在安装HBase时遇到了问题,尝试删除openjdk-8-jdk-headless和openjdk-9-jdk后仍未解决启动问题。这说明不同版本的OpenJDK可能存在冲突,尤其是在同一系统中安装多个版本时。引用[3]和[4]也提到了安装特定版本OpenJDK时遇到的困难,尤其是找不到包或依赖问题。 接下来,我需要考虑openjdk-11-jre-headless可能冲突的软件包类型。通常,冲突可能来自同一软件的不同版本,例如其他OpenJDK版本(如openjdk-8、openjdk-9、openjdk-17)或Oracle JDK。此外,依赖库如libxt-dev、x11proto-core-dev等可能因版本不兼容导致冲突。还有,某些应用可能依赖特定版本的Java,例如Hadoop或HBase,若它们配置为使用旧版本JDK,可能会与openjdk-11冲突。 需要验证这些信息是否正确。根据Debian/Ubuntu的包管理机制,不同版本的OpenJDK通常可以共存,但默认Java版本设置可能导致问题。用户需使用update-alternatives来管理默认版本。如果用户手动安装或配置错误,可能导致冲突。此外,第三方仓库的包可能与系统仓库中的版本冲突。 最后,根据用户提供的引用,尤其是引用[2]中的情况,建议用户在遇到冲突时彻底卸载其他JDK版本,清理配置,并确保使用官方仓库安装。同时,检查应用的兼容性文档,确认是否支持JDK 11。</think>关于$openjdk-11-jre-headless$与其他软件包的潜在冲突,结合引用内容和软件包依赖关系分析如下: ### 一、主要冲突类型 1. **同源多版本冲突** - 与旧版OpenJDK包冲突:$openjdk-8-jre-headless$[^2], $openjdk-9-jdk-headless$[^2], $openjdk-7-jdk$[^3] - 与新版OpenJDK冲突:$openjdk-17-jdk-headless$ - 与Oracle JDK冲突:$oracle-java11-installer$ 2. **依赖库冲突** - X11开发包:$libxt-dev$[^1], $x11proto-core-dev$ - 输入子系统包:$x11proto-input-dev$ - 旧版头文件包:$libx11-dev$ 3. **应用层冲突** - Hadoop生态系统组件(如HBase[^2]) - 依赖特定Java版本的应用(如Jenkins、Elasticsearch) ### 二、冲突验证方法 使用APT命令检测冲突: ```bash sudo apt-get install -s openjdk-11-jre-headless ``` ### 三、解决方案 1. 清理旧版本残留: ```bash sudo apt purge openjdk-*jdk-headless sudo apt autoremove ``` 2. 多版本共存配置: ```bash sudo update-alternatives --config java ``` 3. 强制指定版本(示例): ```bash sudo apt install openjdk-11-jre-headless -o Dpkg::Options::="--force-overwrite" ``` **注意**:引用[2][^2]显示HBase环境对JDK版本敏感,建议先验证应用兼容性再执行安装。若遇到$Unable\ to\ locate\ package$错误,可参考引用[4][^4]添加PPA仓库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值