黑马程序员_JAVA之异常、File类、递归

本文详细介绍了Java中的异常处理机制,包括异常的概念、分类、处理方式等,并提供了多种异常处理实例。此外,还深入讲解了File类的使用方法,涵盖了构造方法、创建与删除文件、获取文件信息等方面。

------- android培训java培训、期待与您交流--------

异常

概述:程序运行过程中的不正常情况

异常分类:

严重错误,无法通过处理的错误;

运行时异常,运行时可能会报错,可以不处理。如数学异常;

编译时异常,编译时无法编译通过。如日期格式化异常。

集中常见异常:

NullPointerException-----------空指针异常

IndexOutOfBounds ------------集合越界异常

StringIndexOutOfBounds-----字符串越界异常

ArrayIndexOutOfBounds----数组角标越界异常

ClassCastException-----------类型转换异常

ClassNotFoundException-------类找不到异常

异常的处理:

Java默认处理方式:JVM有一个默认的异常处理机制,即将该异常的名称、异常的信息、异常出现的位置打印在了控制台上,同时将程序停止运行。

异常相关操作:

创建异常对象(JDK已定义的异常会自动创建对象,自定义异常需要手动创建)

抛出异常(JDK已有定义的异常会自动抛出异常,自定义异常需要手动抛出)

处理异常

程序员在有异常抛出时,异常的处理方法有两种:

将异常捕获并处理

声明抛出异常

异常捕获并处理的方式(共三种):

第一种:

捕获一个,处理一个

格式:try{

需要检测的代码;

}catch(异常类  变量){

异常处理代码

}

如果没有异常产生,就只运行try中的代码,catch中的代码直接跳过

如果产生了异常,就从产生异常的地方开始跳入catch代码块中运行代码.同时carch代码块捕获了该产生的异常对象.

catch代码块执行完毕后,不会再执行try里边的剩余代码,而是直接执行完毕

代码实现:

package cn.itcast;

public class Demo3 {

	public static void main(String[] args) {

		System.out.println("try外边前边的代码");
		
		try {
			System.out.println("try里边异常产生前边的代码");
			System.out.println(10/0);//产生异常对象,并抛出ArithmeticException异常对象
			System.out.println("try里边异常产生后边的代码");
		} catch (ArithmeticException e) {
			System.out.println("catch里边处理异常的代码");
			System.out.println("我把异常抓住了,但是我根本不管它");
			System.out.println("同学,小学数学没学好吧,除数不能为0!");
		}
		
		System.out.println("try外边后边的代码");
	}

}

第二种:

捕获多个,分别处理 

注意:大异常不能放到前边

格式:try{

需要检测的代码;

}catch(异常类  变量){

异常处理代码;

}finally{

必须被执行代码

}

代码实现:

package cn.itcast;
public class Demo4 {

	public static void main(String[] args) {

			try{
				System.out.println(10/10);
			}catch(ArithmeticException e){
				System.out.println("除数不能为0");
			}finally{
				System.out.println("我是finally当中的代码");
			}
			
			System.out.println("我是try后边的代码");
			
	}

}

第三种:

一次捕获共同处理

注意:多个异常之间不能有子父类关系

格式:try{

需要检测的代码;

}finally{

必须被执行代码;

}

代码实现:

package cn.itcast;
public class Demo4 {

	public static void main(String[] args) {
			
			try{
				System.out.println(10/0);
			}finally{
				System.err.println("我是finally当中的代码");
			}
	}

}

异常常见的方法:

toString:异常名称:异常描述

public String getMessage():返回此 throwable 的详细消息字符串。

public void printStackTrace()  将此 throwable 及其追踪输出至标准错误流

public void printStackTrace(PrintStream s)   将此 throwable 及其追踪输出至指定的位置

代码实现:

package cn.itcast;

public class Demo8 {

	public static void main(String[] args) {

		try {
			System.out.println(10/0);
		} catch (ArithmeticException e) {
			System.out.println(e.getMessage());
			System.out.println(e);
			
			e.printStackTrace();
		}
		
		System.out.println(10/0);
	}

}

声明抛出异常和抛出异常:

throws:用于声明函数抛出异常。用于函数声明。

是异常对象的处理方式之一。

多个异常可以同时声明抛出,用逗号分隔。

throw:用于抛出异常对象。用于函数内容。

当出现JDK异常对象时,JVM会自动创建一个异常对象并抛出。

自定义异常对象可以先创建异常对象,再使用throw抛出。抛出后再进行处理:或使用捕获或使用声明抛出。

