在学习两者区别前,先了解一下什么是throw,什么是throws吧,有需要的小伙伴可以赋值代码自己去尝试。
throw
throw关键字用于显式抛出异常,抛出的时候是抛出的是一个异常类的实 例化对象。
在异常处理中,try语句要捕获的是一个异常对象,那么此异常对象也可以自己抛出。
public static void main(String[] args) {
//System.out.println(10/0);//由虚拟机在运行时出现异常,抛出一个此类的对象
/*
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.ff.javaexception.day2.ExceptionDemo5.main(ExceptionDemo5.java:7)
*/
try {
subFileType(null);
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
}
public static String subFileType(String fileName){
if(fileName==null){
//在方法体中,主动显示的抛出一个对用的异常对象,告知(通知)方法调用处,传入的数据有问题
throw new NullPointerException("文件名为null了");
}
return fileName.substring(fileName.lastIndexOf(".")+1);
}
throws
throws,定义一个方法的时候可以使用throws关键字声明,表示此方法不处理异常,而交给方法调用处进行处理。
任何方法都可以使用throws关键字声明异常类型,包括抽象方法。
子类重写父类中的方法,子类方法不能声明抛出比父类类型更大的异常(针对编译期异常)。
public abstract class ExceptionDemo4 {
abstract void eat() throws Exception;
}
public class Demo extends ExceptionDemo4 {
/*
方法重写父类方法
返回值,方法名,参数必须一样
访问权限修饰符 大于等于父类方法权限
声明的异常必须小于或等于父类声明的异常
*/
@Override
public void eat() throws UnsupportedEncodingException,Exception {
}
}
使用了throws的方法,调用时必须处理声明的异常,要么使用try-catch,要么继续使用throws声明。
public static void main(String[] args) {
try {
test1();
} catch (UnsupportedEncodingException e) {
System.out.println("编码不支持");
}catch (ParseException p){
System.out.println("日期解析异常");
}catch (NullPointerException n){
System.out.println("对象为空");
}
System.out.println("aaaaa");
}
public static void test1() throws UnsupportedEncodingException, ParseException {
test2();
}
public static void test2() throws UnsupportedEncodingException, ParseException {
test3();
}
/*
throws NullPointerException 运行时异常 声明为运行时异常,方法调用处可以处理也可以不处理
UnsupportedEncodingException 声明为编译期异常,那么调用在编译期间必须处理
一般情况下,throws后面一般都声明的是编译期异常明抛出
一般情况下,位于底层的方法都选择向上声
*/
public static void test3() throws NullPointerException, UnsupportedEncodingException, ParseException {
String s = "中国";
s.getBytes("gbk");
SimpleDateFormat sdf = new SimpleDateFormat("");
sdf.parse("");
}
throw和throws的区别
throw用于方法体中,用来抛出一个实际的异常对象,使用throw后,要么使用try catch捕获异常,要么使用throws声明异常 。
throws用于方法声明处,用来声明该方法可能发生的异常类型,可以是
多个异常类型,用来强制调用该方法时处理这些异常。
抽象方法也可以使用throws。