Java 异常处理与正则表达式详解,实例演练及最佳实践

Java 异常 - Try...Catch

在 Java 代码执行期间,可能会发生各种错误,包括程序员编码错误、用户输入错误以及其他不可预料的状况。

当错误发生时,Java 通常会停止并生成错误消息,这个过程称为抛出异常。

try...catch 语句

try 语句允许您定义一段代码块,并在其中测试是否发生错误。

catch 语句允许您定义一段代码块,当 try 块中发生错误时执行该代码块。

try 和 catch 关键字成对使用,语法如下:

java 复制代码
try {
  // 要尝试的代码块
} catch (Exception e) {
  // 处理错误的代码块
}

示例:

java 复制代码
public class Main {
  public static void main(String[] args) {
    try {
      int[] myNumbers = {1, 2, 3};
      System.out.println(myNumbers[10]); // 数组越界错误
    } catch (Exception e) {
      System.out.println("Something went wrong.");
    }
  }
}

输出:

java 复制代码
Something went wrong.

finally 语句

finally 语句允许您在 try...catch 语句之后执行一段代码,无论 try 块中是否发生错误。

示例:

java 复制代码
public class Main {
  public static void main(String[] args) {
    try {
      int[] myNumbers = {1, 2, 3};
      System.out.println(myNumbers[10]); // 数组越界错误
    } catch (Exception e) {
      System.out.println("Something went wrong.");
    } finally {
      System.out.println("The 'try catch' is finished.");
    }
  }
}

输出:

java 复制代码
Something went wrong.
The 'try catch' is finished.

throw 关键字

throw 关键字允许您创建自定义异常。

throw 关键字通常与异常类型一起使用。Java 中提供了许多异常类型,例如:

  • ArithmeticException
  • FileNotFoundException
  • ArrayIndexOutOfBoundsException
  • SecurityException

示例:

java 复制代码
public class Main {
  static void checkAge(int age) {
    if (age < 18) {
      throw new ArithmeticException("Access denied - You must be at least 18 years old.");
    } else {
      System.out.println("Access granted - You are old enough!");
    }
  }

  public static void main(String[] args) {
    checkAge(15); // 年龄小于 18 岁
  }
}

输出:

java 复制代码
Exception in thread "main" java.lang.ArithmeticException: Access denied - You must be at least 18 years old.
  at Main.checkAge(Main.java:4)
  at Main.main(Main.java:12)
  • try...catch 语句用于处理 Java 代码中的异常。
  • finally 语句用于确保代码在任何情况下都会执行。
  • throw 关键字用于创建自定义异常。

建议:

  • 使用 try...catch 语句来处理可能发生的错误。
  • 使用 finally 语句来释放资源或执行清理操作。
  • 仅在需要时使用 throw 关键字来创建自定义异常。

Java正则表达式

什么是正则表达式?

正则表达式是一系列字符,形成一个搜索模式。当你在文本中搜索数据时,可以使用这个搜索模式描述你要查找的内容。

正则表达式可以是单个字符,也可以是更复杂的模式。

Java没有内置的正则表达式类,但我们可以导入java.util.regex包来使用正则表达式。该包包括以下类:

  • Pattern类 - 定义要在搜索中使用的模式
  • Matcher类 - 用于搜索模式
  • PatternSyntaxException类 - 指示正则表达式模式中的语法错误

示例

查找句子中是否存在单词"hello"的任何出现:

java 复制代码
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
  public static void main(String[] args) {
    Pattern pattern = Pattern.compile("hello", Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher("Visit hello!");
    boolean matchFound = matcher.find();
    if(matchFound) {
      System.out.println("匹配找到");
    } else {
      System.out.println("未找到匹配");
    }
  }
}

输出:

java 复制代码
匹配找到

示例解释

在这个例子中,在句子中搜索单词"hello"。

  • 首先,使用Pattern.compile()方法创建模式。第一个参数指示正在搜索的模式,第二个参数有一个标志,表示搜索应该是不区分大小写的。第二个参数是可选的。
  • 使用matcher()方法在字符串中搜索模式。它返回一个包含有关所执行搜索的信息的Matcher对象。
  • find()方法在字符串中找到模式时返回true,未找到时返回false。

标志

compile()方法中的标志更改搜索的执行方式。以下是其中一些:

  • Pattern.CASE_INSENSITIVE - 在执行搜索时将忽略字母的大小写。
  • Pattern.LITERAL - 在执行搜索时,模式中的特殊字符将不具有任何特殊含义,并且在执行搜索时将被视为普通字符。
  • Pattern.UNICODE_CASE - 与CASE_INSENSITIVE标志一起使用,还可以忽略英语字母以外的字母的大小写。

正则表达式模式

Pattern.compile()方法的第一个参数是模式。它描述了正在搜索的内容。

  • 方括号用于查找一系列字符:

    表达式 描述
    [abc] 在方括号之间的选项中找到一个字符
    [^abc] 在方括号之间找到一个字符,但不是这些字符
    [0-9] 在范围0到9之间找到一个字符

元字符

元字符是具有特殊含义的字符:

元字符 描述
| 查找由|分隔的任何模式中的任何一个匹配项,例如:cat|dog|fish
. 查找任何字符的一个实例
. 在字符串的开头找到匹配项,例如:^Hello
$ 在字符串的末尾找到匹配项,例如:World$
\d 查找数字
\s 查找空白字符
\b 在单词的开头找到匹配项,如\bWORD,或在单词的结尾找到匹配项,如WORD\b
\uxxxx 查找由十六进制数xxxx指定的Unicode字符

量词

量词定义数量:

量词 描述
n+ 匹配包含至少一个n的任何字符串
n* 匹配包含零个或多个n的任何字符串
n? 匹配包含零个或一个n的任何字符串
n{x} 匹配包含X个n的任何字符串的序列
n{x,y} 匹配包含X到Y个n的任何字符串的序列
n{x,} 匹配包含至少X个n的任何字符串

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎 点赞、收藏、关注

相关推荐
风象南6 小时前
我把大脑开源给了AI
人工智能·后端
哈里谢顿9 小时前
1000台裸金属并发创建中的重难点问题分析
面试
哈里谢顿9 小时前
20260303面试总结(全栈)
面试
橙序员小站10 小时前
Agent Skill 是什么?一文讲透 Agent Skill 的设计与实现
前端·后端
怒放吧德德10 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆12 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
开心就好202513 小时前
UniApp开发应用多平台上架全流程:H5小程序iOS和Android
后端·ios
悟空码字14 小时前
告别“屎山代码”:AI 代码整洁器让老项目重获新生
后端·aigc·ai编程
小码哥_常14 小时前
大厂不宠@Transactional,背后藏着啥秘密?
后端
奋斗小强14 小时前
内存危机突围战:从原理辨析到线上实战,彻底搞懂 OOM 与内存泄漏
后端