- Throwable的成员方法
定义在最顶级Throwable类中
a.实例如下:
e.printStackTrace(); 将异常的所有信息红色的字体打印在控制台,不会结束虚拟机,仅仅只是打印的操作。
- 抛出处理
throws
注意:写在方法定义处,表示声明一个异常,告诉调用者,使用本方法可能会有哪些异常
编译时异常:必须要写
运行时异常:可以不写
throw
注意:写在方法内,结束方法,手动抛出异常对象,交给调用者,方法中下面的代码不在执行了
a.示例如下
package YiChang.YiChangZuoYong;
public class ExceptionDemo7 {
public static void main(String[] args) {
//需求:定义一个方法求数组的最大值
int [] arr = null;
int max = 0;
try {
max = getMax(arr);
} catch (NullPointerException e) {
System.out.println("空指针异常");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("索引越界异常");
}
System.out.println(max);
}
public static int getMax(int[] arr) throws NullPointerException,ArrayIndexOutOfBoundsException{
if (arr == null) {
//手动创建一个异常对象,并把这个异常交给方法的调用者处理
//此时方法就会结束,下面的代码不会在执行了
throw new NullPointerException();
}
if (arr.length == 0) {
//手动创建一个异常对象,并把这个异常交给方法的调用者处理
//此时方法就会结束,下面的代码不会在执行了
throw new ArrayIndexOutOfBoundsException();
}
System.out.println("看看我执行了吗?");
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
}
小结:抛出throw throws
在方法中,出现了异常。
方法就没有继续运行下去的意义了,采取抛出处理。
让该方法结束运行,并告诉调用者出现了问题。
- 练习
a.键盘录入数据
需求:
键盘录入自己心仪的女朋友姓名和年龄。
姓名的长度在3-10之间,
年龄的范围为18-40岁,
超出这个范围是异常数据不能赋值,需要重新录入,一直录到正确为止。
提示:
需要考虑用户在键盘录入时的所有情况。
比如:录入年龄时超出范围,录入年龄时录入了 abc 等情况。
抛出 捕获
告诉调用者出错了 不让程序停止
b.代码如下:
GirlFrend类:
package YiChang.YiChangZuoYong;
public class GirlFriend {
private String name;
private int age;
public GirlFriend() {
}
public GirlFriend(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
int len = name.length();
if (len < 3 || len > 10) {
throw new RuntimeException();
}
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) throws RuntimeException{
if (age <18 || age > 40 ) {
throw new RuntimeException();
}
this.age = age;
}
public String toString() {
return "GirlFriend{name = " + name + ", age = " + age + "}";
}
}
Test类:
package YiChang.YiChangZuoYong;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//创建键盘录入的对象
Scanner sc = new Scanner(System.in);
//创建女朋友的对象
GirlFriend gf = new GirlFriend();
//3.接收女朋友的姓名
while (true) {
try {
System.out.println("请输入你心仪女朋友的名字:");
String name = sc.nextLine();
gf.setName(name);
//接收女朋友的年龄
System.out.println("请输入你心仪女朋友的年龄:");
String ageStr = sc.nextLine();//不能用nextInt 只能接收整数,但输入abc则会报错
int age = Integer.parseInt(ageStr);//做一个类型转换
gf.setAge(age);
//如果所有的数据都正确,那么跳出循环
break;
} catch (NumberFormatException e) {
System.out.println("年龄的格式有误,请输入数字");
continue;
} catch (RuntimeException e) {
System.out.println("姓名的长度或者年龄的范围有误");
continue;
}
}
//5.打印
System.out.println(gf);
}
}
运行结果如下
4.自定义异常(为了让控制台的报错信息更加的见名之意)
a.定义异常类
b.写继承关系
c.空参构造
d.带参构造
实例如下:
NameFormatException异常类:
package YiChang.YiChangZuoYong;
public class NameFormatException extends RuntimeException{
public NameFormatException() {
}
public NameFormatException(String message) {
super(message);
}
}
AgeOutOfBoundsException异常类:
package YiChang.YiChangZuoYong;
public class AgeOutOfBoundsException extends RuntimeException{
public AgeOutOfBoundsException() {
}
public AgeOutOfBoundsException(String message) {
super(message);
}
}
技巧:
//NameFormat:当前异常的名字表示由于参数错误而导致的问题
//Exception: 表示当前类是一个异常类
//运行时: RuntimeException 核心就表示由于参数错误而导致的问题
//编译时: Exception 核心 提醒程序员检查本地信息
同理:
在Test测试类中的修改:
运行结果如下