异常处理注意细节:

运行时异常被抛出可以不处理。即不捕获也不声明抛出。

如果父类抛出了多个异常,子类覆盖父类方法时,只能抛出相同的异常或者是他的子集。

父类方法没有抛出异常,子类覆盖父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出。

函数中已经出现返回语句返回值A,再在finally中修改A值,则最终的返回值仍为修改前A的值。但在该方法中A的值已经被修改了。

finally语句只有在退出虚拟机的情况下不会被执行。

注意不要超出异常捕获处理时的变量作用域。

代码实现:

package cn.itcast;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo12 {

	public static void main(String[] args) {
		
	}
}

class Fu {
	public void method() throws Exception{
		System.out.println(10/0);
	}
	
	public void method2(){}
}

class Zi extends Fu{
	public void method() throws ParseException {
		String s = "1949-10-1";
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
		Date date = sdf.parse(s);
	}
	
	public void method2() {
		String s = "1949-10-1";
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
		try {
			Date date = sdf.parse(s);
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}
}

File类

概述:

将文件路径或者文件夹路径封装成的类。实际代表该路径下的文件或者文件夹。方便对文件与文件夹的属性信息进行操作。

构造方法:

public File(String pathname)  通过路径名创建文件对象

public File(String parent,String child)  父亲:该文件或者文件夹所在的文件夹      孩子:文件或者文件夹本身

public File(File parent, String child)  与上边的构造方法相同

代码实现

package cn.itcast2;

import java.io.File;

public class Demo2 {

	public static void main(String[] args) {

		//构造方法一
		File file = new File("a/b.txt");
		File file2 = new File("D:\\Lesson\\JAVA\\JAVA基础\\北京\\150601\\day19\\code\\day19\\a\\b.txt");
		
		System.out.println("=================文件夹的构造");
		File dirParent = new File("a");
		File dirChild = new File("a/b");
		//构造方法二
		File dirChild2 = new File("a","b");
		//构造方法三
		File dirChild3 = new File(dirParent,"b");
		
		System.out.println("=====================文件的构造");
		File fileParent = new File("a");
		File fileChild = new File("a/b.txt");
		
		//构造方法二
		File fileChild2 = new File("a","b.txt");
		//构造方法三
		File fileChild3 = new File(fileParent,"b.txt");
	}

}

普通方法:

创建File对象并没有创建文件,如果需要创建文件的话,需要调用方法。

public boolean createNewFile() throws IOException  创建文件,文件已经存在,则不能再创建了

public boolean mkdir()  创建文件夹

注意事项:文件与文件夹同样不能重名

public boolean mkdirs() 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。  路过的所有文件夹顺带全部创建

代码实现:

package cn.itcast2;

import java.io.File;
import java.io.IOException;

public class Demo3 {

	public static void main(String[] args) throws IOException {

		//创建一个文件
		File file = new File("b.txt");
		boolean createNewFile = file.createNewFile();
		System.out.println(createNewFile);
		//创建一个文件夹
		File file2 = new File("b");
		boolean mkdir = file2.mkdir();
		System.out.println(mkdir);
		//文件夹可以有扩展名,但是没有意义。同样的,文件也可以没有扩展名
		File file3 = new File("c.txt");
		file3.mkdir();
		
		//创建文件对象,其所有的文件夹都必须已经存在,否则报错
//		File file4 = new File("d/e/f/g/h.txt");
//		file4.createNewFile();
		
		//创建文件夹对象,其所有的文件夹如果不存在,不会报错,但是不会创建成功
		File file4 = new File("d/e/f/g/h");
		boolean mkdir2 = file4.mkdir();
		System.out.println(mkdir2);
		
		//创建文件夹对象,其所有的文件夹如果不存在,调用加S的方法,可以顺便将所有路过文件夹全部创建
		File file5 = new File("d/e/f/g/h");
		boolean mkdir3 = file5.mkdirs();
		System.out.println(mkdir3);
		
	}

}

删除与判断方法:

public boolean delete()  删除文件

public boolean isDirectory()  判断是否为文件夹

public boolean isFile()  判断是否为文件

public boolean isHidden()  判断是否为隐藏文件

public boolean exists()  判断文件是否存在

代码实现:

package cn.itcast2;

import java.io.File;
import java.io.IOException;

public class Demo4 {

