异常&Debug

异常

为什么引入异常

  • 举个例子,如果程序员需要拷贝一个文件到硬盘,需要考虑够不够拷贝这就会导致出现问题,所以我们需要提前对可能出现的问题进行考虑和处理,即当程序出现时,程序安全的退出,处理完之后继续执行的机制

逻辑代码和错误处理代码放一起
程序员考虑的事情过多,对程序员本身要求高

java处理异常的过程

  • 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给 JRE
  • 捕获异常:JRE 得到该异常后,寻找相应的代码来处理该异常。JRE 在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止。
  • 捕获可以理解为一个方法,传入一个对象(即出现的错误)。

异常的分类

1.

  • 运行时异常RuntimeException (unCheckedException)
  • 编译的异常CheckedException

NullPointerException 异常&解决

  • 原因:当程序访问一个空对象的成员变量或方法,或者访问一个空数组的成员时会发生空指针异常(NullPointerException)。
String str=null;
System.out.println(str.charAt(0));
String str=null;
if(str!=null){
System.out.println(str.charAt(0));
}

ClassCastException 异常&解决

  • 原因:在引用数据类型转换时,有可能发生类型转换异常(ClassCastException)。
class Animal{
}
class Dog extends Animal{
}
class Cat extends Animal{
}
public class Test5 {
	public static void main(String[ ] args) {
		Animal a=new Dog();
		Cat c=(Cat)a;
	}
}
public class Test5 {
	public static void main(String[ ] args) {
		Animal a = new Dog();
		if (a instanceof Cat) {
			Cat c = (Cat) a;
		}
	}
}

ArrayIndexOutOfBoundsException 异常&解决

  • 原因:当程序访问一个数组的某个元素时,如果这个元素的索引超出了 0~数组长度-1 这个范围,则会出现数组下标越界异(ArrayIndexOutOfBoundsException)。
public class Test6 {
	public static void main(String[ ] args) {
		int[ ] arr = new int[5];
		System.out.println(arr[5]);
	}
}
public class Test6 {
	public static void main(String[ ] args) {
		int[ ] arr = new int[5];
		int a = 5;
		if (a < arr.length) {
			System.out.println(arr[a]);
		}
	}
}

NumberFormatException 异常&解决

  • 原因:在使用包装类将字符串转换成基本数据类型时,如果字符串的格式不正确,则会出现数字格式异常(NumberFormatException)。
public class Test7 {
	public static void main(String[ ] args) {
		String str = "1234abcf";
		System.out.println(Integer.parseInt(str));
	}
}
public class Test7 {
	public static void main(String[ ] args) {
		String str = "1234abcf";
		Pattern p = Pattern.compile("^\\d+$");
		Matcher m = p.matcher(str);
		if (m.matches()) { // 如果 str 匹配代表数字的正则表达式,才会转换
			System.out.println(Integer.parseInt(str));
		}
	}
}

异常处理一 捕获异常

  • 捕获异常是通过 3 个关键词来实现的:try-catch-finally。
  • 用 try 来执行一段程序,如果出现异常,系统抛出一个异常,可以通过它的类型来捕捉(catch)并处理它,最后一步是通过 finally 语句为异常处理提供一个统一的出口,
  • finally 所指定的代码都要被执行(catch 语句可有多条;finally 语句最多只能有一条,根据自己的需要可有可无)。
package com.ssc.abnormal;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class TryCatch {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		FileReader reader = null;
		try {
			reader = new FileReader("a.txt");
			char c = (char)reader.read();
			char c2 = (char)reader.read();
			System.out.println(""+c+c2);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				reader.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

快速创建try catch

右键 suround with trycatch

异常的处理二 抛出异常

  • 把异常丢出去,谁调用谁处理
package com.ssc.abnormal;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class TryCatch {
	
	public static void main(String[] args) {
		// 声明式异常,丢出去
		try {
			readFile("a.txt");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//把异常丢出去让调用的人处理
	public static void readFile(String path) throws Exception{
		FileReader reader = null;
		try {
			reader = new FileReader(path);
			char c = (char)reader.read();
			char c2 = (char)reader.read();
			System.out.println(""+c+c2);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				reader.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

try-with-resource自动关闭 Closable 接口的资源

  • 比较简单,是编译器自动帮我们关闭资源
package com.ssc.abnormal;

import java.io.FileReader;

public class TryWithRE {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try(FileReader reader = new FileReader("a.txt");){
			char c = (char)reader.read();
			char c2 = (char)reader.read();
			System.out.println(""+c+c2);
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}

}

自定义异常

package com.ssc.abnormal;

class Person {
	private String name;
	private int age;
	public void setName(String name) {
		this.name = name;
	}
	public void setAge(int age) throws IllegalAgeException {
		if (age < 0) {
			throw new IllegalAgeException("人的年龄不应该为负数");
		}
		this.age = age;
	}
	public String toString() {
		return "name is " + name + " and age is " + age;
	}
	
}
class MyException {
	public static void main(String[ ] args) {
		Person p = new Person();
		try {
			p.setName("Lincoln");
			p.setAge(-1);
		} catch (IllegalAgeException e) {
			e.printStackTrace();
		}
		System.out.println(p);
	}
}

class IllegalAgeException extends Exception{
	public IllegalAgeException() {
		// TODO Auto-generated constructor stub
	}

	public IllegalAgeException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}
	
}

Debug自己的程序

  • 断点,单步调试

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值