异常层次结构图:
代码演示:
public class ExceptionText {
public static void main(String[] args) {
int a=100;
int b=0;
System.out.println(a/b);
}
}
运行结果:
没有正确输出,抛出了被 0 除异常 通过以上示例,我们看到 java 给我们提供了这样一个体系结构,当出现问题的时候,它会告 诉我们,并且把错误的详细信息也告诉我们了,这就是异常的体系结构,这样我们的程序更健 壮,我们可以把这个信息,再进行处理以下告诉用户。从上面大家还可以看到,java 异常都是 类,在异常类中会携带一些信息给我们,我们可以通过这个类把信息取出来
ArrayIndexOutOfBoundsException异常
、ClassCastException异常
、NullPointerException异常
编译时异常一般发生的概率比较高。 举个例子: 你看到外面下雨了,倾盆大雨的。 你出门之前会预料到:如果不打伞,我可能会生病(生病是一种异常)。 而且这个异常发生的概率很高,所以我们出门之前要拿一把伞。 “拿一把伞”就是对“生病异常”发生之前的一种处理方式。 对于一些发生概率较高的异常,需要在运行之前对其进行预处理。 运行时异常一般发生的概率比较低。 举个例子: 小明走在大街上,可能会被天上的飞机轮子砸到。 被飞机轮子砸到也算一种异常。 但是这种异常发生概率较低。 在出门之前你没必要提前对这种发生概率较低的异常进行预处理。 如果你预处理这种异常,你将活的很累。
public class ExceptionText {
public static void main(String[] args) throws Exception{
int a=100;
int b=0;
divide(a,b);
}
public static void divide(int a, int b) throws Exception{
int c = a / b;
System.out.println(c);
}
}
public class ExceptionText {
public static void main(String[] args){
int a=100;
int b=0;
try {
divide(a,b);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void divide(int a, int b) throws Exception{
int c = a / b;
System.out.println(c);
}
注意:
1.Java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了调用者JVM,JVM知道这个异常发生,只有一个结果。终止java程序的执行。 2.try语句中某一行出现异常该行后续代码不执行try…catch捕获后,后续代码可执行。
try {
}catch(OneException e) {
}catch(TwoException e) {
}finally {
}
try {
}finally {
}
catch(异常1 | 异常2 |异常3 |......)
jdk8新特性!!示例代码(1):
public class ExceptionText {
public static void main(String[] args){
int a=100;
int b=0;
try {
divide(a,b);
//上一行代码有异常,直接进入catch里面!!
System.out.println("我能执行吗?");
} catch (Exception e) {
System.out.println("被0除了!!");
}
}
public static void divide(int a, int b) throws Exception{
int c = a / b;
System.out.println(c);
}
}
运行结果:
被0除了!!
示例代码(2):
public class ExceptionText {
public static void main(String[] args){
int a=100;
int b=0;
try {
divide(a,b);
//上一行代码有异常,直接进入catch里面!!
System.out.println("我能执行吗?");
} catch (Exception e) {
System.out.println("被0除了!!");
}finally {
System.out.println("finally执行了!!");
}
}
public static void divide(int a, int b) throws Exception{
int c = a / b;
System.out.println(c);
}
}
运行结果:
被0除了!!
finally执行了!!
throws与try…catch如何选择? 需要上报异常使用throws,需要捕获异常时使用try…catch进行捕获!!
示例代码(3):
public class FinallyText {
public static void main(String[] args) {
System.out.println(n());
}
public static int n(){
int i=100;
try {
return i;
}finally {
i++;
}
}
}
示例代码(4):
public class ExceptionText01 {
public static void main(String[] args) {
int a=100;
int b=0;
try {
int c=a/b;
System.out.println(c);
}catch (ArithmeticException e){
//e 是一个引用,它指向了堆中的 ArithmeticException
//通过 getMessage 可以得到异常的描述信息
System.out.println(e.getMessage());
}
}
}
运行结果:
/ by zero
示例代码(5):
public class ExceptionText01 {
public static void main(String[] args) {
int a=100;
int b=0;
try {
int c=a/b;
System.out.println(c);
}catch (ArithmeticException e){
//e 是一个引用,它指向了堆中的 ArithmeticException
//通过 printStackTrace 可以打印栈结构
e.printStackTrace();
}
}
}
运行结果:
示例代码(6):
public static void main(String[] args) {
int ret = method1(1000, 10);
if (ret == -1) {
System.out.println("除数为 0");
}
if (ret == -2) {
System.out.println("被除数必须为 1~100 之间的数据");
}
if (ret == 1) {
System.out.println("正确");
}
}
private static int method1(int value1, int value2){
if (value2 == 0) {
return -1;
}
if (!(value1 >0 && value1<=100)) {
return -2;
}
int value3 = value1/value2;
System.out.println("value3=" + value3);
return 1;
}
运行结果:
被除数必须为 1~100 之间的数据
示例代码(7):
public static void main(String[] args) {
try {
int ret = method1(1000, 10);
System.out.println(ret);
}catch(Exception iae) { //可以采用 Exception 拦截所有的异常
System.out.println(iae.getMessage());
}
}
private static int method1(int value1, int value2){
if (value2 == 0) {
//手动抛出异常
throw new IllegalArgumentException("除数为 0");
}
if (!(value1 >0 && value1<=100)) {
//手动抛出异常
throw new IllegalArgumentException("被除数必须为 1~100 之间的数据");
}
int value3 = value1/value2;
return value3;
}
运行结果:
被除数必须为 1~100 之间的数据
throws 和 throw 的区别? thorws 是声明异常,throw是抛出异常
示例代码(8):
public class MyException extends Exception{
public MyException() {
}
public MyException(String s) {
super(s);
}
}
编写程序模拟用户注册: 1、程序开始执行时,提示用户输入“用户名”和“密码”信息。 2、输入信息之后,后台java程序模拟用户注册。 3、注册时用户名要求长度在[6-14]之间,小于或者大于都表示异常。
代码演示: 用户注册类:
/**
*用户登录
* @username 用户名
* @password 密码
* 当用户名为null,用户名要求长度在[6-14]之间,小于或者大于都表示异常。
*/
class UserService {
public void register(String username, String password) throws MyException {
if (null==username || username.length() <= 6 || username.length() >= 14) {
throw new MyException("输入有误,请输入6~14之间的用户名");
}
System.out.println("恭喜你注册成功!!");
}
}
自定义异常类:
public class MyException extends Exception{
public MyException() {
}
public MyException(String s) {
super(s);
}
}
测试类:
public class ExceptionText {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入用户名:");
String str = input.nextLine();
System.out.println("请输入密码:");
String passWord = input.next();
UserService userService = new UserService();
try {
userService.register(str, passWord);
} catch (MyException e) {
// e.printStackTrace();
System.out.println(e.getMessage());
}
}
}
运行结果1:
请输入用户名:
小马
请输入密码:
123456
输入有误,请输入6~14之间的用户名
运行结果2:
请输入用户名:
鹅厂小马前来报到
请输入密码:
123456789
恭喜你注册成功!!