异常:
测试测试代码1:
package catchtest.com;
public class TryCatchExample { //使用一个或多个 catch 块捕获并处理异常。public static void main(String[] args) { try { // 尝试执行的代码块 int result = 10 / 0; // 引发 ArithmeticException System.out.println("Result: " + result); } catch (ArithmeticException e) { // 捕获 ArithmeticException 并处理 System.out.println("捕获到算术异常: " + e.getMessage()); } catch (Exception e) { // 捕获所有其他类型的异常 // 在实际应用中,通常不建议这样捕获所有异常,它会隐藏一些问题。 System.out.println("捕获到异常: " + e.getMessage()); } finally { // finally 块,无论是否捕获到异常,都会执行 // 常用于关闭资源,如文件、数据库连接等 System.out.println("finally 块执行了"); } // try-catch 之后的代码会继续执行,除非在 try 或 catch 块中显式地中断(如使用 return、throw 或 System.exit()) System.out.println("程序继续执行..."); }
}
测试代码2:
package catchtest.com;
public class ThrowableDemo {// Throwable 类是所有错误和异常的超类。// getMessage():获取异常的详细消息字符串。// toString():获取异常的简短描述字符串。// printStackTrace():打印异常的堆栈跟踪到标准错误流。// getCause() 和 initCause(Throwable cause):这个例子没有使用// initCause()(因为它在异常被抛出后不能被再次设置),但展示了如何检查异常的 cause(如果存在)。// initCause(Throwable cause) 方法通常用于在创建异常对象时设置其原因。// 一旦异常被抛出,其 cause 就不能再被更改。如果尝试在异常被抛出后调用 initCause(),将抛出 IllegalStateException。public static void main(String[] args) {// 创建一个自定义异常,并传递一个消息MyCustomException myException = new MyCustomException("这是一个自定义异常");try {// 抛出一个异常。throw myException;} catch (MyCustomException e) {// 使用Throwable的成员方法System.out.println("异常消息: " + e.getMessage());System.out.println("异常的字符串表示: " + e.toString());e.printStackTrace(); // 打印异常的堆栈跟踪到标准错误流// 假设这个异常是由另一个异常引起的Throwable cause = new Throwable("这是引起异常的原因");// 一旦异常被抛出,它的cause就不能再被设置// 在实际场景中,应该在创建异常对象时设置cause// e.initCause(cause); //// 抛出IllegalStateException,因为cause已经被设置了(默认是null,但一旦设置就不能再改)// 但是,我们可以检查并打印cause(如果它存在)if (e.getCause() != null) {System.out.println("异常的原因: " + e.getCause().getMessage());} else {System.out.println("此异常没有直接的原因。");}// 没有为myException设置cause,所以getCause()返回null}}// 定义一个自定义异常类static class MyCustomException extends Exception {public MyCustomException(String message) {super(message); // 调用父类的构造器来设置消息}// 根据需要添加其他构造器或方法}
}
测试代码3:
package catchtest.com;
public class ThrowsDemo { // 自定义一个编译时异常 static class MyCheckedException extends Exception { public MyCheckedException(String message) { super(message); } } // 声明一个可能会抛出MyCheckedException的方法 public static void mightThrowException() throws MyCheckedException { // 假设这里有一些可能抛出MyCheckedException的代码 // 直接抛出一个异常 throw new MyCheckedException("这是一个可能发生的异常"); } public static void main(String[] args) { try { // 调用mightThrowException方法,捕获抛出的MyCheckedException mightThrowException(); } catch (MyCheckedException e) { // 处理异常 System.out.println("捕获到异常: " + e.getMessage()); } // 如果不捕获异常,并且方法签名中没有使用throws声明异常,编译器会报错 // 下面的这行代码如果取消注释,会导致编译错误 // mightThrowException(); // 编译错误:Unhandled exception: MyCheckedException } // 运行时异常(RuntimeException及其子类),即使不使用throws声明, // 也可以在方法内部抛出,并且调用者可以选择捕获或不捕获这些异常。 // 编译时异常(即Exception及其非RuntimeException的子类), // 如果方法内部抛出了这些异常,并且没有在方法内部捕获它们, // 就必须在方法签名中使用throws关键字声明这些异常, // 或者在方法内部使用try-catch块捕获并处理它们。
}
自定义异常:
创建一个编译时异常类:
package catchtest.com;
//自定义编译时异常
public class MyCustomCheckedException extends Exception { // 构造函数,可以有多个,根据需要定义 public MyCustomCheckedException() { // 调用父类的无参构造方法 super(); } public MyCustomCheckedException(String message) { // 调用父类的带有详细信息的构造方法 super(message); } // 根据需要添加其他构造方法、方法和属性
}
创建一个运行时异常类:
package catchtest.com;
//自定义运行时异常
public class MyCustomRuntimeException extends RuntimeException { // 构造函数,可以有多个,根据需要定义 public MyCustomRuntimeException() { // 调用父类的无参构造方法 super(); } public MyCustomRuntimeException(String message) { // 调用父类的带有详细信息的构造方法 super(message); } // 根据需要添加其他构造方法、方法和属性
}
在Main方法中测试:
package catchtest.com;
public class TestException { // 抛出自定义编译时异常的方法 public static void mightThrowCheckedException() throws MyCustomCheckedException { // 抛出MyCustomCheckedException throw new MyCustomCheckedException("这是一个自定义的编译时异常"); } // 抛出自定义运行时异常的方法 public static void mightThrowRuntimeException() { // 抛出MyCustomRuntimeException throw new MyCustomRuntimeException("这是一个自定义的运行时异常"); } public static void main(String[] args) { try { // 调用可能会抛出编译时异常的方法,并捕获该异常 mightThrowCheckedException(); } catch (MyCustomCheckedException e) { System.out.println("捕获到自定义编译时异常: " + e.getMessage()); } // 调用可能会抛出运行时异常的方法 // 运行时异常不需要在编译时被强制捕获或声明抛出 try { mightThrowRuntimeException(); } catch (MyCustomRuntimeException e) { // 捕获并处理自定义运行时异常 System.out.println("捕获到自定义运行时异常: " + e.getMessage()); } // 如果不捕获自定义运行时异常,它将按照Java的异常处理机制被传播 // 导致程序终止并打印堆栈跟踪 mightThrowRuntimeException(); // 直接打印堆栈跟踪,因为异常没有被捕获 }
}
运行结果如下: