当前位置: 首页 > news >正文

CSdiy java 06

1 介绍一下java里面的try catch捕获异常的办法

在 Java 里,try-catch是处理异常的重要手段,借助它能让程序在遭遇异常时保持稳定运行。下面为你详细介绍其用法:

1. 基础语法

java

try {// 可能会抛出异常的代码
} catch (ExceptionType1 e1) {// 处理ExceptionType1类型异常的代码
} catch (ExceptionType2 e2) {// 处理ExceptionType2类型异常的代码
} finally {// 不管是否发生异常,都会执行的代码(可选)
}

2. 执行流程

  • 程序先执行try块中的代码。
  • try块中的代码抛出异常,会立刻跳转到对应的catch块。
  • 当有多个catch块时,会从上到下进行匹配,一旦匹配成功就不再继续匹配。
  • 无论是否发生异常,finally块(若存在)都会执行。

3. 异常类型

  • 检查型异常(Checked Exceptions):像IOException这类异常,必须在代码里显式地进行处理。
  • 非检查型异常(Unchecked Exceptions):例如RuntimeException及其子类,不强制要求进行处理。

4. 示例代码

下面是一个读取文件的示例,展示了try-catch-finally的用法:

java

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class TryCatchExample {public static void main(String[] args) {BufferedReader reader = null;try {// 可能会抛出FileNotFoundException的代码reader = new BufferedReader(new FileReader("example.txt"));String line;// 可能会抛出IOException的代码while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (java.io.FileNotFoundException e) {System.out.println("文件未找到: " + e.getMessage());} catch (IOException e) {System.out.println("读取文件时出错: " + e.getMessage());} finally {// 确保资源被关闭try {if (reader != null) {reader.close();}} catch (IOException e) {System.out.println("关闭文件时出错: " + e.getMessage());}}}
}

5. 多异常捕获

从 Java 7 开始,支持在一个catch块中捕获多种异常:

java

try {// 可能会抛出多种异常的代码
} catch (IOException | SQLException e) {// 处理IOException或SQLExceptione.printStackTrace();
}

6. try-with-resources 语句(Java 7 及以后版本)

对于实现了AutoCloseable接口的资源,可以使用这种更简洁安全的方式:

java

try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}
} catch (IOException e) {System.out.println("读取文件时出错: " + e.getMessage());
}

这种方式会自动关闭资源,无需编写finally块。

7. 自定义异常

你可以创建自己的异常类,继承自Exception(检查型异常)或者RuntimeException(非检查型异常):

java

class MyException extends Exception {public MyException(String message) {super(message);}
}// 使用自定义异常
public void myMethod() throws MyException {if (condition) {throw new MyException("这是一个自定义异常");}
}

总结

  • 要对可能出现异常的代码进行try包裹。
  • 针对不同类型的异常编写catch块。
  • 利用finally块释放资源。
  • 优先考虑使用try-with-resources语句来管理资源。
  • 捕获异常后,要进行日志记录或者采取其他恢复措施。

合理运用try-catch能增强程序的健壮性,有效避免因异常而导致程序崩溃。

2 有关异常,其实就是举了几个例子啦哈哈。

在 Java 中,异常(Exception)是程序运行时可能出现的错误或意外情况。Java 将异常组织成一个继承层次结构,其中Throwable是所有异常和错误的根类。下面详细解释你提到的异常类型及其含义:

1. IOException(输入 / 输出异常)

  • 含义:表示与输入 / 输出操作(如文件读写、网络通信)相关的错误。
  • 属于:检查型异常(Checked Exception),必须显式处理(通过try-catchthrows声明)。
  • 常见子类
    • FileNotFoundException:文件不存在时抛出。
    • EOFException:读取文件或流到达末尾时抛出。
    • SocketException:网络套接字操作失败(如连接断开)。
  • 示例场景

    java

    try {FileInputStream fis = new FileInputStream("nonexistent.txt"); // 文件不存在
    } catch (FileNotFoundException e) {e.printStackTrace();
    }
    

