DAY17

异常Exception

异常的体系:Throwable,继承自Object,分为Error和Exception两类,Error,错误,比较严重的问题,程序员通过代码解决不了,为硬件上的异常,不用捕获。
Exception,异常,通过代码可以解决。分为RuntimeException运行时异常和编译时异常,除了RuntimeException之外的异常都属于编译时异常,编译时就需要解决他。

异常处理机制:
程序执行到某一行时,如果有问题,就会产生一个描述该问题的对象,首先尝试内部解决,如果解决不了就会交给调用者,以此类推,最终交给JVM调用默认的处理机制,将问题的对象,问题的原因,问题出现的位置等信息打印到控制台,以便程序员通过代码进行解决。

异常的捕获:

try{
语句;
}
catch{
语句;
}
catch{//catch可以有多个,当多个catch出现子父关系时,父类的catch一定要写在下面,因为
//他的范围广,所有的异常都会被他捕获,底下的catch根本就执行不了。
语句;
}
finally{	//finally的作用是释放资源,不管try catch是否捕获异常都会执行,即使catch中
//有return语句,finally也依然会执行完之后才结束,除非语句中有System.exit(0);JVM退出,
//那么finally就不会执行了,finally可以单独写
语句;
}

运行时异常:

public class Demo6 {

	public static void main(String[] args) {
		math(10,2);
	}
	public static void math(int a,int b){
		int result=a/b;
		if (b==0) {
			throw new ArithmeticException();//throw new 一个异常的对象,运行时异常,编译时暂不用解决,
		}else
			System.out.println(result);
	}
}

编译异常:

public class Demo6 {

	public static void main(String[] args) {
		math(10,2);
	}
	public static void math(int a,int b) throws Exception{	//编译时异常要么声明,要么用try catch方法
		int result=a/b;
		if (b==0) {
			throw new Exception();//throw new 一个异常的对象,编译异常,必须在编写程序的时候就解决
		}else
			System.out.println(result);
	}
}
public class Demo6 {

	public static void main(String[] args) {
		try {
			int a=10/0;
		} catch (Exception e) {	//多态,e其实是ArithmeticException的对象
//			System.out.println(e.toString());//异常名+原因
			System.out.println(e.getMessage());//异常原因
			e.printStackTrace();//异常名+异常原因+异常位置
		}
	}
}

Throwable类中需要掌握的方法:
构造方法:

Throwable();
Throwable(String message);
Throwable(String message,Throwable c);

方法:

toString());		//异常名+原因
getMessage());		//异常原因
printStackTrac();	//异常名+异常原因+异常位置

自定义异常:
1.定义类继承Exception或者RuntimeException异常;
2.调用父类中的构造方法。

public class Demo6{
//调用了异常方法,要么声明异常要么try,catch,这里我们选择第二种,因为我们调用了他,如果不解决最后就会交给JVM,
//程序就会报错停止,这养我们自定义异常就没有意义了
	public static void main(String[] args) {
		try {
			jiSuan(10,0);
		} catch (myException e) {
			e.printStackTrace();
		}
		System.out.println("over");
	}
//throw一定和throws一起用,为什么这里不用try,catch?这里只要声明就好,这只是个方法,所以具体留给它的调用它的人去解决。
	public static void jiSuan(int a,int b) throws myException{
		if (b<=0) {
			throw new myException("除数不能为负数或者0!");//异常原因在这里就要声明!!如果在执行的方法里声明那么这个异常方法也就没多大意义了
		}else
			System.out.println(a/b);
	}
}

class myException extends Exception{//自定义一个异常类
	public myException(){//继承父类无参构造方法
		super();
	}
	public myException(String message){//继承Exception的第二种构造方法
		super(message);
	}
	public myException(String message,Throwable a){//继承Exception的第三种构造方法
		super(message,a);
	}
}

IO方法

File创建对象的时候不会去检查创建的文件或者文件夹是否真实存在。

