Error错误案例
public static void main(String[] args) {
sm();
}
static int n = 0;
private static void sm() {
n++;
System.out.println("这是第" + n + "次调用方法");
sm(); //递归调用,在方法体中又调用它本身
// 运行程序出现了java.lang.StackOverflowError栈溢出错误
// JVM管理一部分内存,分为栈区与堆区,栈区其实是比较小的一块内存空间,每次调用方法时,都会给方法分配 栈空间
// 方法栈已满,出现JVM错误
// 错误时以Error单词结尾,异常时以Exception单词结尾
}
异常案例及避免方法
// 运行时异常通过规范的代码可以避免
// 定义方法,计算两个正数相除
private static void divide(int m, int n) {
// 整数相除,除数不能为0,除数为0会产生java.lang.ArithmeticException算术异常
if (n == 0) {
System.out.println("除数不能为0");
return;
}
int result = m / n;
System.out.println(m + "/" + n + "=" + result);
}
异常处理——抛出异常
// 异常处理——抛出异常
//定义方法,把字符串转换为指定编码的字节数组打印出来
private static void convert(String str, String charsetName) throws UnsupportedEncodingException {
/*
* 调用String字符串的getBytes(String charsetName) 方法把字符串转换为指定的charsetName编码的字节数组,该方法有语法错误:
* Unhandled exception: java.io.UnsupportedEncodingException,未处理的异常
*
* 查看该方法定义,在方法声明行通过throws声明抛出了UnsupportedEncodingException异常,这个异常类没有继承RuntimeException类,
* 就是一个编译异常(检查异常),根据Java语法错误,如果方法声明抛出了异常,在调用时必须进行预处理,否则语法错误
*
* 当前选择throws抛出处理,在当前方法声明行通过throws声明抛出这个异常,抛出给它的调用者,即谁调用convert方法,谁负责处理这个异常,
* 在main方法中调用convert方法,就需要对convert声明抛出的异常进行预处理,也选择抛出处理,抛出给main方法的调用者JVM
*
* 运行程序后,如果指定的字符编码java能够支持,则程序正常执行,如果指定的字符编码java不支持getBytes()方法就会抛出异常给convert,
* convert抛出给main,main抛出给JVM,JVM默认的处理方式时程序中断,打印异常栈跟踪信息
*/
byte[] bytes = str.getBytes(charsetName);
System.out.println(Arrays.toString(bytes));
}
异常处理——捕获异常
// 异常处理——捕获
private static void convert(String str, String charsetName) {
try {
// 可以把一组紧密相关的代码都放在try代码块中
// 运行程序后,如果try代码块没有产生异常,则不执行catch子句,程序继续向下执行
// 运行程序后,如果try代码块产生了异常,则立即跳转到catch子句执行,catch子句捕获这个异常后,该异常就不再继续上抛了,程序也不会中断,还需继续执行代码块以外的程序
// 异常捕获处理的好处:提高了程序的健壮性
byte[] bytes = str.getBytes(charsetName);
System.out.println(Arrays.toString(bytes));
} catch (UnsupportedEncodingException e) {
e.printStackTrace(); //打印异常的栈跟踪信息
}
}