2. SQLException(数据库操作异常)

SQL(Structured Query Language) 是一种用于管理和操作关系型数据库的标准化编程语言。它允许用户创建、查询、更新和管理数据库中的数据,是数据库领域的核心技术之一。

  • 含义:表示执行 SQL 语句或数据库操作时的错误(如连接失败、查询语法错误)。
  • 属于:检查型异常,必须处理。
  • 常见原因
    • 数据库连接失败(如 URL(网址)、用户名、密码错误)。
    • SQL 语句语法错误。
    • 违反数据库约束(如唯一键冲突)。
  • 示例场景

    java

    try {Connection conn = DriverManager.getConnection(url, user, password); // 连接失败
    } catch (SQLException e) {e.printStackTrace();
    }
    

3. RuntimeException(运行时异常)

  • 含义:表示程序逻辑错误或不可预期的错误,通常由程序员错误导致。
  • 属于:非检查型异常(Unchecked Exception),不强制要求处理。
  • 常见子类
    • NullPointerException:访问空对象引用。
    • ArrayIndexOutOfBoundsException:数组越界。
    • ArithmeticException:算术运算错误(如除以零)。
  • 示例场景

    java

    String str = null;
    System.out.println(str.length()); // 抛出NullPointerException
    

4. Exception vs RuntimeException

  • Exception:所有异常的基类,包括检查型异常(如IOException)和非检查型异常(如RuntimeException)。
  • RuntimeException:非检查型异常的基类,通常由程序逻辑错误引起。

5. 自定义异常

  • 含义:开发者可继承ExceptionRuntimeException创建自定义异常。
  • 用途:处理特定业务场景的错误(如用户不存在、支付失败)。
  • 示例

    java

    public class UserNotFoundException extends Exception {public UserNotFoundException(String message) {super(message);}
    }
    

6. 异常处理原则

  1. 检查型异常(如IOExceptionSQLException):

    • 必须通过try-catch捕获处理。
    • 或在方法签名中使用throws声明,将异常抛给调用者。
  2. 非检查型异常(如RuntimeException):

    • 不强制处理,但建议在关键逻辑中添加防御性检查(如空值判断)。
  3. 异常链

    • 可使用initCause()或构造函数将原始异常包装到自定义异常中,保留完整错误信息。

总结

