Java异常处理
throw new RuntimeException ();
异常的2个作用
1.异常用来查询bug的关键参考信息
2. 异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
异常的捕获
当程序JVM默认处理异常时,遇到异常会爆红,无法继续执行下去
但是当我们手动处理时,可以让异常的语句后面的程序任然能执行
手动处理异常语法
try {
预测可能出现异常的语句
}catch(异常类名 随便一个变量名){
当语句异常与预测v的异常类名一致时,运行该花括号里的语句
}
下面的代码演示了手动处理异常的情况
看看运行结果
异常的抛出
- 将异常输出在控制台上: throw new 异常类名();
- 在方法名后面加上throws 异常类名1,异常类名2
对于第二种抛出:编译时类型必须要写,运行时类型可以不写
public class Throw {
public static void main(String[] args) {
int [] a = {0};
int m = 0;
try {
m = max(a);
} catch (NullPointerException e) {
System.out.println("空指针异常");
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("索引越界异常");
}
System.out.println(m);
}
static int max(int arr[]){
int maxn = arr[0];
if(arr.length==1)
{
throw new ArithmeticException();
}
if(arr==null){
throw new NullPointerException();
}
for (int i : arr) {
if(i>maxn)
maxn = i;
}
return maxn;
}
}
异常小结
抛出:告诉调用者出错了,一半用在方法里面
捕获:为了让程序继续运行下去,一半用在调用方法时
测试
package exception;
public class Girlfrend {
int age;
String name;
public Girlfrend() {
}
public Girlfrend(int age, String name) {
this.age = age;
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
if(age<18||age>40)
throw new RuntimeException();
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
if(name.length()>10)
throw new RuntimeException();
this.name = name;
}
public String toString() {
return "Girlfrend{age = " + age + ", name = " + name + "}";
}
}
package exception;
import java.util.Scanner;
//键盘录入女朋友姓名和年龄
//姓名长度在3-10之间
//年龄范围是18-40
//如果超出这个范围就需要重新录入,直到录到正确为止
//需要考虑用户在键盘录入时的所有情况
//如:录入年龄时超出范围,录入年龄时录入abc等情况
public class Test {
public static void main(String[] args) {
//创建键盘录入的对象
Scanner sc = new Scanner(System.in);
//创建女朋友的对象
Girlfrend gf = new Girlfrend();
while (true) {
try {
//接受女朋友的姓名
System.out.println("输入女朋友的名字");
String name = sc.nextLine();
gf.setName(name);
//接收女朋友的年龄
System.out.println("请输入女朋友年龄");
//因为年龄是int类型,而这输入的是字符,需要用包装类转换
String ages = sc.nextLine();
int age = Integer.parseInt(ages);
gf.setAge(age);
//如果进行到这了就说明没有异常,那么就退出循环
break;
} catch (NumberFormatException e) {
System.out.println("请重新输入姓名");
}
catch (RuntimeException e) {
System.out.println("请重新输入年龄或者姓名");
}
}
//打印
System.out.println(gf);
}
}
在set方法里面判断输入的信息是否有问题,若没问题就将信息录入,如果有问题就抛出异常,在调用时捕获该异常
在循环中,如果有异常就继续循环,直到输入的信息完全没问题。
自定义异常类
- 定义一个类,继承RuntimeException(当异常类型属于运行时类型时),或者继承Exception(当异常类型属于编译时类型时)。
- 然后在类里面写2构造器,一个有参一个无参,(直接Alt+ins快速生成)