day25/RegexDemo.java

本文介绍如何使用正则表达式来检查QQ号码是否合法,包括验证其位数、开头数字及数字范围。
/*
正则表达式:符合一定规则的表达式。
	作用:用于专门操作字符串。

*/

//对QQ号码进行检验。
//要求 5-15位、不能以0开头、只能是0-9的数字

class RegexDemo 
{
	public static void main(String[] args) 
	{
		//checkQQ();
		checkQQRegex();
	}

	public static void checkQQRegex()
	{
		String qq = "11344";
		String regex = "[1-9][0-9]{4,14}";
		boolean b = qq.matches(regex);	
		if(b)
			System.out.println("qq:"+qq);
		else
			System.out.println("非法哟!");
	}

	//用字符串里面的方法组合完成判断,较为烦琐
	public static void checkQQ()
	{
		String qq = "12345";

		if(qq.length()>=5 && qq.length()<=15)
		{
			if(!(qq.startsWith("0")))
			{
				char[] ch = qq.toCharArray();
				boolean flag = true;
				for(int x=0;x<ch.length;x++)
				{
					if(!(ch[x]>='0' && ch[x]<='9'))
					{
						flag=false;
						break;
					}
				}
				if(flag)
				{
					System.out.println("qq:"+qq);
				}
				else
				{
					System.out.println("出现非法字符");
				}
			}
			else
			{
				System.out.println("不能以0开头");
			}

		}
		else
		{
			System.out.println("长度错误");
		}
	}
}