异常类型是否强制处理常见场景
IOException文件读写、网络通信
SQLException数据库操作
NullPointerException空对象引用
自定义异常(继承Exception业务逻辑错误(如用户不存在)

合理处理异常能提高程序的健壮性,避免因意外情况导致程序崩溃。对于检查型异常,建议优先使用try-with-resources语句自动关闭资源(如文件、数据库连接),减少资源泄漏风险。

3 throw声明是?边学边忘,多多回忆吧!!!

在 Java 中,throwthrows是两个与异常处理相关的关键字,但它们的用途不同。根据你的问题,我猜测你可能想了解以下两个概念:

1. throw 语句(抛出异常)

  • 作用:在方法内部手动抛出一个异常对象。
  • 语法

    java

    throw new ExceptionType("异常信息");
    

  • 使用场景:当程序遇到错误条件时,主动创建并抛出异常。
示例

java

public class Calculator {public static int divide(int dividend, int divisor) {if (divisor == 0) {// 手动抛出异常throw new ArithmeticException("除数不能为零");}return dividend / divisor;}
}
执行流程
  1. divisor为 0 时,throw语句会创建一个ArithmeticException对象并抛出。
  2. 当前方法的执行立即终止,控制权转移到最近的catch块(如果有)。
  3. 如果没有catch块,异常会向上传播到调用者。

2. throws 声明(异常声明)

  • 作用:在方法签名中声明该方法可能抛出的异常类型。
  • 语法

    java

    public void method() throws ExceptionType1, ExceptionType2 {// 方法体
    }
    
  • 使用场景:当方法内部可能抛出检查型异常(如IOException),但不想在当前方法处理时,使用throws将异常交给调用者处理。
示例

java

import java.io.FileReader;
import java.io.IOException;public class FileProcessor {public void readFile() throws IOException {FileReader reader = new FileReader("example.txt");// ... 读取文件内容}
}
调用者处理方式

java

public static void main(String[] args) {try {new FileProcessor().readFile();} catch (IOException e) {e.printStackTrace();}
}

3. throw vs throws 的区别

throwthrows
用于抛出异常对象。用于声明方法可能抛出的异常。
位于方法体内部。位于方法签名中。
后跟异常对象(如new Exception())。后跟异常类型(如IOException)。
一次只能抛出一个异常。可声明多个异常,用逗号分隔。

4. 自定义异常与throw

可以结合自定义异常使用throw

java

// 自定义异常类
class UserNotFoundException extends Exception {public UserNotFoundException(String message) {super(message);}
}// 在方法中抛出自定义异常
public User findUserById(int id) throws UserNotFoundException {User user = userRepository.findById(id);if (user == null) {throw new UserNotFoundException("用户ID不存在: " + id);}return user;
}

5. 注意事项

  1. 检查型异常(Checked Exception):必须通过throws声明或try-catch处理。

    java

    // 必须处理FileNotFoundException
    public void read() throws FileNotFoundException {FileReader reader = new FileReader("file.txt");
    }
    
  2. 非检查型异常(Unchecked Exception):如RuntimeException及其子类,不强制要求throws声明或try-catch

    java

    public void divide(int a, int b) {if (b == 0) {throw new IllegalArgumentException("除数不能为零"); // 非检查型异常}
    }
    
  3. 异常链:可使用initCause()方法包装原始异常,保留完整错误信息。

    java

    try {// ...
    } catch (SQLException e) {throw new RuntimeException("数据库操作失败", e); // 包装原始异常
    }
    

总结

  • throw:主动抛出异常,终止当前方法执行。
  • throws:声明方法可能抛出的异常,由调用者处理。
  • 合理使用throwthrows可以提高代码的健壮性和可维护性。

4 不同样式的数组声明有什么影响?

不同样式的数组声明有什么影响

在 Java 中,数组声明的样式(语法形式)可能影响代码的可读性、维护性以及与其他代码的兼容性。以下是几种常见的数组声明样式及其影响:

1. 声明语法对比

Java 支持两种主要的数组声明语法:

(1)推荐写法:类型 [] 变量名

java

int[] numbers;      // 推荐写法:清晰表明是数组类型
String[] names;
(2)C 风格写法:类型 变量名 [] 合法但是不推荐!!!

java

int numbers[];      // C风格写法:Java中合法但不推荐
String names[];

2. 两种写法的本质区别

  • 语法层面:两种写法完全等价,功能无差异。
  • 可读性
    • int[] numbers 更直观地表明numbers是一个整数数组类型。
    • int numbers[] 可能让初学者误解为 “numbers是一个整数,只是后面跟了个数组”。
示例对比

java

// 推荐写法:清晰表示多个变量都是数组
int[] a, b, c;      // a、b、c 都是 int[] 类型// C风格写法:可能引发误解
int a[], b, c;      // 只有a是数组,b和c是普通int

3. 多维数组声明

Java 的多维数组实际上是 “数组的数组”,声明时需注意维度的位置。

(1)推荐写法:类型 [][] 变量名

java

int[][] matrix;     // 二维数组(矩阵)
int[][][] cube;     // 三维数组
(2)C 风格写法

java

int matrix[][];     // 等价于 int[][] matrix
int cube[][][];     // 等价于 int[][][] cube
(3)不规则数组

Java 支持不规则多维数组(每行长度不同),声明时需注意初始化方式:

java

int[][] irregular = new int[3][];  // 3行,但每行长度未指定
irregular[0] = new int[2];         // 第0行长度为2
irregular[1] = new int[4];         // 第1行长度为4

4. 初始化时机的影响

数组声明与初始化可以分开,但需注意以下情况:

(1)声明时直接初始化

java

int[] numbers = {1, 2, 3};         // 静态初始化
String[] names = new String[3];    // 动态初始化(长度为3,元素默认null)
(2)声明后再初始化

java

int[] numbers;
numbers = new int[]{1, 2, 3};      // 必须使用new关键字,不能省略{}// 错误写法:编译错误
// numbers = {1, 2, 3};

5. 方法参数与返回值

在方法签名中,数组声明样式同样存在两种写法,但推荐使用类型[]

(1)参数声明

java

// 推荐写法
public void printArray(int[] arr) { ... }// 合法但不推荐
public void printArray(int arr[]) { ... }
(2)返回值声明

java

// 推荐写法
public int[] getArray() { ... }// 合法但不推荐
public int getArray()[] { ... }    // 语法合法但易混淆

6. 与泛型的兼容性

Java 泛型数组的创建需谨慎,因类型擦除机制,无法直接创建泛型数组。

错误示例

java

List<String>[] listArray = new List<String>[5];  // 编译错误
正确方式

java

List<String>[] listArray = new List[5];          // 创建原始类型数组
listArray[0] = new ArrayList<>();
listArray[0].add("hello");

7. 最佳实践========================================================

  1. 优先使用类型[] 变量名:提高代码可读性,避免混淆。
  2. //避免在方法参数中使用 C 风格:如void method(int arr[])
  3. 明确初始化数组长度:避免NullPointerException
  4. 多维数组使用[][]:如int[][] matrix
  5. 泛型数组使用原始类型:如List[] listArray,并在使用时强制类型转换。

总结

声明样式推荐场景注意事项
int[] numbers所有场景标准 Java 风格,提高可读性
int numbers[]兼容 C 代码不推荐新代码使用
int[][] matrix多维数组清晰表示数组维度
泛型数组使用原始类型 + 强制转换避免直接创建泛型数组实例

合理选择数组声明样式可以使代码更易读、易维护,并减少潜在的错误。

相关文章:

  • 西门子笔记四:Uart模块
  • 异步机制与 CPU 的关系解析
  • C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 15)
  • 当 AI 成为 “数字新物种”:人类职业的重构与进化
  • 角度(degrees)和弧度(radians)转换关系
  • Glide 如何加载远程 Base64 图片
  • 链表反转操作经典问题详解
  • 关于 const a 定义的数据 与 其渲染 的问题。即通过const定义的常量,会不会导致渲染不及时。
  • 原语的使用
  • 归并排序排序总结
  • 创建RAID1并扩容RAID
  • 使用C# ASP.NET创建一个可以由服务端推送信息至客户端的WEB应用(1)
  • Redis分布式锁使用以及对接支付宝,paypal,strip跨境支付
  • Qwen3-8B安装与体验-速度很快!
  • 国内无法访问GitHub官网的问题解决
  • 碰到的 MRCPv2 串线以及解决思路
  • C语言Makefile编写与使用指南
  • centos7 安装python3
  • IIC小记
  • Wi-SUN与LoRa和NB-IoT通信技术的对比
  • 体重管理门诊来了,瘦不下来的我们有救了?|健康有方FM
  • 中国海油总裁:低油价短期影响利润,但也催生资产并购机会
  • 海量数据处于“原矿”状态,数据价值释放如何破局?
  • 美国参议院投票通过戴维·珀杜出任美国驻华大使
  • 深入贯彻中央八项规定精神学习教育中央指导组派驻地方和单位名单公布
  • 烟花、美食和购物优惠都安排上了,上海多区开启热闹模式