	public static void main(String[] args) throws IOException {

		File file = new File("b.txt");
		file.createNewFile();
//		System.out.println(file.delete());
		
		System.out.println(file.exists());
		System.out.println(file.isDirectory());
		System.out.println(file.isFile());
		System.out.println(file.isHidden());
	}

}

获取功能:

public String getAbsolutePath()  获取绝对路径

public String getPath()  获取路径

public String getParent()  获取其所在的文件夹

public File getParentFile()  获取其所在的文件夹的文件对象

public String getName()  获取文件名

public long lastModified()  获取其文件的最后修改时间

public long length()  获取文件大小(字节数)   数字或者英文字符都是1个字节   汉字使用GBK码表2个字节

代码实现:

package cn.itcast2;

import java.io.File;
import java.util.Date;

public class Demo6 {

	public static void main(String[] args) {
		
		File file = new File("b.txt");
		File file2 = new File("D:\\Lesson\\JAVA\\JAVA基础\\北京\\150601\\day19\\code\\day19\\b.txt");
		
		System.out.println(file.getAbsolutePath());
		System.out.println(file2.getAbsolutePath());
		System.out.println("==================");
		System.out.println(file.getPath());
		System.out.println(file2.getPath());
		System.out.println("==================");
		System.out.println(file.getParent());
		System.out.println(file2.getParent());
		System.out.println("==================");
		System.out.println(file.getParentFile());
		System.out.println(file2.getParentFile());
		System.out.println("==================");
		System.out.println(file.getName());
		System.out.println(file2.getName());
		System.out.println("==================");
		System.out.println(new Date(file.lastModified()));
		System.out.println(file2.lastModified());
		System.out.println("==================");
		System.out.println(file.length());
		System.out.println(file2.length());
	}

}

高级获取功能:

public static File[] listRoots()  列出可用的文件系统根。

public String[] list()  返回一个字符串数组  内容为该目录中的文件和目录   即该列出该目录下的所有内容

public File[] listFiles()  返回一个文件对象数组  内容为该目录中的文件和目录   即该列出该目录下的所有内容

代码实现:

package cn.itcast2;

import java.io.File;

public class Demo7 {

	public static void main(String[] args) {

		File[] listRoots = File.listRoots();
		
		for (File file : listRoots) {
			System.out.println(file);
		}
		System.out.println("==================");
		
		
		File dir = new File("d");
		
		String[] list = dir.list();
		
		for (String string : list) {
			System.out.println(string);
		}
		
		System.out.println("==================");
		
		
		File dir2 = new File("d");
		
		File[] listFiles = dir2.listFiles();
		
		for (File file : listFiles) {
			System.out.println(file.getName());
		}
	}

}

文件过滤器FilenameFilter:用于过滤文件

public File[] listFiles(FilenameFilter filter) 表示的目录中满足指定过滤器的文件和文件夹

自己理解:

即调用该方法的目录,会将该目录中的每一个文件或者文件夹都经过过滤器的判断。如果满足条件就返回到数组中,不满足条件,就不返回。

代码实现:

package cn.itcast;

import java.io.File;
import java.io.FilenameFilter;

public class Demo2 {

	//需求:返回该目录下所有以.java结尾的文件
	public static void main(String[] args) {

		//创建文件夹的文件对象
		File file = new File("zzz");
		
		File[] listFiles = file.listFiles(new FilenameFilter() {
			
			//该方法是用来判断文件名的
			@Override
			public boolean accept(File dir, String name) {
				//dir:该文件所在的文件夹
				//name:该文件的文件名
				
				//将该文件对象创建出来
				File thisFileorDIR = new File(dir,name);
				
				//判断是否为文件
				if(thisFileorDIR.isFile()) {
					//判断文件名是否以java结尾
					if(name.endsWith(".java")) {
						return true;
					}
				}
				
				return false;
			}
		});
		
		
		//遍历过滤之后的数组
		for (File file2 : listFiles) {
			String absolutePath = file2.getAbsolutePath();
			System.out.println(absolutePath);
		}
	}

}

递归算法

概述:在函数内调用函数本身。

注意事项:

必须在函数内调用该函数本身。

递归算法所在函数内,必须有函数出口。

递归次数不能过多,否则会导致内存溢出。

代码实现:

package cn.itcast;

public class Demo3 {

	public static void main(String[] args) {
		
		method(0);
	}
	
	public static void method(int number) {
		number++;
		System.out.println(number);
		
		//必须有递归的函数出口
		if(number>10){ //递归次数不宜过多
			return;
		}
		//递归方法中必须有自己调用自己
		method(number);
	}

}

用递归算1-10的和

代码实现

package cn.itcast;

public class Demo4 {

