首页 > 编程语言 >Java从萌新小白到顶级大牛(4更新中)

Java从萌新小白到顶级大牛(4更新中)

时间:2024-04-01 12:58:05浏览次数:26  
标签:新小白 Java String public 从萌 null 异常 NullPointerException BaseException

自定义异常

Java标准库定义的常用异常包括:

Exception
│
├─ RuntimeException
│  │
│  ├─ NullPointerException
│  │
│  ├─ IndexOutOfBoundsException
│  │
│  ├─ SecurityException
│  │
│  └─ IllegalArgumentException
│     │
│     └─ NumberFormatException
│
├─ IOException
│  │
│  ├─ UnsupportedCharsetException
│  │
│  ├─ FileNotFoundException
│  │
│  └─ SocketException
│
├─ ParseException
│
├─ GeneralSecurityException
│
├─ SQLException
│
└─ TimeoutException

当我们在代码中需要抛出异常时,尽量使用JDK已定义的异常类型。例如,参数检查不合法,应该抛出IllegalArgumentException:

static void process1(int age) {

    if (age <= 0) {

        throw new IllegalArgumentException();

    }

}

在一个大型项目中,可以自定义新的异常类型,但是,保持一个合理的异常继承体系是非常重要的。

一个常见的做法是自定义一个BaseException作为“根异常”,然后,派生出各种业务类型的异常。

BaseException需要从一个适合的Exception派生,通常建议从RuntimeException派生:

public class BaseException extends RuntimeException {

}

其他业务类型的异常就可以从BaseException派生:

public class UserNotFoundException extends BaseException {

}

public class LoginFailedException extends BaseException {

}



...

自定义的BaseException应该提供多个构造方法:

public class BaseException extends RuntimeException {

    public BaseException() {

        super();

    }



    public BaseException(String message, Throwable cause) {

        super(message, cause);

    }



    public BaseException(String message) {

        super(message);

    }



    public BaseException(Throwable cause) {

        super(cause);

    }

}

上述构造方法实际上都是原样照抄RuntimeException。这样,抛出异常的时候,就可以选择合适的构造方法。通过IDE可以根据父类快速生成子类的构造方法。

小结

抛出异常时,尽量复用JDK已定义的异常类型;

自定义异常体系时,推荐从RuntimeException派生“根异常”,再派生出业务异常;

自定义异常时,应该提供多种构造方法。

NullPointerException

在所有的RuntimeException异常中,Java程序员最熟悉的恐怕就是NullPointerException了。

NullPointerException即空指针异常,俗称NPE。如果一个对象为null,调用其方法或访问其字段就会产生NullPointerException,这个异常通常是由JVM抛出的,例如:

// NullPointerException



public class Main {

    public static void main(String[] args) {

        String s = null;

        System.out.println(s.toLowerCase());

    }

}

指针这个概念实际上源自C语言,Java语言中并无指针。我们定义的变量实际上是引用,Null Pointer更确切地说是Null Reference,不过两者区别不大。

处理NullPointerException

如果遇到NullPointerException,我们应该如何处理?首先,必须明确,NullPointerException是一种代码逻辑错误,遇到NullPointerException,遵循原则是早暴露,早修复,严禁使用catch来隐藏这种编码错误:

// 错误示例: 捕获NullPointerExceptiontry {

    transferMoney(from, to, amount);

} catch (NullPointerException e) {

}

好的编码习惯可以极大地降低NullPointerException的产生,例如:

成员变量在定义时初始化:

public class Person {

    private String name = "";

}

使用空字符串""而不是默认的null可避免很多NullPointerException,编写业务逻辑时,用空字符串""表示未填写比null安全得多。

返回空字符串""、空数组而不是null:

public String[] readLinesFromFile(String file) {

    if (getFileSize(file) == 0) {

        // 返回空数组而不是null:

        return new String[0];

    }

    ...

}

这样可以使得调用方无需检查结果是否为null。

如果调用方一定要根据null判断,比如返回null表示文件不存在,那么考虑返回Optional<T>:

public Optional<String> readFromFile(String file) {

    if (!fileExist(file)) {

        return Optional.empty();

    }

    ...

}

这样调用方必须通过Optional.isPresent()判断是否有结果。

定位NullPointerException

如果产生了NullPointerException,例如,调用a.b.c.x()时产生了NullPointerException,原因可能是:

  • a是null;
  • a.b是null;
  • a.b.c是null;

确定到底是哪个对象是null以前只能打印这样的日志:

System.out.println(a);

System.out.println(a.b);

System.out.println(a.b.c);

从Java 14开始,如果产生了NullPointerException,JVM可以给出详细的信息告诉我们null对象到底是谁。我们来看例子:

public class Main {

