JavaSE入门学习:Java异常之自定义异常与异常处理机制笔记

# Java SE入门基础

Java SE作为Java编程的基础,涵盖了许多重要的入门概念,对于初学者来说,扎实掌握这些基础是迈向成功的关键一步。

## 基本语法结构
Java的基本语法结构包括类、方法、语句等。一个Java程序通常由一个或多个类组成,类是Java程序的基本构建块。例如:
```java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
```
在这个例子中,`HelloWorld`是类名,`main`方法是程序的入口点。`public`表示该类是公开的,`static`表示该方法是静态的,可以直接通过类名调用,`void`表示该方法不返回值。

## 数据类型
Java中有多种数据类型,主要分为基本数据类型和引用数据类型。
1. **基本数据类型**
- **整型**:如`byte`(占1个字节,取值范围-128到127)、`short`(占2个字节)、`int`(占4个字节,常用)、`long`(占8个字节,后缀为`L`或`l`)。整型用于表示整数数值。
- **浮点型**:`float`(占4个字节,后缀为`F`或`f`)、`double`(占8个字节,常用)。浮点型用于表示小数数值。
- **字符型**:`char`(占2个字节),用于表示单个字符,例如`'A'`。
- **布尔型**:`boolean`(占1位,只有`true`和`false`两个值),用于逻辑判断。
2. **引用数据类型**:如类、接口、数组等。引用数据类型指向对象在内存中的地址。

## 变量
变量是存储数据的容器。在Java中,变量必须先声明后使用。声明变量的语法为:
```java
数据类型 变量名;
```
例如:
```java
int age;
```
变量声明后,需要进行初始化才能使用,初始化的语法为:
```java
数据类型 变量名 = 值;
```
例如:
```java
int age = 25;
```
在选择数据类型时,要根据实际需求来决定。如果需要存储整数且范围不大,可选择`byte`或`short`;如果需要表示小数,通常选择`double`;如果是单个字符,使用`char`;逻辑判断则用`boolean`。

总之,Java SE入门基础的这些概念是编写Java程序的基石,只有深入理解并熟练运用,才能逐步掌握Java编程的技巧,开启Java开发的大门。

# Java异常处理机制

Java异常处理机制是Java语言中一项重要的特性,它能够帮助程序员更好地管理程序运行过程中可能出现的错误情况,提高程序的稳定性和健壮性。

## 异常的分类
在Java中,异常主要分为两大类:Checked异常和Unchecked异常。

Checked异常:这类异常在编译阶段就必须进行处理,否则编译器会报错。例如IOException,当我们进行文件读取操作时,如果文件不存在或者权限不足等情况,就会抛出IOException。

Unchecked异常:这类异常在编译阶段不会强制要求处理,通常是由于程序逻辑错误导致的。比如NullPointerException(空指针异常),当我们尝试访问一个null对象的方法或属性时就会抛出该异常;还有ArrayIndexOutOfBoundsException(数组越界异常),当我们访问数组中不存在的索引时会出现这种情况。

## 捕获和处理异常的方式
Java通过try-catch-finally语句块来捕获和处理异常。

try块:在try块中放置可能会抛出异常的代码。例如:
```java
try {
int[] arr = new int[5];
int value = arr[6]; // 这里会抛出数组越界异常
}
```

catch块:用于捕获try块中抛出的异常,并进行相应的处理。
```java
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("捕获到数组越界异常:" + e.getMessage());
}
```

finally块:无论try块中是否抛出异常,finally块中的代码都会执行。
```java
finally {
System.out.println("finally块中的代码总会执行");
}
```

## 执行流程
当程序执行到try块中的代码时,如果发生异常,程序会立即跳转到对应的catch块中进行处理,处理完catch块后,如果有finally块,会执行finally块中的代码。

## 选择合适的异常处理方式
对于Checked异常,通常需要在方法签名中声明抛出该异常,或者在方法内部进行捕获和处理。而对于Unchecked异常,一般根据具体情况来决定是否捕获处理,如果是业务逻辑相关的异常,可以捕获处理并给出相应提示;如果是代码逻辑错误导致的异常,应该及时修复代码。

通过合理运用Java异常处理机制,我们能够让程序更加健壮,更好地应对各种可能出现的错误情况。

《Java自定义异常》

在Java编程中,虽然系统提供了丰富的内置异常类,但在实际项目开发中,有时需要根据特定的业务需求自定义异常。

为什么要自定义异常呢?主要原因在于内置异常类往往不能精准地表达业务逻辑中的错误情况。例如,在一个图书管理系统中,当用户尝试借阅超出其借阅权限数量的图书时,使用内置异常无法清晰地传达这一特定业务错误。通过自定义异常,可以更明确地标识和处理这类特定业务逻辑错误,增强代码的可读性和维护性。

自定义异常类的定义步骤如下:
首先,要继承合适的父类。通常继承自`Exception`类,如果需要处理运行时异常,也可继承`RuntimeException`类。比如,定义一个`BookBorrowLimitException`类来处理图书借阅数量超出限制的异常,它可以继承`Exception`类。
其次,编写构造方法。构造方法用于传递异常信息,通常调用父类的构造方法来实现。例如:
```java
public class BookBorrowLimitException extends Exception {
public BookBorrowLimitException(String message) {
super(message);
}
}
```
在实际项目中,自定义异常有着广泛的应用场景和显著优势。以图书管理系统为例,当用户借阅图书时,业务逻辑可以这样实现:
```java
public class LibraryService {
public void borrowBook(User user, Book book, int num) throws BookBorrowLimitException {
if (num > user.getBorrowLimit()) {
throw new BookBorrowLimitException("借阅数量超出权限");
}
// 执行借阅操作
}
}
```
在调用该方法的地方,通过`try-catch`块捕获自定义异常:
```java
try {
LibraryService service = new LibraryService();
service.borrowBook(user, book, 10);
} catch (BookBorrowLimitException e) {
System.out.println("借阅失败:" + e.getMessage());
}
```
这样,通过自定义异常,能够更清晰地处理特定业务逻辑错误,使代码逻辑更加清晰,易于理解和维护,在团队协作开发的大型项目中优势尤为明显。
share