Java基础(4)-轻松了解Java异常

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)

  1. 一个try语句至少要带有一个catch语句或者finally语句;每个try语句可以跟随多个catch语句,用于处理不同类型的异常;
  2. catch里面常用的一些方法都继承于Throwable,它的两个大的异常分支为IOException和RuntimeException;
  3. 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);
	}
}

异常就是一种类,它的创建也和类一样,看了一下源码,基本所有的异常类都是由构造函数组成;并且自定义的异常和一般异常的使用方式相同;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神秘的天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值