Java中用list的add方法添加数据时,报空指针异常

本文介绍了一种在Java Web开发中遇到的空指针异常问题及其解决方案。通过实例展示了如何正确初始化List来避免此类错误,并强调了理解Java内存模型的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近学习javaweb,在从数据库查到数据添加到list的时候,系统提示空指针异常,如图所示:

向上看sonList的初始化方法是:private List sonList=null;

原来这个地方出现错误,因为只在栈中有引用而在堆中没有分配到内存空间所以报错

所以把初始化改为:private List sonList=new ArrayList();

以后要多学学Java内存模型!

<think>好的,用户现在想了解Java异常体系。之前他们问过Java的引用类型,现在转向异常处理,可能是想更全面地理解Java的核心概念。首先,我需要回忆Java异常的分类,确保自己记得正确。 Java异常分为检查型异常和非检查型异常,非检查型包括运行异常和错误。检查型异常比如IOException,必须在代码中处理,否则编译不通过。运行异常比如NullPointerException,通常由程序错误引起,不需要显式捕获。错误比如OutOfMemoryError,属于严重问题,应用程序一般处理不了。 用户可能需要实际例子来理解这些概念。比如,检查型异常可以用文件读取的例子,运行异常可以用数组越界或空指针,错误可以用内存溢出的情况。此外,自定义异常的例子也很重要,说明如何扩展异常体系。 要注意用户可能不太清楚检查型和非检查型的区别,或者何使用哪种异常。需要明确说明它们的区别和适用场景。另外,用户可能对try-catch-finally块的使用有疑问,可以简要提到,但重点在异常体系结构。 还要注意结构清晰,可能用层次图或列表来展示。考虑到用户之前的问题结构,他们可能喜欢分点说明,每个部分有示例和说明。同,要提醒用户最佳实践,比如不要忽略异常,避免捕获Throwable等。 最后,总结对比不同异常类型,帮助用户一目了然。确保语言简洁,例子贴切实际开发场景,帮助他们理解如何在实际中应用这些异常处理机制。</think>Java异常体系通过继承关系组织,所有异常和错误都继承自`Throwable`类。以下是详细的分类说明及实际示例: --- ### **Java异常体系结构** ``` Throwable ├── Error(错误,不可恢复,程序一般无需处理) │ ├── OutOfMemoryError │ ├── StackOverflowError │ └── ... └── Exception(异常,程序应处理) ├── RuntimeException(运行异常,非检查型异常) │ ├── NullPointerException │ ├── IndexOutOfBoundsException │ └── ... └── 其他检查型异常(Checked Exception,必须处理) ├── IOException ├── SQLException └── ... ``` --- ### **1. 检查型异常(Checked Exception)** - **特点**:必须通过`try-catch`捕获或在方法签名中用`throws`声明,否则**编译不通过**。 - **典型场景**:外部资源操作(如文件、网络、数据库)。 - **示例**: ```java // 必须处理IOException public void readFile() throws IOException { FileReader reader = new FileReader("test.txt"); // ...其他操作 } // 或通过try-catch处理 public void readFileSafe() { try { FileReader reader = new FileReader("test.txt"); } catch (IOException e) { System.out.println("文件未找到"); } } ``` --- ### **2. 非检查型异常(Unchecked Exception)** #### **2.1 运行异常(RuntimeException)** - **特点**:由程序逻辑错误引发,**不强制处理**,但应通过代码优化避免。 - **典型场景**:空指针、数组越界、类型转换错误。 - **示例**: ```java // 空指针异常 String str = null; System.out.println(str.length()); // 抛出NullPointerException // 数组越界 int[] arr = {1, 2, 3}; System.out.println(arr[5]); // 抛出ArrayIndexOutOfBoundsException ``` #### **2.2 错误(Error)** - **特点**:表示严重问题(如系统资源耗尽),**程序无法恢复**,通常无需处理。 - **示例**: ```java // 模拟内存溢出错误 public void triggerOOM() { List<byte[]> list = new ArrayList<>(); while (true) { list.add(new byte[1024 * 1024]); // 最终抛出OutOfMemoryError } } ``` --- ### **3. 自定义异常** - **用途**:扩展异常体系以满足业务需求。 - **示例**: ```java // 继承Exception定义检查型异常 class InvalidInputException extends Exception { public InvalidInputException(String message) { super(message); } } // 继承RuntimeException定义非检查型异常 class BusinessException extends RuntimeException { public BusinessException(String message) { super(message); } } // 使用示例 public void validate(int value) throws InvalidInputException { if (value < 0) { throw new InvalidInputException("输入不能为负数"); } } ``` --- ### **异常处理最佳实践** 1. **区分异常类型**: - 检查型异常:明确声明或处理(如文件操作)。 - 运行异常:通过代码逻辑避免(如判空、校验参数)。 - 错误:通常无需处理,也无法恢复。 2. **避免滥用异常**: - 不要用异常控制流程(如用`try-catch`判断数字格式)。 - 优先使用条件判断替代异常捕获: ```java // 不推荐 try { Integer.parseInt(input); } catch (NumberFormatException e) { // 处理非数字输入 } // 推荐:使用正则表达式预校验 if (input.matches("\\d+")) { Integer.parseInt(input); } ``` 3. **资源释放**: - 使用`try-with-resources`自动关闭资源(Java 7+): ```java try (FileReader reader = new FileReader("test.txt")) { // 自动关闭reader } catch (IOException e) { e.printStackTrace(); } ``` --- ### **总结对比** | 类型 | 是否强制处理 | 典型场景 | 示例 | |--------------------|--------------|------------------------------|---------------------| | **检查型异常** | 是 | 外部资源操作 | `IOException` | | **运行异常** | 否 | 程序逻辑错误 | `NullPointerException` | | **错误(Error)** | 否 | 系统级严重问题 | `OutOfMemoryError` | | **自定义异常** | 视父类而定 | 业务规则校验、扩展异常语义 | `InvalidInputException` | --- 通过合理使用异常体系,可以增强代码的健壮性和可维护性。核心原则是:**明确异常责任,避免吞没异常,优先预防而非捕获**。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值