0
点赞
收藏
分享

微信扫一扫

Java之异常

1.异常

我们在日常的开发中,代码会经常会出错,本文就和大家聊聊Java中常见的一些异常。首先我们介绍异常的基本概念。

1.1异常概念

  • 异常的概述

异常就是程序出现了不正常的情况

  • 异常的体系结构

Java之异常_Java SE

1.2JVM默认处理异常的方式

  • 如果程序出现了问题,我们没有做任何处理,最终JVM 会做默认的处理,处理方式有如下两个步骤:
  • 把异常的名称,错误原因及异常出现的位置等信息输出在了控制台
  • 程序停止执行

1.3try-catch方式处理异常

  • 这是我们在日常开发中最为常见的一种处理异常的方式,具体定义格式如下:
try {
可能出现异常的代码;
} catch(异常类名 变量名) {
异常的处理代码;
}
  • 执行流程
  • 程序从 try 里面的代码开始执行
  • 出现异常,就会跳转到对应的 catch 里面去执行
  • 执行完毕之后,程序还可以继续往下执行

具体我们通过一个案例来对其的用法进行说明:

public class ExceptionDemo01 {
public static void main(String[] args) {
System.out.println("开始");
method();
System.out.println("结束");
}

public static void method() {
try {
int[] arr = {1, 2, 3};
System.out.println(arr[3]);
System.out.println("这里能够访问到吗");
} catch (ArrayIndexOutOfBoundsException e) {
// System.out.println("你访问的数组索引不存在,请回去修改为正确的索引");
e.printStackTrace();
}
}
}

我们执行该代码会出现如下的异常,这种异常很正常,具体如下:

Java之异常_用java实现验证码_02

1.4Throwable成员方法

  • 常用方法

Java之异常_综合案例_03

  • 具体我们通过一个小的代码来体现该方法的具体使用:
public class ExceptionDemo02 {
public static void main(String[] args) {
System.out.println("开始");
method();
System.out.println("结束");
}

public static void method() {
try {
int[] arr = {1, 2, 3};
System.out.println(arr[3]); //new ArrayIndexOutOfBoundsException();
System.out.println("这里能够访问到吗");
} catch (ArrayIndexOutOfBoundsException e) { //new ArrayIndexOutOfBoundsException();
// e.printStackTrace();

//public String getMessage():返回此 throwable 的详细消息字符串
// System.out.println(e.getMessage());
//Index 3 out of bounds for length 3

//public String toString():返回此可抛出的简短描述
// System.out.println(e.toString());
//java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3

//public void printStackTrace():把异常的错误信息输出在控制台
e.printStackTrace();
// java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
// at com.itheima_02.ExceptionDemo02.method(ExceptionDemo02.java:18)
// at com.itheima_02.ExceptionDemo02.main(ExceptionDemo02.java:11)

}
}
}

具体执行的结果如下,这种报错是很正常的。

Java之异常_用java实现验证码_04

1.5编译时异常和运行时异常的区别

  • 编译时异常
  • 都是Exception类及其子类
  • 必须显示处理,否则程序就会发生错误,无法通过编译
  • 运行时异常
  • 都是RuntimeException类及其子类
  • 无需显示处理,也可以和编译时异常一样处理

1.6throws方式处理异常

  • 定义格式
public void 方法() throws 异常类名 {

}

我们通过代码来具体使用该方式处理异常,具体代码如下:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ExceptionDemo {
public static void main(String[] args) {
System.out.println("开始");
// method();
try {
method2();
}catch (ParseException e) {
e.printStackTrace();
}
System.out.println("结束");
}

//编译时异常
public static void method2() throws ParseException {
String s = "2048-08-09";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(s);
System.out.println(d);
}

//运行时异常
public static void method() throws ArrayIndexOutOfBoundsException {
int[] arr = {1, 2, 3};
System.out.println(arr[3]);
}
}

我们具体执行的结果如下:

Java之异常_用java实现验证码_05

  • 通过上述代码的实现,我们需要注意以下的一些事项:
  • 这个​​throws​​格式是跟在方法的括号后面的
  • 编译时异常必须要进行处理,两种处理方案:​​try...catch …​​或者 ​​throws​​,如果采用​​ throws ​​这种方案,将来谁调用谁处理
  • 运行时异常可以不处理,出现问题后,需要我们回来修改代码

1.7throws和throw的区别

Java之异常_综合案例_06

1.8自定义异常

  • 自定义异常类
public class ScoreException extends Exception {

public ScoreException() {}

public ScoreException(String message) {
super(message);
}

}
  • 老师类
public class Teacher {
public void checkScore(int score) throws ScoreException {
if(score<0 || score>100) {
// throw new ScoreException();
throw new ScoreException("你给的分数有误,分数应该在0-100之间");
} else {
System.out.println("成绩正常");
}
}
}
  • 测试类
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入分数:");

