NullPointerException 的几种类型

NullPointerException是运行时异常,在java编译期间不进行捕获。简单来说,空指针异常就是,java中的引用没有指向实际存在的对象,此时调用对象的方法或属性当然会抛异常。有以下几种常见情况:


常见的代码错误有如下几种:(1)第一种还比较明显,很快能检查出来 

class Point {
    public int x;
     public int getX() { 
        return x;
    }
}
 
public class test1 {
	//static Point p1 = new Point();    //改成这样就正确
	static Point p1;

	public static void main(String args[]){
        p1.getX();    //NullPointerException    
        p1.x = 7;      //NullPointerException 
    }
}


(2)第二种相对比较隐晦,但是知道了NullPointerException的原理后,还是很容易debug:
           此处如果request.getParameter("age")的结果为null,这里就也会产生这种异常。

String age =request.getParameter("age");

if(age.length()==0){

    ......

}else{

   ......
   
}

(3)这里再说一个不太好看出来的错误,先看错误信息:

type Exception report

message

description The server encountered an internal error that prevented it from fulfilling this request.

exception

java.lang.NullPointerException
	RegisterServlet.isValidUsername(RegisterServlet.java:57)
	RegisterServlet.doPost(RegisterServlet.java:25)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/8.0.21 logs.

对应的源代码是:

	public boolean isValidUsername(String username){
		  User user = User.getInstance();
		  Map<String, String> map = user.getUserMap();
		  if(username != null && !map.get(username).equals("")){      //注意这行
			  return true;
		  }else{
			  return false;							
		  }
	}

map.get(username)有可能是个空值,这里拿来equals(""),当然也会报NullPointerException异常。这里其实跟第二种情况很像,知道错误的原因就能很快排除这类错误。当然,最重要的还是,良好的写代码习惯。



出现这种问题的时候,记得捕捉下这个异常,try catch, throw, throws 等等方法都可以!










<think>好的,我现在需要回答用户关于异常类型的问题。用户之前问过接口方法重写的问题,现在转向异常的分类。首先,我要确保理解用户的需求,可能他正在学习Java异常处理,需要明确异常的分类及其特点。 首先,我需要回忆Java异常的分类。通常,异常分为检查型异常(checked exceptions)、非检查型异常(unchecked exceptions,包括运行时异常和错误)。检查型异常需要在代码中显式处理,否则编译不通过;而非检查型异常不需要强制处理,通常由程序逻辑错误或系统错误引起。 接下来,我需要确定如何组织这些信息,使其结构清晰。用户之前的回答使用了分点说明,可能这次也适合类似的格式。需要分大类,然后每个类别下细分,并给出例子,帮助用户理解。 检查型异常的例子如IOException、SQLException,这些通常在文件操作或数据库连接时出现。运行时异常如NullPointerException、ArrayIndexOutOfBoundsException,属于程序逻辑错误。错误如OutOfMemoryError,属于严重问题,应用程序通常无法处理。 另外,可能需要提到Java的异常继承结构:Throwable是根类,分为Error和ExceptionException又分为RuntimeException(非检查)和其他Exception(检查型)。这点对理解分类有帮助,应该包括进去。 用户可能还想知道如何处理这些异常,比如检查型必须用try-catch或throws,而非检查型通常不强制。此外,自定义异常的分类,用户可能也需要了解,可以简要提及。 需要确保语言准确,例子贴切,避免错误。例如,NullPointerException是运行时异常,属于非检查型,而IOException是检查型。同时,注意术语的正确性,如“检查型”和“非检查型”是否官方翻译,可能需要确认,但通常中文资料使用这些术语。 还要考虑用户可能的疑问,比如为什么会有这样的分类,或者如何处理不同类型的异常。但用户的问题是“有哪几种”,所以重点在分类和特点,不需要深入处理方式,除非简要提及。 最后,总结部分可以用表格对比,如用户之前的回答,这样结构清晰,便于比较。确保回答符合用户之前给出的系统级指令:使用中文,数学表达式正确,结构清晰,分点说明,可能的话用示例代码块。</think>### 异常的分类(以Java为例) 在编程中,异常(Exception)是程序运行时的非正常状态。根据处理方式和严重程度,异常主要分为以下三类: --- #### 1. **检查型异常(Checked Exceptions)** - **特点**: - 必须在代码中显式处理(捕获或声明抛出),否则编译失败。 - 通常由外部不可控因素引发(如文件不存在、网络中断)。 - **常见类型**: - `IOException`(文件读写失败) - `SQLException`(数据库操作错误) - `ClassNotFoundException`(类未找到) - **示例代码**: ```java try { FileReader file = new FileReader("test.txt"); // 可能抛出FileNotFoundException } catch (IOException e) { e.printStackTrace(); } ``` --- #### 2. **运行时异常(Runtime Exceptions,非检查型异常)** - **特点**: - 无需强制处理,通常由程序逻辑错误导致。 - 继承自 `RuntimeException`。 - **常见类型**: - `NullPointerException`(空指针访问) - `ArrayIndexOutOfBoundsException`(数组越界) - `ArithmeticException`(算术错误,如除以零) - **示例代码**: ```java int[] arr = {1, 2, 3}; System.out.println(arr[5]); // 抛出ArrayIndexOutOfBoundsException ``` --- #### 3. **错误(Errors,非检查型异常)** - **特点**: - 表示严重系统级问题,程序通常无法恢复。 - 继承自 `Error`,无需捕获。 - **常见类型**: - `OutOfMemoryError`(内存耗尽) - `StackOverflowError`(栈溢出) - **示例场景**: ```java void recursiveCall() { recursiveCall(); // 无限递归导致StackOverflowError } ``` --- ### 异常继承关系 ``` Throwable(所有异常和错误的根类) ├── Error(错误) │ ├── OutOfMemoryError │ └── StackOverflowError └── Exception(异常) ├── IOException(检查型异常) └── RuntimeException(运行时异常) ├── NullPointerException └── ArrayIndexOutOfBoundsException ``` --- ### 对比总结 | **类型** | **是否强制处理** | **来源** | **典型场景** | |------------------|------------------|------------------------|----------------------------| | 检查型异常 | 是 | 外部环境问题 | 文件不存在、网络中断 | | 运行时异常 | 否 | 程序逻辑错误 | 空指针、数组越界 | | 错误(Error) | 否 | JVM或系统资源严重问题 | 内存溢出、栈溢出 | --- ### 扩展:自定义异常 - 可通过继承 `Exception`(检查型)或 `RuntimeException`(非检查型)创建自定义异常。 ```java class MyCheckedException extends Exception { /* ... */ } // 检查型异常 class MyRuntimeException extends RuntimeException { /* ... */ } // 非检查型异常 ``` --- 通过分类处理异常,可以提升程序的健壮性: - **检查型异常**强制开发者预判外部风险; - **运行时异常**提醒修复代码逻辑缺陷; - **错误**通常需要终止程序并排查系统环境问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值