异常:
在Java中针对问题的反馈以及处理的一套机制
Throwable----代表异常或错误的父类
Error(错误) 是一个合理(符合语法且代码执行逻辑没有问题)的应用程序,不应该处理
Exception(异常) 是一个合理的应用程序,出现之后可以处理也可以不处理
运行时异常-----编译没有错,运行有错 可以处理也可以不处理
运行时异常的父类 RuntimeException
ArithmeticException
ArrayIndexOutOfBoundsException
NullPointerException
ClassCastException
CloneNotSupporttedException
NumberFormatException
编译时异常----编译有错 一定要处理(抛出、捕获)
CloneNotSupporteEception
ParseException
捕获的方式:
1、抛出的所有的异常需要进行统一处理,捕获是catch块里的异常类需要是这些抛出异常类的公共父类
2、抛出的所有异常进行单独处理,在catch块需要提供对应的catch进行分别处理
3、抛出的异常希望进行分组处理,jdk1.7提供分组捕获,一组之间的异常通过|来进行统一处理
finally
这个区域表明不管有没有异常或者异常有没有捕获都要执行的区域
try {
//String s=readTxt("H:1.txtt");
String s=readTxt(null);
System.out.println(s);
}
//捕获的是异常类的对象
//所有捕获异常的公共父类----可以统一处理捕获的不同的异常
/*catch(Exception e){
//打印异常的栈轨迹
e.printStackTrace();
}*/
//一个组里的异常通过|来进行区分,一组的异常处理方式是一样的
catch(PathNotExitsExption | FileNotExitsExption |NullPointerException e) {
e.printStackTrace();
}
案例:
异常的了解
public class ExceptionDemo2 {
public static void main(String[] args) {
//读取文件内容
//方法抛出的异常,方法调用者需要进行异常处理
//try块---存放可能会出错的代码
//如果try块出错了就用catch块进行捕获处理
//try-catch一定会直接结束,执行下一个语句
try {
//String s=readTxt("H:1.txtt");
String s=readTxt(null);
System.out.println(s);
} catch (PathNotExitsExption e) {
// TODO Auto-generated catch block
//System.out.println("亲,路径有问题...");
//处理异常
System.out.println(e.getMessage());
}catch(FileNotExitsExption e){
//异常处理
System.out.println(e.getMessage());//父类的属性
}catch(NullPointerException e){
//打印异常的栈轨迹(从下往上看)
e.printStackTrace();
}
//读取完成
//当异常捕获之后后面的代码正常执行
System.out.println("读取文件完毕...");
}
//方法上抛出异常, 可以抛出多个异常
public static String readTxt(String path) throws PathNotExitsExption, FileNotExitsExption,NullPointerException {
//
//判断参数是否为空
//可以处理,也可以不处理
if(path==null) {
//反馈问题
throw new NullPointerException("亲,参数为null...");
}
//可能文件类型不对
//对文件类型进行判断
if(!path.endsWith(".txt")) {//不是.txt的文件都会进来
throw new FileNotExitsExption("亲,文件类型有问题...");
}
//可能会出现文件所在路径不存在
//对路径进行判断
if(path.startsWith("H")) {//如果以H盘符开头就会不存在
//问题反馈
//抛出异常-----后面的所有代码都不执行----抛出的是一个异常类对象
throw new PathNotExitsExption("亲,路径有问题...");
}
//开始读取文件内容
return "文件的内容";
}
}
//自定义的异常类----路径异常 继承异常类
class PathNotExitsExption extends Exception{
private String message;
public PathNotExitsExption(String message) {
this.message=message;
}
public String getMessage() {
return message;
}
}
class FileNotExitsExption extends Exception{
public FileNotExitsExption(String message) {
super(message);//调用父类的有参构造,给父类的属性赋值
}
}
重写与重载
class ED1{
//方法重载
public void m()throws IOException{}
public void m(int i) {}
}
class ED2 extends ED1{
//重写-----子类异常不能抛出比父类更大(范围)的异常
//不看个数只看范围
//针对的是编译时异常,运行时异常不影响
@Override
public void m() throws IOException,EOFException,NullPointerException{
// TODO Auto-generated method stub
}
}
public class ExceptionDemo5 {
public static void main(String[] args) {
try {
System.out.println(1/0);//当代码没错,finally也走了
System.out.println("try");
} catch (Exception e) {
System.out.println("catch");//当catch走完,finally也走
}finally {
System.out.println("finally");
}
}
}
小案例:
public class ExceptionDemo6 {
public static void main(String[] args) {
System.out.println(m());
}
public static int m() {
try {
return 1;//因为这个代码可能会出错
} catch (Exception e) {
// TODO: handle exception
return 3;///代码有错走这一行代码
}finally {
return 4;//无论有没有异常,代码一定会执行
}
//return 5;//报错---finally块里一定会执行return,这句话一定执行不到了
}
}
public class ExceptionDemo7 {
public static void main(String[] args) {
System.out.println(m());
}
public static int m() {
int i=1;
try {//不会捕获异常
//代码还是从上往下执行
//i=1
//return 1++ ----return 1,当要返回时,还在台人员块里
//finally块必须执行,return这个语句执行不完,如果执行完finally才走return
//把这个return 1进行挂起,就不执行了
//去执行finally块,i=2,i++ i=3
//又回到了刚才挂起的语句,紧接着执行挂起的语句,执行完挂起的语句,执行return 1
return i++;
} finally {
i++;
}
}
}
public class ExceptionDemo8 {
public static void main(String[] args) {
System.out.println(m());
}
public static Person m() {
Person p1=new Person();
try {
p1.age=10;
p1.name="lili";
p1.gender='女';
return p1;//挂起的是地址值
} finally {
p1.age=12;
p1.name="tom";
p1.gender='男';
}
}
}
class Person{
String name;
int age;
char gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", gender=" + gender + "]";
}
}