    public static void main(String[] args) {

        Person p = new Person();

        System.out.println(p.address.city.toLowerCase());

    }

}



class Person {

    String[] name = new String[2];

    Address address = new Address();

}



class Address {

    String city;

    String street;

    String zipcode;

}

可以在NullPointerException的详细信息中看到类似... because "<local1>.address.city" is null,意思是city字段为null,这样我们就能快速定位问题所在。

这种增强的NullPointerException详细信息是Java 14新增的功能,但默认是关闭的,我们可以给JVM添加一个-XX:+ShowCodeDetailsInExceptionMessages参数启用它:

java -XX:+ShowCodeDetailsInExceptionMessages Main.java

小结

NullPointerException是Java代码常见的逻辑错误,应当早暴露,早修复;

可以启用Java 14的增强异常信息来查看NullPointerException的详细错误信息。

标签:新小白,Java,String,public,从萌,null,异常,NullPointerException,BaseException
From: https://blog.csdn.net/2301_76141427/article/details/137228494

相关文章

  • JavaWeb学习笔记——第十一天
    SpringBootWeb案例(二)新增员工实现EmpController:@PostMappingpublicResultadd(@RequestBodyEmpemp){log.info("新增员工:{}",emp);empService.add(emp);returnResult.success();}EmpService:voidadd(Empemp);EmpServiceImpl:@Overri......
  • 系统学习Java:构建坚实的编程基础
    Java是一种广泛使用的编程语言,以其跨平台性、强大的生态系统和稳健的性能而受到开发者的青睐。无论你是编程新手还是希望转战Java的经验丰富的开发者,系统学习Java都需要一个明确的学习路径。本文将为你提供一个全面的指南,帮助你从多个关键方面入手,构建坚实的Java编程基础。......
  • java中展开树集合
    /***java中展开树集合**@paramchildrenKey子集key*@paramtreeData树数据*@paramresult集合数据*@param<T>List*/publicstatic<T>List<T>treeToList(StringchildrenKey,List<T>treeData,List<T>result){for......
  • Java毕业设计-基于springboot开发的致远汽车租赁系统平台-毕业论文+答辩PPT(附源代码+
    文章目录前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构三、系统实现展示1、系统功能模块2、管理员功能模块3、业务员功能模块3、用户功能模块四、毕设内容和源代码获取总结Java毕业设计-基于springboot开发的致远汽车租......
  • Java毕业设计-基于springboot开发的智慧外贸平台-毕业论文+答辩PPT(附源代码+演示视频)
    文章目录前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构三、系统实现展示1、系统功能模块2、后台功能模块2.1管理员功能2.2买家功能2.3商家功能四、毕设内容和源代码获取总结Java毕业设计-基于springboot开发的智慧外贸......
  • 深入解析Java中的核心数据结构:从基础到进阶实战
    在软件开发领域,熟悉并掌握数据结构对于提升程序性能和优化算法至关重要。本文将全面介绍Java中常用的核心数据结构,辅以示例代码和概念图解,以帮助读者更好地理解和应用这些数据结构。1.数组(Array)数组是Java中最基础的数据结构之一,它是在内存中一块连续区域存放相同类型元......
  • 【JavaEE】计算机是如何工作的
    文章目录一、计算机发展史二、冯诺依曼体系(VonNeumannArchitecture)三、CPU基本工作流程一、计算机发展史计算的需求在人类的历史中是广泛存在的,发展大体经历了从一般计算工具到机械计算机到目前的电子计算机的发展历程。二、冯诺依曼体系(VonNeumannArchitectur......
  • Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field p
    完整日志:Causedby:java.lang.reflect.InaccessibleObjectException:Unabletomakefieldprivatefinaljava.lang.Classjava.lang.invoke.SerializedLambda.capturingClassaccessible:modulejava.basedoesnot"opensjava.lang.invoke"tounnamedmodule......
  • 【Redis】快速入门 数据类型 常用指令 在Java中操作Redis
    文章目录一、简介二、特点三、下载与安装四、使用4.1服务器启动4.2客户端连接命令4.3修改Redis配置文件4.4客户端图形化界面五、数据类型5.1五种常用数据类型介绍5.2各种数据类型特点六、常用命令6.1字符串操作命令6.2哈希操作命令6.3列表操作命令6.4集合操......
  • 这 Java 程序员简历一看就是包装的。。
    大家好,我是R哥。最近做Java面试辅导,看了许多小伙伴的简历,有的人的简历一看就知道是包装的,比如这位,他自己都承认了:包装过的简历,作为多年面试官,我一眼就能看出来,相信其他面试官也会有同样的感觉,这也是为什么很多人的简历都是已读不回的状态。下面我简单说说包装的简历的特点。......