Java 与异常处理
作者: dkvirus 发表于: 2018-08-15 10:16:25 最近更新: 2018-08-15 23:52:39

了解一波 Java 异常相关概念,以及如何自定义异常。

一、什么是异常

写代码时可能会犯错,这些错误程序员在编写的时候可能自己都不知道,程序在运行时遇到这些错误,会直接中断,错误下面的代码不会再运行。

1
2
3
4
5
6
7
8
9
public static void main(String[] args) {

System.out.println("开始测试异常");

System.out.println(1/0);

System.out.println("会运行吗");

}

Java异常图1

有些地方的代码程序员可能知道有点不靠谱,那就做异常处理,这样即便真的出问题了,一方面将出问题的原因打印出来,一方面程序还能继续运行,不影响下面的代码执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) {

System.out.println("开始测试异常");

try {
System.out.println(1/0);
} catch (Exception e) {
e.printStackTrace();
}

System.out.println("会运行吗");

}

Java异常图2

二、处理异常

1. try…catch

1
2
3
4
5
6
7
8
9
public static void main(String[] args) {

try {
System.out.println(1/0);
} catch (Exception e) {
e.printStackTrace();
}

}
  • 将可能出问题的代码放到 try 块里;
  • catch 块里的内容只有真正出问题的时候才会运行,运行正常时不会执行,通常在这里打印一些错误信息,记录错误日志;

2. throws

1
2
3
4
5
6
7
public static void print () throws Exception {
System.out.println("开始测试异常");

System.out.println(1/0);

System.out.println("会运行吗");
}

Java 里也提供一种把异常往外抛的机制,意思是出现异常的地方不做处理,让调用该方法的地方处理异常。这一点一直不太明白什么场景出现,别人调用你的方法肯定为了直接处理问题,结果还要帮你的方法处理下异常,脑袋瓦特了啦??

三、异常分类

1
2
3
4
5
6
7
8
9
10
|-- Throwable
|-- Error(错误)
|-- OutOfMemoryError(内存溢出错误)
|-- Exception 异常
|-- Runtime Exception(运行时异常)
|-- NullPointerException(空指针异常)
|-- IndexOutOfBoundsException(数组下标越界异常)
|-- ArithmeticException(算术异常,分母不能为0)
|-- IOException(编译时异常)
|-- FileNotFoundException(文件未找到异常)

错误 通常指系统级别的异常,非程序员能控制,如内存用光了。比较常见的错误有内存溢出,这是因为 Java 程序启动时默认最大使用 16M 的内存,超出了就会报错。可以在 STS.ini 配置文件中进行调整内存大小。

编译时异常 指在写代码的时候就会报错,强制你必须处理它,如果写过文件相关 api,就会知道有这么个事,如下图:

Java异常图3

运行时异常 指写代码时不会报错,但一旦运行就会报错的异常。为什么有运行时异常呢,为什么不是所有异常在写代码的时候就提示出来强制处理,像编译时异常那样?这是因为运行时异常通常都是些最最最常见的错误,如果每个都要处理,那代码里将都是 try…catch、try…catch,及其混乱,如下图:

Java异常图4

四、自定义异常

1. 自定义异常类

1
2
3
4
5
6
7
8
9
10
11
12
13
public class DefinedException extends Exception {

private static final long serialVersionUID = 1L;

public DefinedException () {

}

public DefinedException (String msg) {
super(msg);
}

}
  • 继承 Exception 类;
  • 写一个无参构造器和一个有参构造器。

2. 测试自定义异常类

1
2
3
4
5
6
7
8
9
public class TestDefinedException {

public static void main(String[] args) throws DefinedException {

throw new DefinedException("这是自定义异常测试信息,不要大惊小怪");

}

}

通过 throw 关键字抛出自定义异常类,因为有定义过有参构造器,所以这里创建异常类的时候可以传递一个参数。

方法内有 throw 关键字就说明这个地方肯定有异常,就会变成编译时异常,此时通过 throws 抛出即可。

运行结果如下:

Java异常图5

首页
友链
归档
dkvirus
动态
RSS