Java学习之异常
异常
exception
一般需要程序员管理的异常可以分为两类:
Exception(大类): Runnable异常及其子类 其他异常
-
运行时异常:RuntimeException及其子类,编译时不会出现异常,运行时才会报错,比如数组索引越界
-
编译时异常:编译时就会出现的异常,比如日期解析异常
## 异常的作用
- 查询bug的相应信息
- 异常可以作为方法中的特殊返回值,以便调用者知道代码底层的情况(可以选择打印信息到控制台,也可以转入1)
异常的处理方式
- JVM处理异常的方式:打印异常的名称与内容至控制台,停止执行之后的代码
- 自己处理
/**
* 捕获异常 格式
* try{
* 可能出现异常的代码
* }catch(异常类 变量名){
* 出现异常的处理方法
* }
* try可以与多个catch搭配,catch中也可以写多个异常,用或者符号隔开。
* 捕获多种异常,如果异常中存在父子关系,父类一定要写在下面
* try中若出现异常,那try下面的代码不会执行
*/
public class WebDownload {
public static void main(String[] args) {
int[] arry = {1,2,3,4};
try {
System.out.println(arry[5]);
}catch (ArrayIndexOutOfBoundsException e){ //数组索引异常类名
System.out.println("数组索引不存在");
}
}
}
关于抛出异常,捕获异常的选择
Mac上异常快捷键
command+option+T;
小案例
public class ExcepterTest {
public static void main(String[] args){
GrilFriend grilFriend = new GrilFriend();
Scanner sc = new Scanner(System.in);
//这里使用捕获异常,不让程序停止
while (true) {
try {
grilFriend.setName(sc.next());
grilFriend.setAge(sc.nextInt());
break;
} catch (RuntimeException e) {
System.out.println("输入格式有误,请重新输入!");
}
}
System.out.println("grilFriend:"+grilFriend.getName()+" "+grilFriend.getAge());
System.out.println("结束");
}
}
class GrilFriend{
private String name;
private int age;
public GrilFriend() {
}
public GrilFriend(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
//这里可以使用抛出异常,如果输入不合法,则不能进行赋值
if(name.length()<3||name.length()>10){
throw new RuntimeException();
}
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age < 18 || age > 40){
throw new RuntimeException();
}
this.age = age;
}
}
自定义异常
/**
* 这是一个自定义异常类
* 命名格式:异常名+Exception
* 运行时异常继承Runnable类:表示由于参数错误而导致的问题
* 编译时继承Exception类:提醒程序员检查本地信息
*/
public class NameFormationExcepter extends RuntimeException{
//创建空参构造和有参构造方便调用
public NameFormationExcepter() {
}
public NameFormationExcepter(String message) {
super(message);
}
}
public void setName(String name) {
//这里可以使用抛出异常,如果输入不合法,则不能进行赋值
// if(name.length()<3||name.length()>10){
// throw new RuntimeException();
// }
//使用异常类
if(name.length()<3||name.length()>10){
throw new NameFormationExcepter(name + "这个姓名不符合格式要求");
}
this.name = name;
}
public static void main(String[] args){
GrilFriend grilFriend = new GrilFriend();
Scanner sc = new Scanner(System.in);
while (true) {
try {
grilFriend.setName(sc.next());
grilFriend.setAge(sc.nextInt());
break;
}catch (NameFormationExcepter n){
n.printStackTrace();
}
catch (RuntimeException e) { //父类异常放在下面
System.out.println("输入格式有误,请重新输入!");
}
}
System.out.println("grilFriend:"+grilFriend.getName()+" "+grilFriend.getAge());
System.out.println("结束");
}