异常
- 概念:Java程序在运行中出现的错误
- 异常的基类——Throwalbe基类
- Error错误:严重问题 内存溢出 无法解决
- Ecxeption异常:非严重问题 可以解决 异常分为两种 运行期异常和编译期异常
- 运行期异常 RuntimeException——发生在程序运行过程中,可以解决也可以不解决 不影响程序的编译
- 编译期异常 非 RuntimeException——发生在程序编译过程中,必须解决,否则程序无法进行运行
运行期异常
eg: int a = 10;
int b = 0;
System.out.println(a/b);————运行期异常
——————ArithmeticException(算术异常):当出现异常的运算条件时,抛出此异常。
——————eg:一个整数“除以零”时,抛出此类的一个实例。
- 运行期异常的默认处理方式——抛给JVM处理:打印异常的栈堆信息 然后退出
- 若想改变异常的处理方式 使用关键字 try()catch()
try{ }catch(){ }
- try里面放的是 可能会出现异常的代码 若出现异常 才会运行catch里的代码
eg: int a = 10;
int b = 0;
try{
System.out.println(a/0);
}catch(ArithmeticException e){
System.out.println("除数为0,算法不成立!");
}catch (NullPointerException e){
System.out.println("空指针异常");
}
System.out.println("程序还在继续向下运行");
System.out.println("是的一直在运行....");
——————输出:除数为0,算法不成立!
程序还在继续向下运行
是的一直在运行....
eg: ......————另一种写法
try {
System.out.println(a / b);
System.out.println(arr.length);
System.out.println(arr[3]);
System.out.println("====================");
} catch (ArrayIndexOutOfBoundsException | ArithmeticException | NullPointerException e) {
System.out.println("数组角标越界异常");
if(e instanceof ArithmeticException){
System.out.println("除数为0异常");
}else if(e instanceof ArrayIndexOutOfBoundsException){
System.out.println("空指针异常");
}
}
- catch可以并列捕获多个不同的异常——若捕获的异常是平级关系,则无需区分前后,若为继承关系,则父类异常写在最后
- ctrl+h:可以看异常的父类
- 所有异常的父父类是Exception
try{ }catch(){ }finally{ }
e.printStackTrace()——打印异常的堆栈信息,以及在程序中出现的位置
e.getMessage()——获取异常信息 返回字符串
eg: String message = e.getMessage();
System.out.println(message);————输出:null
e.toString()——获取异常类名和异常信息 返回字符串
eg: String s = e.toString();
System.out.println(s);————输出:java.util.InputMismatchException
A.close()———释放资源
- finally ( ) ——用来执行最后的收尾工作,例如释放资源
eg: Scanner sc = null;
try{
sc = new Scanner(System.in);
System.out.println("请输入第一个数:");
int a = sc.nextInt();
System.out.println("请输入第二个数:");
int b = sc.nextInt();
System.out.println(a/b);
}catch (ArithmeticException e){
//System.out.println("除数为0异常");
e.printStackTrace();————打印异常的堆栈信息
}finally {
System.out.println("执行最后的代码");
if(sc != null);
sc.close();——————————释放资源
}————输入:15 0
————输出:执行最后的代码
java.lang.ArithmeticException: / by zero
at yichang.demo3.main(demo3.java:14)
编译期异常
- 处理方法
- 1. 采用throws抛出 抛给调用者
- 2. 采用try自己捕获处理
- 抛出异常
eg: public class demo6 {
public static void main(String[] args) throws CloneNotSupportedException {
Dog dog = new Dog();
dog.clone();——————————输出:--------
}
}
class Dog implements Cloneable{
@Override
protected Object clone() throws CloneNotSupportedException {
System.out.println("--------");
return super.clone();
}
}
- 用try自己捕获
快捷键: ctrl+alt+T 把括住的一段代码,进行异常处理
eg: public class demo6 {
public static void main(String[] args) {
Dog dog = new Dog();
try {
dog.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
class Dog implements Cloneable {
@Override
protected Object clone() throws CloneNotSupportedException {
System.out.println("--------");
return super.clone();
}
}
throw和throws区别
throw: 在方法内部进行抛出 抛出一个具体的异常对象 若抛出了说明发生了这种异常
eg: public static void main(String[] args) {
Test(1,0);
System.gc();
}
private static void Test(int i, int j) {
if(j==0){
throw new ArithmeticException("除数为0了");
}else{
System.out.println(i/j);————————输出:java.lang.ArithmeticException: 除数为0了
}
}
throws:在方法声明上进行抛出 抛出多个异常类型 抛出的异常类型只是可能发生 并不一定发生
自定义异常
import java.util.Scanner;
public class demo8 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的成绩:");
int score = sc.nextInt();
if(score>0||score<100){
throw new ScoreException("成绩超出范围异常");
}else{
System.out.println("成绩合法!");
}
}
}
public class ScoreException extends RuntimeException {
public ScoreException(String s) {
super(s);
}
}
注意:
- 子类重写父类方法时,若方法内部有编译期异常 子类的方法必须抛出相同的异常或父类异常的子类
- 子类不能抛出父类没有抛出的异常
- 父类抛出异常 子类可以不抛出
- 若父类被重写的方法没有异常抛出 子类的方法不能抛出异常 只能try catch捕获
IO流
- 概念:IO流用来处理设备之间的数据传输 上传文件和下载文件
- IO流传输的数据以文件的形式体现
File类
- 概念:文件和目录路径名的抽象表示形式 可表示文件 也可表示目录
路径分为相对路径和绝对路径
相对路径:不带有盘符号的路径——指相对于自己的目标文件位置 用“/”字符作为目录的分隔字符
绝对路径:带有盘符号的路径——指文件在硬盘上真正存在的路径 用“\”或“/”字符作为目录的分隔字符
File(String pathname)————根据一个路径得到File对象
File file = new File("C:\\Users\\ZY\\Desktop\\学校\\图片\\Debug");
File(String parent, String child)————根据一个目录和一个子文件/目录得到File对象——parent为父路径 child为子文件名
File file1 = new File("C:\\Users\\ZY\\Desktop\\学校\\图片\\", "Debug");
File(File parent, String child)————根据一个父File对象和一个子文件/目录得到File对象
eg: File file2 = new File("C:\\Users\\ZY\\Desktop\\学校\\图片\\");
File file3 = new File(file2, "Debug");
public boolean createNewFile()————创建一个新的文件 如果存在这样的文件,就不创建了
eg: File file = new File("C:\\Users\\ZY\\Desktop\\学校\\图片\\Debug\\abc");
boolean b = file.createNewFile(); // 创建文件是否成功
System.out.println(b);
public boolean mkdir()————创建文件夹 如果存在这样的文件夹,就不创建了 注意这个方法只能创建单层目录 如果创建多层目录得一层一层创建
eg: File file1 = new File("C:\\Users\\ZY\\Desktop\\学校\\图片\\Debug\\def");
boolean b1 = file1.mkdir();
System.out.println(b1);
public boolean mkdirs()————创建文件夹,如果父文件夹不存在,会帮你创建出来 可以创建多层目录 当然也可以创建单层目录
eg: File file2 = new File("C:\\Users\\ZY\\Desktop\\学校\\图片\\Debug\\def\\eee\\fff");
boolean b2 = file2.mkdirs();
System.out.println(b2);
public boolean delete()————删除文件或者文件夹
删除文件夹时 这个文件夹必须是空文件夹 否则不能被删除
- 删除文件不走回收站
eg: File file2 = new File("C:\\Users\\ZY\\Desktop\\学校\\图片\\Debug\\def\\eee\\fff");
boolean b3 = file2.delete();
System.out.println(b3);
public boolean renameTo(File dest)————把文件重命名为指定的文件路径
若路径名相同 则改名
若路径名不同 则为改名并剪切
eg: File file3 = new File("C:\\Users\\ZY\\Desktop\\学校\\图片\\Debug\\def\\eee");
File file4 = new File("C:\\Users\\ZY\\Desktop\\学校\\图片\\Debug\\def\\zy");
boolean b4 = file3.renameTo(file4);————eee改成zy
System.out.println(b4);
eg: File file7 = new File("C:\\Users\\ZY\\Desktop\\学校\\图片\\Debug\\yyy\\eee");
File file8 = new File("C:\\Users\\ZY\\Desktop\\学校\\图片\\Debug\\zy");
boolean b7 = file7.renameTo(file8);————yyy中的eee剪切到Debug中改名为zy
System.out.println(b7);
public boolean isDirectory()————判断是否是目录
eg: File file1 = new File("C:\\Users\\ZY\\Desktop\\学校\\图片\\Debug\\yyy");
boolean b1 = file1.isDirectory();
System.out.println(b1);
public boolean isFile()————判断是否是文件
eg: File file = new File("C:\\Users\\ZY\\Desktop\\学校\\图片\\Debug\\abc");
boolean b = file.isFile();
System.out.println(b);
public boolean exists()————判断是否存在
eg: File file = new File("C:\\Users\\ZY\\Desktop\\学校\\图片\\Debug\\abc");
boolean b2 = file.exists();
System.out.println(b2);
public boolean canRead()————判断是否可读
eg: File file = new File("C:\\Users\\ZY\\Desktop\\学校\\图片\\Debug\\abc");
boolean b3 = file.canRead();
System.out.println(b3);
public boolean canWrite()————判断是否可写
eg: File file = new File("C:\\Users\\ZY\\Desktop\\学校\\图片\\Debug\\abc");
boolean b3 = file.canWrite();
System.out.println(b3);
public boolean isHidden()————判断是否隐藏
eg: File file = new File("C:\\Users\\ZY\\Desktop\\学校\\图片\\Debug\\abc");
boolean b3 = file.isHidden();
System.out.println(b3);
public boolean isAbsolute()————判断是否使用的是绝对路径
eg: File file = new File("C:\\Users\\ZY\\Desktop\\学校\\图片\\Debug\\abc");
boolean b3 = file.isAbsolute();
System.out.println(b3);
public String getAbsolutePath()————获取绝对路径
String absolutePath = file.getAbsolutePath();
public String getPath()————获取相对路径
String path = file.getPath();
public String getParent() ————返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
String parent = file.getParent();
public File getParentFile()————返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
File parentFile = file.getParentFile();
public long getTotalSpace()————返回此抽象路径名指定的分区大小。 返回总容量 单位字节
long totalSpace = file.getTotalSpace();
System.out.println(totalSpace/1024/1024/1024.0+"G");
public long getFreeSpace()————返回此抽象路径名指定的分区中未分配的字节数。返回剩余容量 单位字节
long freeSpace = file.getFreeSpace();
System.out.println(freeSpace/1024/1024/1024.0+"G");
public String getName()————获取名称
String name = file.getName();
public long length()————获取长度。字节数
long length = file.length();
public long lastModified()————获取最后一次的修改时间,毫秒值
eg: long time = file.lastModified();——毫秒值
Date date = new Date(time);————————毫秒值转换为默认格式
String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);——————毫秒值转换为年月日 时分秒
System.out.println(format);
public String[] list()————获取指定目录下的所有文件或者文件夹的名称数组
eg: File file = new File("C:\\Users\\ZY\\Desktop\\学校\\图片");
String[] list = file.list();//获得此目录下所有的文件或文件夹的名称数组
for (String s : list) { //遍历数组
File file1 = new File(file, s);
if(file1.isFile()&&file1.getName().endsWith(".jpg")){
System.out.println(file1.getName());
}
}
public File[] listFiles()————获取指定目录下的所有文件或者文件夹的File数组
eg: File file = new File("C:\\Users\\ZY\\Desktop\\学校\\图片");
File[] files = file.listFiles();
for (File file1 : files) {
if(file1.isFile()&&file1.getName().endsWith(".jpg")){
System.out.println(file1.getName());
}
}
public String[] list(FilenameFilter filter)————过滤文件
- 过滤的方法:根据此方法的返回值进行过滤,返回false不往数组里面装 返回true就装进数组
eg: File file = new File("C:\\Users\\ZY\\Desktop\\学校\\图片");
File[] files = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
File file1 = new File(dir, name);
if (file1.isFile()&& file1.getName().endsWith(".jpg")){
return true;
}else {
return false;
}
}
});
for (File file1 : files) {
System.out.println(file1);
}
public File[] listFiles(FilenameFilter filter)——过滤文件
eg: File file1 = new File("E:\\img");
File[] files1 = file.listFiles(new FileFilter() {
@Override
public boolean accept(File f) {
//System.out.println(pathname);
if (f.isFile() && f.getName().endsWith(".txt")) {
return true;
} else {
return false;
}
}
});
for (File file2 : files1) {
System.out.println(file1.getName());
}
- final:状态修饰符 修饰类 变量 或者成员方法
- Finally:用在try{ } catch{ }语句中 用来释放资源
- Finalize:Object类中的一个方法 用来回收垃圾
修改文件夹的后缀名
import java.io.File;
public class demo {
public static void main(String[] args) {
————————修改文件的后缀名
File file = new File("C:\\Users\\ZY\\Desktop\\photo");
DiGui(file);
}
private static void DiGui(File file) {
if(file.isDirectory()){ //若file是个文件夹 遍历取出里面的文件或者文件夹
File[] files = file.listFiles();
for (File file1 : files) {
if(file1.isFile()&&file1.getName().endsWith(".jpg")){
String absolutePath = file1.getAbsolutePath();//打印文件的绝对路径
int i = absolutePath.lastIndexOf(".");
String s = absolutePath.substring(0, i);//截取到.
File newfile = new File(s + ".png");
file1.renameTo(newfile);//重命名文件
}else {
DiGui(file1);
}
}
}
}
}