	public static void main(String[] args) {

		System.out.println(getSum(365));
	}

	public static int getSum(int number) {

		//函数出口
		if(number == 1) {
			return 1;
		}
		
		//每次使用这个数本身       加上         1-比该数小1的数的和
		return number + getSum((number-1));
	}
}

求斐波那契数列,(不死神兔)

代码实现:

package cn.itcast;
/*
 * 求斐波那契数列
 * 给定第几个数,  求这第几个数的值是多少
 * index :1 2 3 4 5 6 7 ...
 * 返回值      :1 1 2 3 5 8 13 ...    
 * 规律:第三个数是前两个数的和
 * 
 * 第一个数,第二个数均不符合斐波那契数列规律
 * 
 * 求第4个数
 *     求第3个数                                                         +                       求第2个数
 * 		      求第2个数       +   求1个数
 * 
 * 求第5个数
 * 	        求第4个数                                                                                                                     +              求第3个数
 * 		     求第3个数              +         求第2个数                                                                                                     求第2个数   +   求第1个数
 * 			 求第2个数   + 求第1个数
 * 
 * 
 * 出口:  当数为第1个或者第2个时,直接返回1
 * 
 */
public class Demo6 {

	public static void main(String[] args) {

		System.out.println(method(7));
	}
	//告诉我你要第几个数,我把这个数的值返回
	public static int method(int index) {
		//出口:  当数为第1个或者第2个时,直接返回1
		if(index==1||index==2) {
			return 1;
		}
		//规律:第三个数是前两个数的和
		int before = index-1;
		int beforeBofore = index-2;
		
		return method(before) + method(beforeBofore);
	}

}


标题基于SpringBoot的校园创客空间管理系统设计与实现AI更换标题第1章引言介绍校园创客空间管理系统的研究背景、意义、现状以及论文方法与创新点。1.1研究背景与意义阐述校园创客空间管理系统在提升管理效率方面的重要性。1.2国内外研究现状分析国内外校园创客空间管理系统的研究与应用现状。1.3研究方法及创新点概述论文采用的研究方法及系统设计的创新之处。第2章相关理论介绍SpringBoot框架、数据库技术及系统开发所需的相关理论。2.1SpringBoot框架介绍介绍SpringBoot框架的核心特性及其在系统开发中的应用。2.2数据库技术阐述数据库设计原理及在管理系统中的数据存储方法。2.3系统开发相关理论介绍系统开发过程中涉及的前端技术、后端技术等。第3章系统需求分析对校园创客空间管理系统的功能需求和非功能需求进行详细分析。3.1功能需求分析列举系统所需实现的具体功能,如用户管理、空间预约等。3.2非功能需求分析分析系统的性能、安全性、易用性等非功能需求。3.3用户角色与权限分析分析系统用户角色及其对应权限,确保系统安全性。第4章系统设计详细介绍校园创客空间管理系统的设计方案,包括架构、模块及数据库设计。4.1系统架构设计给出系统的整体架构,包括前端、后端及数据库的连接方式。4.2系统模块设计详细介绍各个模块的功能设计及其交互方式。4.3数据库设计阐述数据库表结构设计、字段定义及关系建立。第5章系统实现介绍校园创客空间管理系统的具体实现过程,包括环境搭建、编码实现及测试。5.1系统开发环境搭建介绍系统开发所需的软件、硬件环境及配置步骤。5.2系统编码实现阐述系统各个模块的编码实现过程及关键代码解析。5.3系统测试与优化介绍系统测试方法、测试用例及测试结果,以及针对测试结果的优化措施。第6章结论与展望总结校园创客空间管理系统的设计与实现成果,并展望未来的研究方向。6.1
一款轻量而功能强大的点云可视化和编辑软件,支持pcd, ply, las等多种格式,轻松打开海量点云数据,支持多方式多字段渲染点云,对点进行方便的查询、量测和编辑,提供了地面滤波算法,可应用于测绘、高精地图、SLAM等领域。 PCDViewer是一款专业的点云数据处理软件,特别适用于处理和编辑大规模点云数据。该软件支持多种点云文件格式,包括pcd、ply和las等,这些格式广泛应用于激光雷达扫描数据、三维建模以及其他测绘技术。PCDViewer的强大之处在于其轻量级的系统要求与丰富的功能集,使得用户可以在Windows、Ubuntu等操作系统上轻松运行软件,高效地处理海量点云数据。 这款软件的一个主要特点是其多方式多字段渲染点云的能力。这允许用户根据不同的属性,如颜色、强度、高度等,对点云进行视觉上的分和区分,从而更直观地分析和理解点云数据。此外,PCDViewer还提供了方便的查询、量测和编辑功能,允许用户直接对点云数据进行操作,诸如添加注释、删除噪声点或进行精确测量等,极大地提高了工作效率。 软件还内置了地面滤波算法,这一功能对于测绘学、地理信息系统(GIS)以及机器人导航和定位(SLAM)等领域尤为关键。地面滤波算法能够从点云数据中分离出地面点和非地面点,这对于如道路建模、地形分析、植被测量等应用来说至关重要。通过分离地面点,可以更准确地进行地面建模和地形特征分析,为自动化系统提供清晰的环境地图。
内容概要:本文提出了一种计及并网波动约束和储能荷电状态(SOC)的混合储能功率协调控制方法,并提供了完整的Matlab代码实现。该方法针对可再生能源并网系统中存在的功率波动问题,采用锂电池与超级电容构成的混合储能系统进行功率平抑,通过低通滤波与动态时间常数调节实现高频/低频功率分量的合理分配,同时引入SOC反馈控制机制,实时调节功率分配系数,确保各储能单元的荷电状态维持在安全范围内,避免过充过放,从而在满足并网功率波动标准的同时,延长储能系统使用寿命。文中详细阐述了控制策略的设计原理、关键参数整定方法及仿真验证过程,展示了该方法在平抑功率波动和均衡储能SOC方面的优越性能。; 适合人群:具备电力系统、新能源并网或储能控制基础知识的研究生、科研人员及从事相关领域工程开发的技术人员。; 使用场景及目标:①研究混合储能系统在平抑风电/光伏并网功率波动中的应用;②掌握基于SOC反馈的储能功率协调控制策略设计方法;③学习Matlab/Simulink在电力电子与电力系统仿真中的建模与分析技巧;④为撰写学术论文或完成科研项目提供可复现的技术方案与代码参考。; 阅读建议:建议结合Matlab代码逐行理解控制逻辑,重点关注低通滤波与SOC反馈环节的实现方式,并尝试调整参数观察系统响应变化,以深入掌握控制策略的动态特性与优化思路。
内容概要:本文提出了一种基于变分模态分解(VMD)、麻雀搜索算法(SSA)优化与长短期记忆网络(LSTM)相结合的光伏功率预测模型(VMD-SSA-LSTM),旨在提升光伏发电预测的精度与鲁棒性。该方法首先利用VMD对原始非平稳光伏功率序列进行自适应分解,获得一系列具有更稳定特征的本征模态分量(IMFs),有效降低数据复杂性与噪声干扰;随后引入麻雀搜索算法(SSA)对LSTM网络的关键超参数(如学习率、隐层节点数等)进行全局寻优,克服传统试凑法效率低、易陷入局部最优的问题,显著提升模型收敛速度与泛化能力;最后,构建多个LSTM子模型分别预测各模态分量,并将结果重构得到最终的光伏功率预测值。该混合模型充分融合了VMD在信号预处理中的优异分解性能、SSA在参数优化中的高效搜索能力以及LSTM在捕捉时间序列长期依赖关系上的强大建模优势,实现了对复杂气象因素影响下光伏出力波动的高精度拟合与预测。; 适合人群:具备一定电力系统、新能源发电或时间序列预测基础知识,熟悉MATLAB编程环境,从事光伏功率预测、智能电网调度、可再生能源集成、负荷预测等领域研究的科研人员、工程技术人员及高校研究生。; 使用场景及目标:①应用于光伏电站的短期与超短期功率预测,为电网安全调度、电力市场交易、储能系统配置及需求侧响应提供精准数据支撑;②解决传统单一预测模型(如ARIMA、BPNN、单一LSTM)在处理非平稳、强波动性光伏数据时存在的精度不足、稳定性差等问题;③为风电、负荷等其他非平稳时序预测问题提供一种有效的“分解-优化-预测”混合建模范式与技术实现路径。; 阅读建议:建议读者结合文中提供的完整MATLAB代码,深入理解VMD信号分解、SSA优化算法流程及LSTM网络构建的每一个技术环节,通过实际历史数据进行模型复现与对比实验(如与VMD-LSTM、SSA-LSTM等模型比较),掌握参数调优技巧与模型性能评估方法,从而真正掌握该先进混合预测模型的核心思想与应用精髓。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值