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的和
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);
}
}
}