闭关修炼100天 JavaEE乱杀 第18天
写在前面:
我始终在想到底该怎么学好编程,毕竟这大概率是我未来的经济来源,在集合那个地方,我反复地觉得只会使用是不行的,一个程序员最大的悲哀就是只会使用别人开发出来的工具,而并没有自己的不可替代性,我要以此为生,所以我得竭尽全力将其学会,学懂,学深。一起加油把,共勉。
Error出现的情况
错误(Error):JVM系统内部错误或资源耗尽等严重情况-属于JVM需要负担的责任
这一类异常事件无法恢复或不可能捕获,将导致应用程序中断
@param args
//第一种情况
public static void main(String[] args) {
//StackOverflowError - 栈内存溢出的错误
//由于调用方法要在栈中开辟空间,一直调用method(),导致栈内存溢出
method();
}
private static void method() {
method();
}
//第二种情况
public static void main(String[] args) {
//这里并不会报内存溢出的错误,因为垃圾回收机制
//byte[] bytes只会在栈中创建一次,new出下一个byte数组对象时,把它的地址给bytes,上一个byte数组就没有引用了,所以被回收掉
while (true){
byte[] bytes = new byte[2024];
}
//OutOfMemoryError - 内存溢出的错误
//由于把之前new出来的对象存在集合list中,所以导致内存溢出的错误
ArrayList<byte[]> list = new ArrayList<>();
while (true){
byte[] bs = new byte[2024];
list.add(bs);
}
}
Exception出现的情况
异常(exception):其他因编程错误或偶然外在因素导致的一般性问题。
这类异常得到恰当的处理时,程序有机会恢复至正常运行状况
RuntimeException - 运行时异常/非受检性异常
RuntimeException - 运行时异常/非受检性异常:那些程序员编写程序时应该避免的异常(逻辑异常)
第一种情况
public static void main(String[] args) {
//ArithmeticException - 算数异常
System.out.println(10/0);
}
//第二种情况
public static void main(String[] args) {
//NullPointException - 空指针异常
method(null);
}
private static void method() {
System.out.println(str.length);
}
//第三种情况
public static void main(String[] args) {
//ClassCastException - 类型转换异常
Object obj = new Integer(100);
Double d = (Double) obj;
System.out.println(d);
}
//第四种情况
public static void main(String[] args) {
//ArrayindexOutOfBoundsException - 数组下标越界异常
int[] arr = {1,2,3};
System.out.println(arr[10]);
}
//第五种情况
public static void main(String[] args) {
//OutOfBoundsException - 下标越界异常
ArrayList<Object> list = new ArrayList<>();
System.out.println(list.get(100));
}
一般性异常 - 受检异常
一般性异常 - 受检异常:编译器要求必须处置的异常。指的是程序在运行时由于外界因素造成的一般性异常。
public static void main(String[] args) throws ParseException {
//ParseException - 解析异常
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
Date date = sdf.parse("2024-5-17");
System.out.println(date);
}
异常处理机制
1.java程序在执行过程中如果出现异常,会自动生成一个异常类对象,
该异常对象将自动提交给JVM,这个过程称为抛出(throw)异常
2.当JVM接收到异常对象时,会寻找能处理这一异常的代码
2.1 找到了 - 把当前异常对象交给其处理,这一过程称为捕获(catch)异常和处理异常。
2.2 没找到 - 运行时系统将终止,相应的java程序也将退出
异常的处理能力
1.try…catch…
2.throws
3.throw
try…catch…
语法格式:
try{
…可能发生异常的代码…
}catch(异常类型 e){
…处理异常…
}finally{
…不管是否发生异常,都会执行的代码…
经验:一般把关闭资源的代码写在此处
}
场景:处理一个异常的情况
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数字");
int a = scan.nextInt();
System.out.println("请输入第二个数字");
int b = scan.nextInt();
try{
System.out.println("111");
System.out.println(a/b);
System.out.println("222");
}catch (ArithmeticException e){
System.out.println("处理算数异常...");
}finally {
scan.close();
}
System.out.println("333");
}
/* 请输入第一个数字
10
请输入第二个数字
2
111
5
222
333*/
/* 请输入第一个数字
10
请输入第二个数字
0
111
处理算数异常...
333*/
//由此可以看出代码运行的逻辑从上往下,看try中发不发生异常,没发生,按顺序执行,不进入catch,但会进入finally中的代码块;如果try中发送异常,就看是不是catch中的类型,不是直接报错,是的话,执行catch中的语句,再执行finally中的语句,再按顺序执行下去,这也是222并没有打印的原因
public static void main(String[] args) {
String[] names = {"aa","bb","cc","ee"};
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数字");
int a = scan.nextInt();
System.out.println("请输入第二个数字");
int b = scan.nextInt();
System.out.println("请输入需要获取元素的下标(0~3) : ");
int index = scan.nextInt();
try{
System.out.println("111");
System.out.println(a/b);
System.out.println("222");
System.out.println(names[index]);
System.out.println("333");
}catch (ArithmeticException | ArrayIndexOutOfBoundsException e){//这里只能是|,不能写||,会报错
System.out.println("处理异常...");
}catch (Exception e){
//先常类型范围要小于后捕获的异常类型
//经验:通常我们不会去catch运行时异常,直接让系统报错,再修改,一般catch捕获一般性异常
} finally {
scan.close();
}
System.out.println("444");
}
}
//一般性异常的try...catch...
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
Date date;
try {
date = sdf.parse("2024-5-17");
} catch (ParseException e) {
System.out.println("年月日输入格式错误");
}//ParseException 解析异常
}
throws
public static void main(String[] args) throws ParseException {
try {
method1();
}catch (ParseException e){
System.out.println("解析异常");
}
}
private static void method1() throws ParseException {
method2();
}
private static void method2() throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
Date date = sdf.parse("2024-5-17");
System.out.println(date);
}
throw
public class Demo1 {
/**
*知识点:处理异常 -- throws(抛出异常)
*/
public static void main(String[] args){10
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数字: ");
int a = scan.nextInt();
System.out.println("请输入第二个数字: ");
int b = scan.nextInt();
try {
method(b);
}catch (MyException e) {
b = 1;
}
System.out.println(a/b);
scan.close();
}
private static void method(int num) throws MyException {
if(num == 0){
throw new MyException();
}
}
}
//另一个类
public class MyException extends Exception{
@Override
public String toString() {
return "除数不能为0的异常";
}
}