异常
Error(错误):只有改变代码才能解决 。
异常:在程序运行期间可能出现的问题。
Throwable:父类。
构造方法
- Exception() 构造详细消息为 null 的新异常。
- Exception(String message) 构造带指定详细消息的新异常。
- Exception(String message, Throwable cause) 构造带指定详细消息和原因的新异常。
- Exception(Throwable cause) 根据指定的原因和 (cause==null ? null : cause.toString()) 的详细消息构造新异常(它通常包含 cause 的类和详细消息)。
常用方法
- String
getMessage() 返回此 throwable 的详细消息字符串。 - void
printStackTrace() 将此 throwable 及其追踪输出至标准错误流。 - String
toString() 返回此 throwable 的简短描述。
一.Error
- 递归调用时会导致内存溢出错误。
二.Exception
Exception:异常的父类
- 运行时异常会导致程序终止运行:该异常可以通过异常不理机制进行异常的处理,而使程序不会因为异常产生而停止运行。
1.运行时异常 Exception
- 因为参数导致程序发生异常 ,可以采用java提供异常处理机制来解决异常,避免程序因为异常而终止运行
处理异常的方式
- 向上抛出异常(Throws)
在方法上进行使用,向上抛出会导致异常的向上延续。 在A方中抛出一个异常,B方法调用了A方法,此时B方法也就会产生异常。
Public void math throws 指定具体异常 (可以使用父类异常)(){
System.out.println(1/0);//异常
}
public class ErrorDemo {
public static void main(String[] args) throws ArithmeticException, ClassNotFoundException {
math();
}
public static void fun() throws ArithmeticException, ClassNotFoundException {
math();
}
public static void math() throws ArithmeticException,ClassNotFoundException {
int num=10;
System.out.println(1/num);//产生异常,进行处理
System.out.println("111111111111");//无法运行
}
}
- 捕获处理异常
try{
可能发生异常的代码
}catch(异常对象01){ArithmeticException
对异常的处理
}catch(异常对象02){ClassNotFoundException
对异常的处理
}catch(异常对象03){Exception
对异常的处理
}...
- catch可以有多个,异常类型要从小到大 。 在捕获到异常时,从上到下进行比对。
public class TryCatch {
public static void main(String[] args) {
math(0);
array();
}
public static void math(int num) {
try {
//可能发生异常的代码
System.out.println(1/num);
}catch(ArithmeticException a) {
// 发生异常的时候,就会执行该为的代码
System.out.println("发生异常");
//异常具体的描述信息
System.out.println(a.getMessage());
//使用标准打印输出流来进行异常信息的打印输出
a.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("上面的异常是什么");
e.printStackTrace();
}
System.out.println("=====================");
}
public static void array() {
int [] nums=new int[10];
try {
System.out.println(nums[10]);
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
e.printStackTrace();
}
System.out.println("异常已经处理了");
}
}
三.自定义异常
- 自定义异常: 自己定义方法,并选择在什么情况下抛出一个异常。
- 用自定义异常是因为java提供的异常不能满足我们的需要。
Throw关键字
步骤:
-
创建一个类,继承一个java中现有的异常,该类是一个异常类 。
-
在使用中使用throw关键字 在指定的地方抛出一个异常
小例子
性别是男和女,当输入的不是男或者女的时候我要自己定义一个异常,并且告诉你具体的异常内容是什么。 -
MyException.java
public class MyException extends Exception{
//如何写出具体的异常描述信息
static String message;
//有参数构造方法
public MyException(String massage) {
super(message);// 将异常描述交给父类
this.message = message;
}
}
- MyExDemo .java
throws
*/
public class MyExDemo {
public static void main(String[] args) throws Exception {
Scanner input = new Scanner(System.in);
System.out.println("请输入性别:");
String sex=input.next();
sexSex(sex);
}
//输入一个参数,给性别赋值
public static void sexSex(String sex) throws Exception{
Person p=new Person();
//输入的不是男也不是女
if((!sex.equals("男"))&&(!sex.equals("女"))) {
// 抛出一个异常
throw new MyException("输入性别类型不对,只能是男或者女");
}
p.sex=sex;
System.out.println(p);
}
}
class Person{
String sex;
@Override
public String toString() {
return "Person [sex=" + sex + "]";
}
}
- MyExDemo2 .java
try catch
public class MyExDemo2 {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.println("请输入性别:");
String sex=input.next();
sexSex(sex);
}
//输入一个参数,给性别赋值
public static void sexSex(String sex){
Person p=new Person();
//输入的不是男也不是女
if((!sex.equals("男"))&&(!sex.equals("女"))) {
// 抛出一个异常
try {
throw new MyException("输入性别类型不对,只能是男或者女");
} catch (MyException e) {
// TODO Auto-generated catch block
// 输入类型不匹配时,可以进行异常的捕获和处理
System.out.println(e.getMessage());
sex="男";
}
}
p.sex=sex;
System.out.println(p);
}
}