1.编译时异常
在编译阶段必须要手动处理,否则代码报错。
编译阶段:
java不会运行代码,只会检查语法是否错误,或者做一些性能的优化。
修改报错方法如下:
原因: parse方法的底层有ParseException。
2.运行时异常
代码出错导致程序出现异常
特点:在编译时不需要处理,是代码运行时出现异常。
运行结果如下:数组越界异常。
总结:
1.编译时异常:
除了 RuntimeExcpetion 和他的子类,其他都是编译时异常。
编译阶段需要进行处理,作用在于提醒程序员。
2.运行时异常:
RuntimeException 本身和所有子类,都是运行时异常。
编译阶段不报错,是程序运行时出现的。 一般是由于参数传递错误带来的问题。
3.异常的作用
作用一:异常是用来查询 bug 的关键参考信息
作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
a.作用一示例如下:
Student 类:
package YiChang.YiChangZuoYong;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student{name = " + name + ", age = " + age + "}";
}
}
ExceptionDemo2 测试类:
package YiChang.YiChangZuoYong;
public class ExceptionDemo2 {
public static void main(String[] args) {
Student [] arr = new Student[3];
String name = arr[0].getName();
System.out.println(name);
}
}
运行结果:
解析:数组内部存储的时引用数据类型,默认初始化值为 null null null(三个null)
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "YiChang.YiChangZuoYong.Student.getName()" because "arr[0]" is null
at YiChang.YiChangZuoYong.ExceptionDemo2.main(ExceptionDemo2.java:7)
b.作用一实例如下
Student2类:
package YiChang.YiChangZuoYong;
public class Student2 {
private String name;
private int age;
public Student2() {
}
public Student2 (String str){
String[] arr = str.split("-");
this.name = arr[0];
this.age = Integer.parseInt(arr[1]);
}
public Student2(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student2{name = " + name + ", age = " + age + "}";
}
}
ExceptionDemo3 类:
package YiChang.YiChangZuoYong;
public class ExceptionDemo3 {
public static void main(String[] args) {
Student2 stu = new Student2("张三,23");
System.out.println(stu);
}
}
运行结果如下:
解析:
“ - ” 表示切割, 但是 Student2 stu = new Student2("张三,23");中的"张三,23"字符串为一个整体当作一个参数,并没有实现切割。
即:arr 0 : 张三,23,
但是 this.age = Integer.parseInt( arr [ 1 ] );
arr [ 1 ] 无法获取元素 (Index 1 out of bounds for length 1).
如何修改Bug呢?
只需将 "-" 改为 "," 即可。
此时运行结果:
C.作用二示例如下:
在Studnet类中加入即可
package YiChang.YiChangZuoYong;
import FanXin.FanXinDemo2.Parent;
public class ExceptionDemo4 {
public static void main(String[] args) {
Student s1 = new Student();
//年龄:(同学) 18-40岁
s1.setAge(50);//就知道了50赋值失败
}
}
s1.setAge(50);//就知道了50赋值失败
//选择1:自己悄悄处理
//选择2:打印在控制台(默认情况下)
运行结果: