public class ArrayOutOfIndex {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
System.out.println(arr[3]);
}
}
运行结果:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at ArrayOutOfIndex.main(ArrayOutOfIndex.java:4)
package com.caq.exception;
public class Demo01 {
//打印a/b的结果
public static void test(int a,int b){
System.out.println(a/b);
}
public static void main(String[] args) {
//调用test方法
test(5,0);
}
}
运行结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.caq.exception.Demo01.test(Demo01.java:6)
at com.caq.exception.Demo01.main(Demo01.java:11)
Process finished with exit code 1
我们知道 0 是不能用作除数的,由于 test() 方法中除数 b 为 0,所以代码将停止执行并显示了相关的异常信息,此信息为堆栈跟踪
上面的运行结果告诉我们:main 线程发生了类型为 ArithmeticException 的异常,显示消息为 by zero,并且提示了可能发生异常的方法和行号。
package com.caq.exception;
public class Demo01 {
//打印a/b的结果
public static void test(int a,int b){
if (b==0){
//抛出异常
throw new ArithmeticException("被除数不能为零");
}
System.out.println(a/b);
}
public static void main(String[] args) {
//调用test方法
test(5,0);
}
}
运行结果:
Exception in thread "main" java.lang.ArithmeticException: 被除数不能为零
at com.caq.exception.Demo01.test(Demo01.java:8)
at com.caq.exception.Demo01.main(Demo01.java:15)
代码在运行时同样引发了错误,但显示消息为 “除数不能为零”。我们看到 test() 方法中加入了条件判断,如果调用者将参数 b 设置为 0 时,会使用 throw 关键字来抛出异常,throw 后面跟了一个使用 new 关键字实例化的算数异常对象,并且将消息字符串作为参数传递给了算数异常的构造函数。
我们可以使用 throw 关键字抛出任何类型的 Throwable 对象,它会中断方法,throw 语句之后的所有内容都不会执行。除非已经处理抛出的异常。异常对象不是从方法中返回的,而是从方法中抛出的。
public class ExceptionDemo5 {
/**
* 第一个自定义的静态内部异常类
*/
static class FirstCustomException extends Exception {
// 无参构造方法
public FirstCustomException() {
super("第一个异常");
}
}
/**
* 第二个自定义的静态内部异常类
*/
static class SecondCustomException extends Exception {
public SecondCustomException() {
super("第二个异常");
}
}
/**
* 第三个自定义的静态内部异常类
*/
static class ThirdCustomException extends Exception {
public ThirdCustomException() {
super("第三个异常");
}
}
/**
* 测试异常链静态方法1,直接抛出第一个自定义的静态内部异常类
* @throws FirstCustomException
*/
public static void f1() throws FirstCustomException {
throw new FirstCustomException();
}
/**
* 测试异常链静态方法2,调用f1()方法,并抛出第二个自定义的静态内部异常类
* @throws SecondCustomException
*/
public static void f2() throws SecondCustomException {
try {
f1();
} catch (FirstCustomException e) {
throw new SecondCustomException();
}
}
/**
* 测试异常链静态方法3,调用f2()方法, 并抛出第三个自定义的静态内部异常类
* @throws ThirdCustomException
*/
public static void f3() throws ThirdCustomException {
try {
f2();
} catch (SecondCustomException e) {
throw new ThirdCustomException();
}
}
public static void main(String[] args) throws ThirdCustomException {
// 调用静态方法f3()
f3();
}
}
运行结果:
Exception in thread "main" ExceptionDemo5$ThirdCustomException: 第三个异常
at ExceptionDemo5.f3(ExceptionDemo5.java:46)
at ExceptionDemo5.main(ExceptionDemo5.java:51)
public class ExceptionDemo6 {
/**
* 第一个自定义的静态内部异常类
*/
static class FirstException extends Exception {
// 无参构造方法
public FirstException() {
super("第一个异常");
}
}
/**
* 第二个自定义的静态内部异常类
*/
static class SecondCustomException extends Exception {
/**
* 通过构造方法获取之前异常的信息
* @param cause 捕获到的异常对象
*/
public SecondCustomException(Throwable cause) {
super("第二个异常", cause);
}
}
/**
* 第三个自定义的静态内部异常类
*/
static class ThirdCustomException extends Exception {
/**
* 通过构造方法获取之前异常的信息
* @param cause 捕获到的异常对象
*/
public ThirdCustomException(Throwable cause) {
super("第三个异常", cause);
}
}
/**
* 测试异常链静态方法1,直接抛出第一个自定义的静态内部异常类
* @throws FirstException
*/
public static void f1() throws FirstException {
throw new FirstException();
}
/**
* 测试异常链静态方法2,调用f1()方法,并抛出第二个自定义的静态内部异常类
* @throws SecondCustomException
*/
public static void f2() throws SecondCustomException {
try {
f1();
} catch (FirstException e) {
throw new SecondCustomException(e);
}
}
/**
* 测试异常链静态方法3,调用f2()方法, 并抛出第三个自定义的静态内部异常类
* @throws ThirdCustomException
*/
public static void f3() throws ThirdCustomException {
try {
f2();
} catch (SecondCustomException e) {
throw new ThirdCustomException(e);
}
}
public static void main(String[] args) throws ThirdCustomException {
// 调用静态方法f3()
f3();
}
}
运行结果:
Exception in thread "main" ExceptionDemo6$ThirdCustomException: 第三个异常
at ExceptionDemo6.f3(ExceptionDemo6.java:74)
at ExceptionDemo6.main(ExceptionDemo6.java:80)
Caused by: ExceptionDemo6$SecondCustomException: 第二个异常
at ExceptionDemo6.f2(ExceptionDemo6.java:62)
at ExceptionDemo6.f3(ExceptionDemo6.java:72)
... 1 more
Caused by: ExceptionDemo6$FirstException: 第一个异常
at ExceptionDemo6.f1(ExceptionDemo6.java:51)
at ExceptionDemo6.f2(ExceptionDemo6.java:60)
... 2 more