1.try-catch 捕获异常
java异常捕获机制中的try-catch。try块是用来扩上可能出错的代码片段,catch块是用来捕获try块中代码抛出的错误并解决。
public class ExceptionDemo1 {
public static void main(String[] args) {
System.out.println("程序开始了");
try {
String str="";
/*
* jvm在执行代码的过程中若发现了一个异常,则会实例化这种情况的异常实例,
* 并将代码整个执行过程完整设置到异常中来表示该错误报告,设置完毕后将该异常抛出。
* 若抛出异常的这句代码有被try包围,则JVM会检查catch中是否有关注该异常。
* 关注则交给catch解决,否则会将异常抛出到当前方法外,由调用当前方法的代码解决该异常。
*/
System.out.println(str.length());
System.out.println(str.charAt(0));
System.out.println(Integer.parseInt(str));
}catch(NullPointerException e) {
System.out.println("出现了空指针");
}catch(StringIndexOutOfBoundsException e) {
System.out.println("字符串下标越界了");
/*
* 应当养成一个好习惯,在最后一个catch中捕获Exception。
* 避免因未捕获异常导致程序中断
*
* 当多个catch捕获不同异常时,这些异常间存在继承关系,那么子类异常要在上先行捕获,父类异常在下。
*/
}catch(Exception e) {
System.out.println("异常出现了");
}
System.out.println("程序结束了");
}
}
2.finally块
finally块定义在异常捕获机制的最后,可以直接跟在try块之后或者最后一个catch之后。finally块中的代码一定会执行,无论try块中的代码是否抛出异常。 所以通过会把释放资源等操作放在finally中,例如关闭流。
public class ExceptionDemo2 {
public static void main(String[] args) {
System.out.println("开始了");
try {
String str=null;
System.out.println(str.length());
}catch(Exception e) {
System.out.println("异常发生了");
}finally {
System.out.println("finally中的代码执行了");
}
System.out.println("程序结束了");
}
}
3.finally对于流的操作
public class ExceptionDemo3 {
public static void main(String[] args) {
BufferedReader br = null;
try {
br=new BufferedReader(new InputStreamReader(new FileInputStream("src/day07/ExceptionDemo3.java")));
String line=null;
while((line=br.readLine())!=null) {
System.out.println(line);
}
}catch(Exception e) {
System.out.println("出错了");
}finally {
if(br!=null) {
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
4.测试throws和throw
先建立一个Person.java类
package day08;
/**
* 用来测试throw和throws
* @author LvChaoZhang
*
*/
public class Person {
private int age;
public int getAge() {
return age;
}
/*
* 当一个方法中使用thorw抛出一个异常时,就要在方法上使用throws声明该类异常的抛出以通知调用者解决
* 只有RuntimeException及其子类异常使用throw抛出时不强制要求必须使用thorws生命
* 其他异常都是强制要求,否则编译不通过
*/
public void setAge(int age) throws Exception {
if(age<0||age>100) {
throw new Exception("年龄不合法");
}
this.age = age;
}
}
ExceptionDemo4.java
package day08;
/**
* 测试异常的抛出
* @author LvChaoZhang
*
*/
public class ExceptionDemo4 {
public static void main(String[] args) {
Person p=new Person();
/*
* 当调用一个含有throws声明异常抛出的方法时,编译器要求必须处理该异常
* 处理手段有两种:
* 1.使用try-catch捕获并处理
* 2.在当前方法上继续使用thorws声明该异常的抛出
*/
try {
p.setAge(200);
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("年龄不合法呀啊");
}
System.out.println("年龄为:"+p.getAge());
}
}
5.Exception常用方法
package day08;
/**
* Exception常用方法
*
* @author LvChaoZhang
*
*/
public class ExceptionDemo6 {
public static void main(String[] args) {
System.out.println("程序开始了");
try {
String str="abc";
System.out.println(Integer.parseInt(str));
}catch(Exception e) {
//e.printStackTrace();
e.getMessage();
}
System.out.println("程序结束了");
}
}