import java.io.File;
import java.io.IOException;
import java.util.Date;
public class Demo2 {
//IO技术
	public static void main(String[] args) throws IOException {
		File file=new File("D:\\aa\\bb\\cc.txt");//创建一个file对象
		File file1=new File("D:\\aa");//创建一个file对象
		File file2=new File("D:\\abcd\\abc");
//		file2.mkdirs();
//		System.out.println(file.createNewFile());//创建一个新文件
//		System.out.println(file.delete());//删除指定目录下的文件
//		System.out.println(file.mkdir());//创建一个新目录
//		System.out.println(file.delete());//删除指定目录
//		System.out.println(file.mkdirs());//创建多级目录
//		System.out.println(file.delete());//删除目录,只能删除最后一级目录
//		System.out.println(file1.delete());//false,不能一次删除多级目录
//		System.out.println(file.mkdirs());
//		System.out.println(file.createTempFile("ddd", "temp",file));//创建临时文件
//		file.deleteOnExit();//虚拟机退出时删除文件
//		System.out.println(file.exists());//判断指定文件或目录是否存在
//		File file2=file.getAbsoluteFile();//获取绝对路径,File
//		System.out.println(file2);
//		String s=file.getAbsolutePath();//获取绝对路径的字符串形式,String,如果写的是相对路径,返回的是相对于当前地址的绝对路径
//		System.out.println(s);
//		System.out.println(file.getCanonicalFile());//获取路径名的规范格式
//		System.out.println(file.getCanonicalPath());//获取路径名的规范格式
//		System.out.println(file.getFreeSpace());//long,返回指定路径名中未分配的字节数
//		System.out.println(file.getName());//返回指定目录的文件名或文件夹名
//		System.out.println(file.getParent());//返回父目录的目录名的字符串,如果没有父目录则返回null
//		System.out.println(file.getParentFile());//返回父目录的目录名的File对象格式,没有就返回null
//		System.out.println(file.getPath());//返回目录名的字符串形式,是相对地址,写的是什么就返回什么
//		System.out.println(file.isFile());//boolean,判断当前路径名对应的是一个标准文件吗?
//		System.out.println(file.isHidden());//判断此抽象路径名指定的文件是否是一个隐藏文件。
//		System.out.println(new Date(file.lastModified()));//返回此抽象路径名表示的文件最后一次被修改的时间。
//		long a=file.length();
//		System.out.println(a);//返回由此抽象路径名表示的文件的字节数byte。
//		String[] arr=file2.list();//String[] 返回一个字符串数组,显示当前目录下的文件夹和文件的名字
//		for(String s:arr)
//			System.out.println(s);
//		File[] f=file2.listFiles();//File[] 返回一个File类型的数组,显示该目录下的所有文件夹和文件的绝对路径名字
//		for(File f1:f)
//			System.out.println(f1);
	}
}
import java.io.File;

//list,获取所有文件和文件夹名
public class Demo4 {
	public static void main(String[] args) {
		//list-String[]
		File file=new File("D:\\aa");
//		String[] a=file.list();
//		for(String b:a)
//			System.out.println(b);
		//listFiles-Files[]
		File[] c=file.listFiles();
		for(File d:c)
			System.out.println(d.getName());//默认打印的是路径名,获得文件名加.getName()
	}
}

递归

用递归求1-5的和
DAY17

public class Demo5 {
//用递归的方法计算1-5的和
	public static void main(String[] args) {
		int num=5;
		System.out.println(sum(5));
	}
	public static int sum(int number){
		if(number==1)
			return 1;
		else{
			return number+sum(number-1);
		}
	}
}

显示文件夹中所有的文件名,包含子文件夹

//输出所有的文件名
//运用方法的递归
public class Demo3 {
	public static void main(String[] args) {
		File file = new File("D:\\aa");
		getName(file);
	}
	public static void getName(File file){
		File[] files=file.listFiles();
		for (int i = 0; i < files.length; i++) {
			if (files[i].isDirectory()) {
				getName(files[i]);
			}else
				System.out.println(files[i].getName());
		}
	}
}

输出指定文件夹下所有的文件名,要求格式:文件夹名- - -文件名

import java.io.File;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;

public class Demo5 {
	//输出制定目录下的目录名--文件名,包括所有子文件夹中的文件
	public static void main(String[] args) {
		File file=new File("D:\\abcd");
		test(file);
	}
	public static void test(File file){
		//用于接收文件夹名,文件名,注意文件名是唯一的,所以应该用文件名作为key,
		//否则同意文件夹只会显示一个文件,因为重名的key被替代了
		TreeMap<String, String> map=new TreeMap<>();
		File[] files=file.listFiles();
		String key="";String value="";
		for (int i = 0; i < files.length; i++) {
			if (files[i].isDirectory()) {
				test(files[i]);
			}else{
				key=files[i].getName();
				value=files[i].getParent();
				map.put(key, value);
			}
		}
		Set<String> set=map.keySet();//遍历key
		Iterator<String> it=set.iterator();
		while (it.hasNext()) {
			String str = it.next();
			map.get(str);//获取value值
			System.out.println(map.get(str)+"---"+str);
		}
	}
}