-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
一、异常
我们在编写程序的时候,可能会有很多的问题存在。为了将来方便的表示这些的问题的原因,类型,位置。java就提供了异常对象供我们使用。
异常:程序出现了不正常的情况。
举例:
电脑键盘不灵了。
原因:敲快了,进水了,线路坏了。
解决方案:
A:敲快了 -- 慢点敲
B:进水了 -- 把水干净
C:线路坏了 -- 去中关村休,买个新的。
对应着异常:
Throwable
Error:严重 问题,通常出现重大问题如:运行的类不存在或者内存溢出等。是不需要处理的。
一般这种情况是需要修改代码的。
Exception:不严重
编译期间:这个是我们需要处理的。
运行期间:这个是我们不需要处理,这个是需要修改的代码。
如果程序有异常,怎么解决?
1:编写处理代码
基本格式:
try{
可能发生问题的代码。
}catch(异常类名 变量名){
异常处理代码。
}
2:抛出
一个代码中,有多个问题,怎么解决呢?
A:一个个用异常处理方案解决。
B:针对所有问题,写一个try...catch代码。
try{}catch(){}catch(){}...
注意:在异常处理中,一旦try里面有问题了。就直接跳到catch里面执行。
针对多个异常,写一个try的代码,catch里面会不会有顺序问题呢?如果异常是平级关系,没有顺序问题。
如果异常存在着子父关系,父一定要放在最后。
Throwable中的方法:
public String getMessage():返回的是异常的消息字符串。
public String toString():返回异常的简单描述信息。
全路径类名 : 消息字符串
public void printStackTrace():把错误信息显示在控制台。
finally:
基本格式:
try{
可能有问题的代码
}catch(异常类名 变量名){
处理方案。变量名.printStackTrace();
}finally{
释放资源。(数据库,IO)
} finally:里面代码永远会执行。
1:请问final,finally,finalize的区别?
final是关键字修饰符。被final修饰的方法不能被重写,修饰的变量是常量,修饰的类不能被继承。
finally是关键字,在异常处理中,try子句中执行需要运行的内容,catch子句用于捕获异常,finally子句表示不管是否发生异常,都会执行。finally可有可无。但是try...catch必须成对出现。
finalize() 方法名,Object类的方法,Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象进行调用。
2:finally里面的代码真的永远会执行吗?
会永远执行。但是有一个特殊情况:在代码执行到finally之前,jvm就退出了。
3:加入在catch里面有return语句,请问finally里面的代码还会执行吗?如果执行,是在return前,还是return后?
会执行。在return前执行。
准确答案:在return之间执行。
把异常抛出,方法调用中常见。
怎么抛出呢?
格式:
在方法名称后面跟一个关键字:throws 异常类名
异常的分类:
A:Exception下非RuntimeException 编译时异常
B:RuntimeException 运行时异常
异常处理:
A:try...catch...finally
B:throws
请问我们选择谁?
如果能够处理,尽量选择A。否则选择B。
运行时期异常和编译时期异常的区别?
A:运行时期异常
是不需要try...catch或者throws的。
B:编译时期异常
编译时期异常是需要进行处理的。
java虽然已经考虑到了很多种异常情况,但是,有些需求java程序是考虑不到的。比如说:我要求学生的分数不能为负数。
那么,针对这种情况,我们就要编写自定义异常类进行处理。
如何编写一个自定义异常类呢?
就是自定义一个类,去继承Exception或者RuntimeException。开发中:一般继承自RuntimeException。
二、File类
File因为数据在硬盘上最常见的方式,就是文件。而文件本身有很多的属性,那么,java为了方便我们对文件进行操作,就提供了File类供我们使用。
File既可以表示文件,也可以表示文件夹。是文件和目录路径名的抽象表现形式
构造方法:
File(String pathname):根据指定的路径创建File对象。
File(String parent, String child):根据指定的父文件夹和子文件或者文件夹创建File对象
File(File parent, String child):根据指定的父文件夹对象和子文件或者文件夹创建File对象。
常见方法:
创建功能:
创建文件:public boolean createNewFile()如果指定的文件不存在,就创建。如果存在,就不创建。
创建文件夹:public boolean mkdir()创建指定的目录,如果存在,就不创建。
创建文件夹public boolean mkdirs()创建指定的目录,如果存储,就不创建。这个时候,如果父目录不存在,它也会自动创建。
绝对路径:以盘符开始的路径。相对路径:不以盘符开始的路径。
删除功能:
public boolean delete():既可以删除文件,也可以删除文件夹。取决于你使用的对象。
判断功能:
boolean exists():判断file对象是否存在
boolean isFile():判断file对象是否是文件
boolean isDirectory():判断file对象是否是文件夹
boolean isAbsolute():判断file对象是否是绝对路径
boolean canRead():判断file对象是否可读
boolean canWrite():判断file对象是否可写
boolean isHidden():判断file对象是否隐藏
获取功能:
String getAbsolutePath():绝对路径 String getPath():相对路径
String getName():文件名称 long length():文件大小,单位是字节
long lastModified():上次修改时间的毫秒值。
public static File[] listRoots():列出可用的系统文件根目录
public String[] list():返回的是指定目录下所有文件或者文件夹的名称数组
public File[] listFiles():返回的是指定目录下所有文件或者文件夹对象数组
获取指定目录下指定后缀的文件名称:
A:先获取指定目录下所有文件或者文件夹的File数组,然后再遍历的时候进行判断。满足条件的就输出该File的名称。
B:直接获取指定目录下满足条件的String(File)数组。然后遍历数组即可。
文件名称过滤器:FilenameFilter
public String[] list(FilenameFilter filter);
三、递归。
递归:方法定义调用方法本身的现象。
注意事项:
A:递归一定要有出口。否则就会死递归。
B:递归的次数不要过多。否则内存溢出
递归求阶乘:出口:1!=1规律:n!=n*(n-1)!
public class DiGuiDemo2 {
public static void main(String[] args) {
int num = 5;
System.out.println(jc(num));
}
/*
* 返回值:int 参数:int n 如果jc(n)表达的是n的阶乘的话, 请问,n-1的阶乘如何表示? jc(n-1)
*/
public static int jc(int n) {
if (n == 1) {
// 出口
return 1;
} else {
// 规律
return n * jc(n - 1);
}
}
}
需求:删除指定的目录。(目录是带有目录或者文件的)
public class DeleteFile {
<span style="white-space:pre"> </span>public static void main(String[] args) {
File file = new File("f:\\test");
deleteFiles(file);
}
private static void deleteFiles(File file) {
//第1步封装文件夹
File[] fileArray = file.listFiles();//1,test_deleteFiles; 2.1,aaa_deleteFiles; 2.2,bbb_deleteFiles;
if (fileArray != null) {
//如果封装的文件夹不为空,那么就进行遍历,获得每一个文件或文件夹
for (File f : fileArray) {
if (f.isDirectory()) {
//如果被封装文件夹的子文件还是个文件夹,那么继续封装起来进行判断
deleteFiles(f);
} else {
//如果被封装起来的子文件夹正好就是个文件,那么直接删除
System.out.println(f.getName() + "***" + f.delete());
}
}
}
System.out.println(file.getName() + "***" + file.delete());
// 如果文件夹为空,直接删除. 当if语句执行完时,就表示每次封装的目录下的文件被删除完毕。
}
}
五、properties
Properties:是一个表示属性集的集合。可以从流中加载数据或者把数据保存到流中。键和值都是字符串。是唯一一个可以和IO流结合使用的集合类。
Properties的父亲是Hashtable,所以,我们知道它是一个Map体现的。那么,我们就存储数据并遍历。
Properties作为集合的特殊功能:
修改功能:
public Object setProperty(String key,String value)
获取功能:
public String getProperty(String key)
public String getProperty(String key,String defaultValue)
public Set<String> stringPropertyNames()
public static Properties getProperties():系统属性
集合和IO的结合方式就是,参数传递IO流对象。
public void list(PrintStream out)
public void list(PrintWriter out)把集合中的数据按照键值对的形式存储到文本文件中。
六、打印流
PrintStream:字节打印流
PrintWriter:字符打印流
打印流特点:
A:可以写入任意类型的数据。
B:可以自动刷新。必须先启动,并且是使用println,printf及format方法才有效。
C:可以直接对文件进行写入。
哪些流对象是可以直接对文件进行操作的?
看构造方法,是否有同时接受File和String类型的参数构造。
注意:打印流只有写数据的,没有读取数据的。
构造方法:
PrintWriter(String fileName)
public class PrintWriterDemo3 {
public static void main(String[] args) throws IOException {
// PrintWriter pw = new PrintWriter("c.txt");
// PrintWriter(Writer out, boolean autoFlush)
PrintWriter pw = new PrintWriter(new FileWriter("d.txt"),true);
// pw.print("hello");
pw.println("hello"); //写数据,换行,刷新
pw.println("world");
pw.println("java");
pw.close();
}
}
七、序列流
序列化:把对象按照流一样的方式传输或者存储。
反序列化:把网络中的流数据或者文件中的流数据还原成对象。
把对象存储到文本文件。
ObjectInputStream:ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化
Object readObject()
ObjectOutputStream:ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。
void writeObject(Object obj)
public class ObjectStreamDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 创建序列化流对象
// 还原对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
"oos.txt"));
Object obj =ois.readObject();
ois.close();
System.out.println(obj);
}
}