本帖最后由 小鲁哥哥 于 2016-9-30 16:10 编辑
【济南中心】JAVA编程阶梯:基础篇之第十九章
异常就是Java程序在运行过程中出现的错误。
异常的分类 Java中运行时发生的除了异常Exception还有错误Error。
异常(Exception):通常发生可以有针对性的处理方式的。
错误(Error):通常发生后不会有针对性的处理方式。Error的发生往往都是系统级别的问题,都是jvm所在系统发生的并反馈给jvm的。
异常的继承体系
JVM默认处理异常的方式 main函数收到这个问题时,有两种处理方式: a:自己将该问题处理,然后继续运行 b:自己没有针对的处理方式,只有交给调用main的jvm来处理 jvm有一个默认的异常处理机制,就将该异常进行处理. 并将该异常的名称,异常的信息.异常出现的位置打印在了控制台上,同时将程序停止运行
异常处理的两种方式
第一种try catch 捕获异常:
[Java] 纯文本查看 复制代码 try {
// 需要被检测的语句。
} catch (异常类 变量)// 参数。
{
// 异常的处理语句。
} finally {
// 一定会被执行的语句,并且在return之前运行。
} try catch : 对代码进行异常检测,并对检测的异常传递给catch处理。
try finally : 对代码进行异常检测,检测到异常后因为没有catch,所以一样会被默认jvm抛出,异常是没有捕获处理的。但是功能所开启资源需要进行关闭,所以finally只为关闭资源。
try catch finally:检测异常,并传递给catch处理,并定义资源释放。
第二种throws的方式处理异常: 定义功能方法时,需要把出现的问题暴露出来让调用者去处理,那么就通过throws在方法上标识。[Java] 纯文本查看 复制代码
public static void method(int age) throws IllegalArgumentException {
}
编译期异常和运行期异常的区别
Java中的异常被分为两大类:编译时异常和运行时异常。
所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常
编译时异常:Java程序必须显示处理,否则程序就会发生错误,无法通过编译
运行时异常:无需显示处理,也可以和编译时异常一样处理
Throwable的几个常见方法
getMessage():获取异常信息,返回字符串。
toString():获取异常类名和异常信息,返回字符串。
printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
throw的概述
在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
throws和throw的区别
throws:1、用在方法声明后面,跟的是异常类名 2、可以跟多个异常类名,用逗号隔开3、表示抛出异常,由该方法的调用者来处理
throw: 1、用在方法体内,跟的是异常对象名 2、只能抛出一个异常对象名3、表示抛出异常,由方法体内的语句处理
[Java] 纯文本查看 复制代码 if(arr==null) //空指针抛出异常
{
throw new NullPointerException("arr指向的数组不存在");
}
if(index<0 || index>=arr.length) // 角标越界抛出异常
{
throw new ArrayIndexOutOfBoundsException("错误的角标,"+index+"索引在数组中不存在");
}
if(age<0 || age>200) //无效参数抛出异常
{
throw new IllegalArgumentException(age+",年龄数值非法");
} 自定义异常
1、继承自Exception
2、继承自RuntimeException
[Java] 纯文本查看 复制代码 例:class NoAgeException extends RuntimeException
{
/*
为什么要定义构造函数,因为看到Java中的异常描述类中有提供对问题对象的初始化方法。
*/
NoAgeException()
{
super();
}
NoAgeException(String message)
{
super(message);// 如果自定义异常需要异常信息,可以通过调用父类的带有字符串参数的构造函数即可。
}
} 继承Exception和继承RuntimeExcpetion的区别: 继承Exception,必须要throws声明,一声明就告知调用者进行捕获,一旦问题处理了调用者的程序会继续执行。
但是如果使用到了对象的数据,导致都失败的。
继承RuntimeExcpetion,不需要throws声明的,这时调用是不可能编写捕获代码的,因为调用根本就不知道有问题。
一旦发生异常,调用者程序会停掉,并有jvm将信息显示到屏幕,让调用者看到问题,修正代码。在用throws抛出一个的时候,如果这个异常是属于RuntimeException的体系的时候,我们在调用的地方可以不用处理。(RuntimeException和RuntimeException的子类)
异常注意事项
子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。
如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
如何使用异常处理
原则:如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws
区别:
后续程序需要继续运行就try
后续程序不需要继续运行就throws
如果JDK没有提供对应的异常,需要自定义异常。 [Java] 纯文本查看 复制代码 public class Demo {
public static void main(String[] args) {
try {
Util.method(-1);
} catch (IllegalArgumentException e) {
Util.method(18);
}
}
}
class Util {
public static void method(int age) throws IllegalArgumentException {
if (age < 0 || age > 200) // 无效参数抛出异常
{
throw new IllegalArgumentException(age + ",年龄数值非法");
}
System.out.println("年龄为:" + age);
}
}
finally的特点
被finally控制的语句体一定会执行
特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))
finally的作用
用于释放资源,在IO流操作和数据库操作中会见到
final,finally和finalize的区别final是最终的意思。它可以用于修饰类,成员变量,成员方法。它修饰的类不能被继承,它修饰的变量时常量,它修饰的方法不能被重写。
finally:是异常处理里面的关键字。它其中的代码永远被执行。特殊情况:在执行它之前jvm退出。System.exit(0);
finalize:是Object类中的一个方法。它是于垃圾回收器调用的方式。
面试题
[Java] 纯文本查看 复制代码 public class Demo {
public static void main(String args[]) {
Demo t = new Demo();
int b = t.get();
System.out.println(b);
}
public int get() {
try {
return 1;
} catch (Exception e) {
return 2;
} finally {
return 3;
}
}
} try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,所以,返回的结果是2。Return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。
File类的概述
File可以称为文件路径或者文件夹路径
路径分为绝对路径和相对路径
绝对路径是一个固定的路径,从盘符开始
相对路径相对于某个位置,在eclipse下是指当前项目下,在dos下
构造方法
File(String pathname):根据一个路径得到File对象
File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象
File类的创建功能
创建功能
public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了
public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来
File类的重命名和删除功能
public boolean renameTo(File dest):把文件重命名为指定的文件路径
public boolean delete():删除文件或者文件夹
重命名注意事项
如果路径名相同,就是改名。
如果路径名不同,就是改名并剪切。
删除注意事项:
Java中的删除不走回收站。
要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹
File类的判断功能
public boolean isDirectory():判断是否是目录
public boolean isFile():判断是否是文件
public boolean exists():判断是否存在
public boolean canRead():判断是否可读
public boolean canWrite():判断是否可写
public boolean isHidden():判断是否隐藏
File类的获取功能
public String getAbsolutePath():获取绝对路径
public String getPath():获取路径
public String getName():获取名称
public long length():获取长度。字节数
public long lastModified():获取最后一次的修改时间,毫秒值
public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组
举个栗子 [Java] 纯文本查看 复制代码 /**
* 请删除一个带有内容的目录。 删除一个带有内容的目录,必须从里往外删。
*
* @author Somnus
*/
public class Demo {
public static void main(String[] args) {
File dir = new File("E:\\test");
removeDir(dir);
}
/**
* 删除一个目录。
*/
public static void removeDir(File dir) {
File[] files = dir.listFiles();// 如果目录是系统级文件夹,java没有访问权限,那么会返回null数组。最好加入判断。
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
removeDir(file);
} else {
System.out.println(file + ":" + file.delete());// 删除文件。用打印语句验证是否删除成功,是否出现了误删操作。
}
}
}
System.out.println(dir + ":" + dir.delete());
}
}
文件名称过滤器
文件名称过滤器的概述
public String[] list(FilenameFilter filter)
public File[] listFiles(FileFilter filter)
文件名称过滤器的使用
需求:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
[Java] 纯文本查看 复制代码
/**
* 根据指定的过滤器在指定目录下获取所有的符合过滤条件的文件,并存储到list集合中。
* @param dir
* @param filter
* @param list
*/
public static void getFileList(File dir,FileFilter filter,List<File> list) {
File[] files = dir.listFiles();
for(File file : files){
if(file.isDirectory()){
getFileList(file,filter,list);
}else{
//如果是文件,传递到过滤器中去过滤。将满足条件存储起来。
if(filter.accept(file)){
list.add(file);
}
}
}
}
|