发生了这样的错误org.junit.platform.commons.PreconditionViolationException: Classpath resource [/com/main/nextDay.csv] does not exist at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:215) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1709) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:636) at java.base/java.util.stream.ReferencePipeline$7$1FlatMap.accept(ReferencePipeline.java:294) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:215) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:215) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:215) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1709) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:636) at java.base/java.util.stream.ReferencePipeline$7$1FlatMap.accept(ReferencePipeline.java:294) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1709) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:636) at java.base/java.util.ArrayList.forEach(ArrayList.java:1597) at java.base/java.util.ArrayList.forEach(ArrayList.java:1597) Suppressed: org.junit.platform.commons.PreconditionViolationException: Configuration error: You must configure at least one set of arguments for this @ParameterizedTest at java.base/java.util.stream.AbstractPipeline.close(AbstractPipeline.java:355) at java.base/java.util.stream.ReferencePipeline$7$1FlatMap.accept(ReferencePipeline.java:289) ... 9 more
03-24
<think>好的,用户遇到了一个JUnit的异常,具体是PreconditionViolationException,提示找不到/com/main/nextDay.csv这个资源文件。同时还有一个关于@ParameterizedTest配置错误的提示。我需要帮他们分析可能的原因和解决办法。 首先,用户提供的异常信息中有两个关键点:一是类路径资源不存在,另一个是参数化测试未配置参数。这两个问题可能相关,也可能独立存在。我应该分别分析这两个问题,然后给出解决步骤。 对于类路径资源找不到的问题,可能的原因有几个。首先,文件可能没有正确放置在项目的资源目录下。比如,在Maven项目中,资源文件通常放在src/main/resources,然后编译后会被复制到target/classes或build/classes。用户需要确认文件是否在正确的目录中,并且路径是否正确。比如,如果文件放在src/main/resources/com/main/nextDay.csv,那么使用/com/main/nextDay.csv应该能访问到。另外,文件可能没有被构建工具正确打包,需要检查构建配置,比如Maven的pom.xml是否排除了CSV文件,或者在Gradle中是否正确配置了资源目录。 其次,代码中加载资源的方式是否正确。用户可能使用了错误的类加载器,或者路径前加了斜杠导致问题。需要检查代码中的资源加载部分,比如是否使用Class.getResourceAsStream(),路径是否正确。例如,如果路径是绝对路径(以/开头),那么应该从类路径的根目录开始查找;如果是相对路径,则是相对于当前类所在的包。 然后是参数化测试配置的问题。用户可能在测试方法上使用了@ParameterizedTest,但没有提供参数源,比如@ValueSource、@CsvFileSource等。需要检查测试方法是否缺少这些注解,或者注解中的路径是否正确。例如,如果用了@CsvFileSource(resources = "/com/main/nextDay.csv"),但该文件不存在,就会导致参数源无法加载,进而触发配置错误。 可能这两个问题是相关联的。比如,参数化测试试图从nextDay.csv读取数据作为参数,但由于文件未正确放置,导致无法加载,从而既触发资源不存在异常,又因为参数源为空,导致参数化测试配置错误。所以解决资源文件的问题可能同时解决这两个异常。 接下来,我需要给出逐步的解决步骤。第一步,确认资源文件的位置和构建输出。第二步,检查资源加载的代码是否正确。第三步,检查参数化测试的注解配置。最后,建议用户进行清理和重新构建,确保资源文件被正确打包。 可能用户对Maven或Gradle的项目结构不太熟悉,需要详细说明资源目录的位置,以及如何检查构建后的目录是否有该文件。另外,可能需要提醒用户在IDE中刷新项目,或者重新导入,有时候IDE缓存可能导致文件未被正确识别。 此外,如果用户使用的测试框架是JUnit 5,@CsvFileSource需要正确的资源路径,可能需要确认注解中的路径是否正确,是否加了斜杠,或者是否需要使用相对路径。例如,如果测试类在com.main包下,使用@CsvFileSource(resources = "nextDay.csv")可能会在类路径的com/main目录下查找,而绝对路径则是从类路径根开始。 最后,要提醒用户检查异常堆栈中的具体代码行,确定是哪个测试方法导致了问题,从而更精准地定位错误来源。例如,查看堆栈中提到的测试类和方法,确认其参数化测试的配置。</think>这个错误信息表明你的测试代码在尝试加载类路径资源 `/com/main/nextDay.csv` 时失败,同时参数化测试 `@ParameterizedTest` 未正确配置参数源。以下是逐步分析和解决方案: --- ### **错误原因分析** 1. **资源文件未找到** - 错误信息 `Classpath resource [/com/main/nextDay.csv] does not exist` 表示程序尝试从类路径加载 `/com/main/nextDay.csv` 文件,但该文件不存在。 - 常见原因: - 文件未正确放置在项目的资源目录中(如 `src/main/resources` 或 `src/test/resources`)。 - 文件未被构建工具(如 Maven/Gradle)打包到 `target/classes` 或 `build/resources` 目录。 - 代码中文件路径拼写错误或大小写不匹配。 2. **参数化测试配置错误** - 错误信息 `You must configure at least one set of arguments for this @ParameterizedTest` 表明你使用了 JUnit 5 的 `@ParameterizedTest` 注解,但未正确指定参数源(如 `@ValueSource`、`@CsvFileSource` 等)。 --- ### **逐步解决方案** #### **1. 检查资源文件位置** - **Maven 项目结构**: ```plaintext src/ main/ resources/ com/ main/ nextDay.csv # 正确位置 test/ resources/ com/ main/ nextDay.csv # 测试专用资源(若需) ``` - **Gradle 项目结构**: ```plaintext src/ main/ resources/ com/ main/ nextDay.csv test/ resources/ com/ main/ nextDay.csv ``` - **验证构建结果**: 构建项目后,检查 `target/classes`(Maven)或 `build/resources`(Gradle)中是否存在 `com/main/nextDay.csv`。 --- #### **2. 检查代码中的资源加载方式** - **使用 `@CsvFileSource` 注解的示例**: ```java @ParameterizedTest @CsvFileSource(resources = "/com/main/nextDay.csv") // 路径以斜杠开头表示从类路径根目录开始 void testNextDay(String input, String expected) { // 测试逻辑 } ``` - 确保 `resources` 属性值与实际路径一致。 - 如果文件在 `src/test/resources` 中,路径应相同。 --- #### **3. 检查参数化测试配置** - 必须为 `@ParameterizedTest` 提供参数源,例如: ```java @ParameterizedTest @CsvFileSource(resources = "/com/main/nextDay.csv") // 或使用其他参数源,如 @ValueSource、@MethodSource 等 void testMethod(String param) { // 测试逻辑 } ``` --- #### **4. 清理并重新构建项目** - **Maven**: ```bash mvn clean install ``` - **Gradle**: ```bash gradle clean build ``` - 确保构建后资源文件被正确复制到输出目录。 --- #### **5. 验证 IDE 配置** - 在 IntelliJ/Eclipse 中: 1. 右键点击项目 -> **Reload Project**(或 **Refresh**)。 2. 检查文件是否被 IDE 正确识别(无红色警告)。 --- ### **总结** 1. 确认 `nextDay.csv` 文件在资源目录中,路径与代码一致。 2. 检查 `@ParameterizedTest` 是否配置了有效的参数源。 3. 清理并重新构建项目。 4. 若问题仍存在,检查文件权限或操作系统路径大小写敏感性(Linux/Mac 严格区分大小写)。 如果问题仍未解决,请提供完整的测试代码和项目结构,以便进一步诊断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值