异常(Exception)
异常在Java中是用于问题的反馈和处理的机制
Throwable是所有异常或错误的超类
区分异常和错误:
错误:一旦出现,不能处理
异常:出现后可以处理,处理方式:捕获或者继续抛出
捕获方式:(try{}catch(){})
1、多个异常处理方式不同,用多个catch分别捕获分别处理
2、所有异常处理方式都一样,捕获一个父类异常统一处理
3、多个异常分成不同组,不同组之间可以用 | 隔开分组处理(JDK1.7开始)
注意:try-catch同时出现,意味着try不一定能执行成功,try在不是必然成功的前提下,try中的return不一定执行
try{
return 1;
}
catch(Exception e){
e.printStackTrace();
}
报错会提示:This method must return a result of type int,此时在catch中return一个int型数据即可,或在catch方法结束后返回一个int型的值
Java中的一些异常提示:
编译时异常:编译的时候就出现,由于在编译的时候就已经出现,所以要求必须处理。
CloneNotSupportedException 不支持克隆异常
ParseException 解析异常(日期或者字符串格式化时可能会抛出这个异常)
package cn.jay.exer;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Exer14 {
public static void main(String[] args) throws Exception {
/*
String str = "2018-7-18 13:12:11";
SimpleDateFormat sdf = new SimpleDateFormat();
Date date = sdf.parse(str);
System.out.println(date);
//java.text.ParseException: Unparseable date: "2018-7-18 13:12:11"
*/
String str = "2018-7-18 13:12:11";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = sdf.parse(str);
System.out.println(date);
}
}
运行时异常:运行的时候才出现,可以处理,也可以不处理。 --- RuntimeException(所有运行时异常父类)
ArithmeticException 算数异常(整数/0)
ArrayIndexOutofBoundsException数组下标越界异常
NullPointerException 空指针异常
PatternSyntaxException 正则格式异常
NumberFormatException 数字格式化异常
Integer in=new Integer("0x456");
ClassCastException 类转换异常
ArrayStoreException 数组存储异常
InputMismatchException 输入不匹配异常(用switch语句实现简单计算器时出现)
EmptyStackException 空栈异常
ConcurrentModificationException 当前标记异常(标记不匹配)
List<String> list = new LinkedList<>(); //中间代码省略 Iterator<String> it = list.iterator(); //中间代码省略 it.remove(); //不报错 list.remove(); //报错
NotSerializableException 不能序列化异常
后续遇到其它异常会继续更新...
Java中异常处理流程(读取文件时的路径异常处理)
public class Test{ public static void main(String[] args) throws PathNotExistException{ //若读入的文件路径必然正确,则异常不用捕获处理,直接抛出即可 try{ //异常捕获处理后,主函数中不用抛出异常 //读取文件 String msg = readTxt("H:\\test.txt"); }catch(PathNotExistException){ //进行异常处理 System.out.println(e.getMessage()); } } public static String readTxt(String path) throws PathNotExistException{ //文件路径可能不存在,此时应该抛出异常,方便其他使用该文档的人清楚其中可能出现的异常情况,如果方法中捕获的是父类异常,要在上面单独的捕获方法后再catch一个父类异常,且该父类异常必须在单独异常之后 if(path.startWith("H:\\")){ throw new PathNotExistException("警告:路径以H开头!"); } return "文件读取成功!"; } //自定义异常(PathNotExistException) class PathNotExistException extends Exception{ private String message; public PathNotExistException(){} Public PathNotExistException(String message){ this.message =message; } public String getMessage(){ return message; } }
自定义异常:定义一个类继承某个异常类,如果继承的是Exception或者是其它的异常,那么定义了一个编译时异常;如果继承的是RuntimeException或者是它的子类,那么定义的就是一个运行时异常。
方法重载时,对异常的范围没有限定
方法重写时,子类抛出的编译时异常不能超过父类编译时异常的范围