int score = sc.nextInt();

Teacher t = new Teacher();
try {
t.checkScore(score);
} catch (ScoreException e) {
e.printStackTrace();
}
}
}

具体执行的结果如下:

Java之异常_综合案例_07

2.综合案例

接下来,我们通过一些案例来供大家练习。

2.1 工人查找

需求​:​现已知工人(Worker)类,属性包含姓名(name)、工龄(year),请编写该类,提供构造方法和get、set方法。在测试类中,创建工人类对象,属性值由键盘录入,打印对象的属性值。

​具体的实现代码如下:

public class Worker {
// 成员变量
private String name;
private int year;

// 构造方法
public Worker() {

}
public Worker(String name, int age) {
this.name = name;
this.year = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getYear() {
return year;
}

public void setYear(int year) {
this.year = year;
}
}

import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
// 创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入工人姓名:");
String name = sc.nextLine();
System.out.println("请输入工人工龄:");
int year = sc.nextInt();
// 创建对象
Worker w = new Worker(name, year);
// 输出信息
System.out.println("该工人对象的信息如下:");
System.out.println("姓名:" + w.getName());
System.out.println("工龄:" + w.getYear());
}
}

具体执行的结果如下:

Java之异常_综合案例_08

2.2 动态获取验证码

需求​:​在登录注册页面中,除了用户名和密码外,通常也会包含验证码。定义方法,获取一个包含4个字符的验证码,每一位字符是随机选择的字母和数字,可包含a-z,A-Z,0-9。

​具体的实现代码如下:

import java.util.Random;

public class Test02 {
public static void main(String[] args) {
String code = getRandomCode();
System.out.println(code);
}
public static String getRandomCode() {
// 准备数据,将可选择的字符都放入StringBuilder中
StringBuilder sb = new StringBuilder();
for (char ch = 'a'; ch <= 'z'; ch++) {
sb.append(ch);
}
for (char ch = 'A'; ch <= 'Z'; ch++) {
sb.append(ch);
}
for (char ch = '0'; ch <= '9'; ch++) {
sb.append(ch);
}
// 随机获取四位
Random r = new Random();
String code = "";
for (int i = 0; i < 4; i++) {
// 字符串中的字符有索引,随机获取一个索引即相当于随机获取到了该索引的字符
int index = r.nextInt(sb.length()); // 从索引0(包含)到字符串的长度(不包含)
code += sb.charAt(index); // 获取该索引上的字符
}
// 返回结果
return code;
}
}

具体执行的结果如下:

Java之异常_Java SE_09

2.3 验证码生成

需求:​在登录注册页面中,除了用户名和密码外,通常也会包含验证码。在判断验证码时一般不区分大小写。请编写程序模拟验证码的判断过程,如果输入正确,给出提示,结束程序。如果输入错误,给出提示,验证码刷新,重新输入,直至正确为止。

通过以上的需求我们给出以下的实现代码:

import java.util.Random;
import java.util.Scanner;

public class Test03 {
public static void main(String[] args) {
// 键盘录入对象
Scanner sc = new Scanner(System.in);
while (true) { // 不清楚输入多少次,定义死循环,输入正确时跳出即可。
String code = getRandomCode();
System.out.println("生成的验证码为:" + code);
System.out.println("请输入验证码");
String line = sc.nextLine();
// 不区分大小写比较是否相等
if (code.equalsIgnoreCase(line)) {
System.out.println("输入正确");
break; // 跳出循环,结束程序
} else {
System.out.println("输入错误,请重新输入...");
}
}
}
public static String getRandomCode() {
// 准备数据
StringBuilder sb = new StringBuilder();
for (char ch = 'a'; ch <= 'z'; ch++) {
sb.append(ch);
}
for (char ch = 'A'; ch <= 'Z'; ch++) {
sb.append(ch);
}
for (char ch = '0'; ch <= '9'; ch++) {
sb.append(ch);
}
// 随机获取四位
Random r = new Random();
String code = "";
for (int i = 0; i < 4; i++) {
// 字符串中的字符有索引,随机获取一个索引即相当于随机获取到了该索引的字符
int index = r.nextInt(sb.length()); // 从索引0(包含)到字符串的长度(不包含)
code += sb.charAt(index); // 获取该索引上的字符
}
// 返回结果
return code;
}
}

具体执行的结果如下:

Java之异常_用java实现验证码_10

总结

本文给大家介绍了我们经常在写代码中遇到的异常,并且给出了相应的案例供大家练习,尤其是验证码的生成以及输入验证码加以验证,让我们明白了验证码的验证原理,所以还是希望大家多多学习。

举报

相关推荐

0 条评论