Java异常处理中的throw和throws关键字到底怎么用,有何区别?
形式上:
throw是一个抛出异常的动作。也就是自己抛出个异常来“玩”,简单点理解就是在写代码的时候,你觉得这里会出现什么问题就把这个问题抛出去,提醒后面使用的人。类似于printf("注意啊,这里有坑,别踩啊。")
throws则是抛出异常的状态。如果你的方法里有异常出现,但是你不想处理(或者处理不了),那就用throws抛出去,给后面的人处理。throw抛出的异常,也可以在这里往外面继续抛。
class ExpressTest() throws Exception{ //这里就是不处理Exception这个对象的异常,直接抛出去
public void printf(){
throw new Exception("注意啊,这个方法有异常,别用啊。"); //可以作为一个单独语句存在,不需要try-catch
}
}
内容上:
throw抛出的是一个异常类的对象,当然了,这个类可以自己创建。即抛出异常的具体内容。
throws则是抛出这个异常的类型,告诉你出现了异常,这个异常可以用try-catch捕获。
位置上:
throw可以在方法内部作为一个单独的代码块存在。
throws必须在方法体的头部,参数列表后面,如果有多个异常,则用逗号隔开(,)。
//定义一个自己的Exception类
class MyException extends RuntimeException{
public MyException(String str){
super(str)
}
}
//测试类
class test{
public static void mian(String[] args){
String str1 = "1";
String str2 = "2";
//用try-catch捕获myMethod可能抛出的两个异常,这是throws抛出来的
try{
myMethod(str1);
myMethod(str2);
}catch(NumberFormatException exception){
//这就是处理,这种处理方法是把异常的提示内容打印出来,内容就是throw抛出时异常类对象的 String类型的参数
System.out.print(exception.getMessage)
}catch(MyException exception){
//这也是处理,而不是用throw抛出
System.out.print(exception.getMessage)
}
}
//测试类里创建一个有异常抛出的方法
void myMethod(String str) throws MyException,NumberFormatException{ //throws只能在参数列表后面,方法内的异常没有处理,只是抛出,那throws在方法外面要继续抛出
try{
int number = Integer.parseInt(str);
if(number == 1){
throw new MyException("输入1异常");//在if语句里也作为单独的语句,而且是自己创建的异常类对象
}
}catch(NumberFormatException exception){
throw new NumberFormatException("数据类型错误!");//throw在catch代码块中作为一个单独的语句
}
}
}
注意:在myMethod这个方法中,其实可以对异常进行处理,比如直接System.out.println("不能输入1!");,或者catch捕获到异常输出:exception.printStackTrace();但是,为了将throw这个关键字的作用表达出来,才这么写的。
说白了,throw就是将异常抛出去,不做处理,当然可以传递一些提示信息作为异常类对象的参数。
throws就是抛出方法里的所有出现的异常,告诉你我这里出现了这些异常,你要注意try-catch一下哈,这些异常在后者使用的时候可以用try-catch捕捉到。