1.java.io.File
在File类中大致的基础方法。这个目前只是稍作了解,过一段时间才会开始真正的学;
public class TextFile {
public static void main(String[] args) {
File f = new File("e:/Text/java.txt");//定义一个文件对象;
File f1 = new File("e:/Text");//定义一个目录对象;
File f2 = new File(f1,"d.txt");//和第一个f对象差不多,只是将路径分开写了,也可以表示没创建的文件;
try {
f2.createNewFile();//创建一个新文件(之前不存在的)
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(f.isFile()) {
System.out.println("这是一个文件");
}
if(f1.isDirectory()) {
System.out.println("这是一个目录");
}
}
}
以下程序可以遍历一个目录,并在控制台显示出来;
public class SimpleFileText {
public static void main(String[] args) {
File f = new File("e:/Text");
SimpleFileText sf = new SimpleFileText();
sf.paintFile(f,1);
}
public void paintFile(File f ,int l) {
for(int i=1;i<l;i++) {
System.out.print("-");
}
System.out.println(f.getName());
if(f.isDirectory()) {
//使用listFile()方法,将文件目录下的所有文件目录放入数组fileList
File[] fileList = f.listFiles();
//用for循环输出
for(File temp:fileList) {
paintFile(temp, l+1);//嵌套的方式循环;
}
}
}
}
2.异常机制
Java用于处理程序中错误的一种机制;Java是采用面向对象的方式来处理异常的;
处理的过程有抛出异常和捕获异常;
以下是几种常见的异常:
(1)空指针异常(NullPointerException);如以下代码:
public class Firstex {
public static void main(String[] args) {
infor i = null;
//当对象是空的时候,就是没有new,那么就会报出这种异常;
i.start();
//解决办法是可以在调用前加一个if,判断对象是否为空,如果不是空在进行调用;
//if (i != null) {
// i.start();
// }
}
}
class infor{
public void start() {
System.out.println("我的天!");
}
}
(2)类型转换异常(ClassCastException):
public class Firstex {
public static void main(String[] args) {
infor i = null;
//简单总结,下面是指父类对象,是什么对象取决于new哪个类(属于父类还是子类)
Firstex fx = new Firstex();
i = (infor) fx;//这样转型就会报异常;因为子类引用无法指向父类对象;
}
}
class infor extends Firstex{
public void start() {
System.out.println("我的天!");
}
}
(3)数组越界异常(ArrayIndexOutOfBoundsException):访问的元素下标超过了数组的长度;
(4)数字格式异常(NumberFormatException);可能在包装类中出现;
3.异常处理方法
(1)捕获异常(try,catch,finally)
- 一个try语句至少要带有一个catch语句或者finally语句;每个try语句可以跟随多个catch语句,用于处理不同类型的异常;
- catch里面常用的一些方法都继承于Throwable,它的两个大的异常分支为IOException和RuntimeException;
- catch中的几个基本方法:
(1)toString()方法,显示异常的类名和产生的原因;
(2)getMessage()方法,只显示异常的原因,但是不显示异常的类名;
(3)printStackTrace()方法,用于跟踪异常事件发生的内容;
try {
//可能出现异常的语句,在哪条语句出现异常,就结束在那条语句,不会继续往下执行;(跳出try)
}catch(Exception e) {
e.printStackTrace();//输出堆栈痕迹
//捕捉异常,出现异常执行的程序
}finally{
//即便出现异常,也需要执行的程序;(即必须执行)
}
由于try语句后面可以跟随多个catch,这就可能引出catch异常的排序,意思就是子类异常必须要放在父类异常前面,否则包含子类异常的catch就无法捕捉异常;
例如:
public class IOText {
public static void main(String[] args) {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("e:/a.txt"));
while(br.read()!=-1) {
System.out.println("读出的信息:"+br.read());
}
}catch(FileNotFoundException e){//这个FileNotFoundException就属于IOException的子类,所以必须要放在前面,放在IOException的catch后面就会报错;
System.out.println("文件没有找到");
e.printStackTrace();
} catch (IOException e) {
System.out.println("读出文件错误");
// TODO Auto-generated catch block
e.printStackTrace();
}finally {//finally语句,无论是否有异常都会执行;
System.out.println("始终执行");
}
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在br.close()时,最好还是要进行一次判断,判断br是否为空,这样就可以避免空指针异常了;
最后finally语句中最好不要添加return语句;为什么?
因为finally的return语句可能会覆盖掉之前写的return语句,即try或者catch语句中的return返回值;
(2)声明异常
声明异常和之前的捕捉异常有些不同;异常是只要在可能出现异常的地方就使用throws将异常类型抛出,就是属于一种异常的声明(我知道这里有个异常但是就是不给你解决,谁需要这些调用代码谁就解决其实这样更加便利,至少初始代码更加简洁);这就像下面的例子,当调用optnFile这个方法时,就要使用try,catch语句捕捉异常,否则就会报错;
public class TextFile {
public static void main(String[] args) {
FileInputStream str = null;
//最终这里是对异常的处理;
try {
str = new TextFile().openFile();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println(str);
}
//这里可以直接使用throws抛出异常,但是并非抛出异常就可以了,最终还是需要解决;
FileInputStream openFile() throws FileNotFoundException {
FileInputStream fs = new FileInputStream("e:/a.txt");
return fs;
}
}
看仔细,上面的是throws,这是生声明抛出异常,还有一个throw,他们两者的部分区别:
throw:主要是抛出一个具体的异常类型,通常位于方法或者类的内部,用于程序员手动抛出。(只能单个异常)例如:
throw new +某个具体的异常();
当然这样写还是要用一个try和catch语句抛出才行,不然会报错;
throws:主要是声明异常类型,就是可能出现的异常,可以有多个;
在方法重写的情况下(需要注意):
如果父类没有抛出异常,子类也不能抛出异常;
子类抛出的异常不能超过父类;
4.自定义异常
对于自定义异常来说,其实就是指创造一个与异常相关的类,可能已有的异常无法满足你目前的需要,而创建的一种异常;
如下:
public class myException extends IOException{
public myException() {
}
public myException(String str) {
super(str);
}
}
异常就是一种类,它的创建也和类一样,看了一下源码,基本所有的异常类都是由构造函数组成;并且自定义的异常和一般异常的使用方式相同;