throw&throws
throws
使用throws声明异常类型
定义
使用throws关键字,标明将要抛出的任何类型的异常,通过throw将将要产生的异常抛出。
可能这样有些抽象,不是很好理解。举个例子,汽车在行驶的过程中可能会产生毛病,故障,但是汽车本身是不会有处理故障的能力的,那么就会由开车的人去解决这些故障。类似。当我们的方法中可能会出现异常牡丹石方法自身无能力处理异常,这是我们就可以在方法的声明处,由throws抛出异常,谁来使用该方法,谁去解决这个异常。
常见的语法结构是这样的:在方法定义时声明该方法要抛出的异常类型
public void method() throws Exception1, Exception2, Exception3... ExceptionX{
//可能会产生异常的代码片段
}
案例
次处的案列链接的是案例代码位置未解决完的片段,定义了一组除数。让我们看看怎样进行修改自己不需要处理,由调用者去解决这些问题。
- 在方法声明处添加throws关键字
- 将可能发生异常的类型放在throws后面
- 删除相关自己的处理语句,调整并且保留
package com.kilig.test;
import java.util.Scanner;
public class tryDemoThree {
public static void main(String[] args) {
// TODO Auto-generated method stub
int result = test();
System.out.println("The Quotient of two numbers is : "+result);
}
private static int test() throws ArithmeticException {
Scanner input =new Scanner(System.in);
System.out.println("======BEGAIN======");
// try {
System.out.print("Please input first number: ");
int one = input.nextInt();
System.out.print("Please input secound number: ");
int two = input.nextInt();
// return one/two;
// }catch(ArithmeticException e) {
System.out.println("Divider cannot be zero");
// return 0;
// }finally {
System.out.println("======OVER======");
// return -1000000;
// }
return one/two;
}
}
在调用者位置,我们需要对该片段进行try-catch处理,因为这一部分是会发生异常的,在eclips中,有快捷键去操作,如图,右键选中代码块,然后选择Surrond With,然后选择Try-catch块。会发现程序自动棒我们分割了try-catch块,然后我们补充完他
代码正常运行
正常报错
这个是由于我们没有对这个异常进行报备,所以由printStackTrace直接告诉异常的原因
此时我们可以通过“,”来标识不同异常原因进行报备,使得运行代码程序正常的到结果。
方案:throws后面接多个异常类型,然后中间用逗号分割
throw
在Java中,throw用来抛出一个异常。常见语法
throw new IOException();
throw抛出的只可以是可抛出类Throwable或者其子类的实例对象
比如:
方案一:自己生成的异常自己处理
public void method(){
try{
//代码段1
throw (异常类型 ex);
}catch(){
//对异常进行处理的片段2
}
}
方案二:谁调用异常方法,谁来处理异常
public void method() throws 异常类型{
//代码段1
throw new 异常类型();
}
问题
问:我们都想着避免抛出异常,但是为什么在这儿我们要着急自己写出异常类型呢?
答:由于在程序运行过程中,我们有时不可规避的会面对异常,其实这样做
- 规避可能出现的风险
- 完成一些程序逻辑
这样做可以完成一些特定的场景组合
案例场景
加入我们自己经营一家旅馆KiligHouse,那么大家在住宿时规定是必须要提供身份证明ID的。而且如果年龄在18岁以下的小朋友是必须有亲属陪同入住,不可以单独入住。针对这一场景,我们就可以借助throw抛出异常处理异常进行解决。
方法1:谁调用异常方法,谁来处理异常
package com.kilig.test;
import java.util.Scanner;
public class TryDemoFour {
public static void main(String[] args) {
// TODO Auto-generated method stub
testAge();
}
// 描述KiligHouse的入住规则,年龄在18岁以下,需要有人陪同
public static void testAge() throws Exception {
System.out.println("===请输入年龄信息!===");
Scanner input =new Scanner(System.in);
int age = input.nextInt();
if (age<18 || age>80) {
throw new Exception("年龄在18岁以下,需要有人陪同");
}else {
System.out.println("===欢迎光临!===");
}
}
}
但是dang当输入字母时呢?
可以看到,在input处就会产生异常,而不会产生其他的异常信息。这就是在在特定条件下处理的信息。
方法2:自己生成的异常自己处理(调用者可以选择自己处理或者继续向上抛异常)
那么结果呢?
我们可以看到,是一样的
注意:当用throws在方法声明处抛出异常时,此时可以抛出与throw对象相同的异常类型或者是父类,不可以是子类!!