29.0/异常/自定义异常/日志

本文介绍了Java中的异常处理机制,包括try-catch块、finally语句、throws关键字的使用,以及自定义异常和日志打印的最佳实践,旨在提升程序的健壮性和可维护性。
摘要由CSDN通过智能技术生成

目录

29.1什么是异常?

29.1.2为什么使用异常处理?

 29.2java如何进行异常处理

 29.3第一种使用try....catch方式

异常处理的原理(面试题)

29.4finally

29.5第二种使用throws

 29.6throw关键字

 29.7自定义异常

29.8日志打印


29.1什么是异常?

异常就是程序执行时,出现的意外情况。 导致你能无法正常运行【终止】。

29.1.2为什么使用异常处理?

 处理异常后程序可以继续执行,不会终止。

public class Test {
    public static void main(String[] args) {
        int a=20;
        int b=0;
        System.out.println("计算开始=========================");
        int r=a/b;
        System.out.println("计算的结果=============="+r);

        System.out.println("计算结束====================");
    }
}

 

在代码第6行出现问题后,导致第6行之后的代码都无法执行了。--导致程序终止。

可以使用异常处理方式解决上面因出现异常而导致程序终止的问题。

 29.2java如何进行异常处理

java提高了两种异常处理的方式:

第一种: try{}catch(异常类 对象){}finally{}

第二种: throws抛出

 29.3第一种使用try....catch方式

语法:
  try{
     //可能出现异常的代码
  }catch(异常类 对象){
     //捕获异常
  }finally{
     //无论是否有异常都会执行---关闭资源。
  }
public class Test {
    public static void main(String[] args) {
        int a=20;
        int b=0;
        System.out.println("计算开始=========================");
        try {
            int r = a / b;
            System.out.println("计算的结果==============" + r);
        }catch (ArithmeticException e){
            System.out.println("捕获异常并处理异常");
        }
        System.out.println("计算结束====================");
    }
}

异常处理的原理(面试题)

package demo01;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("计算开始=========================");
        try {
            String s1=sc.next();
            String s2=sc.next();

            int a=Integer.parseInt(s1);
            int b=Integer.parseInt(s2);
            int r = a / b;
            System.out.println("计算的结果==============" + r);
        }catch (ArithmeticException e){
            System.out.println("捕获异常并处理异常");
        }catch (InputMismatchException e){
            System.out.println("捕获到输入格式错误异常并处理");
        }catch(NumberFormatException e){
            System.out.println("数字格式转化异常并处理");
        }
        System.out.println("计算结束====================");
    }
}

可以在try后面跟多个catch,不同的catch捕获不同的异常。

如果发生其他的异常呢,

难道我们还要搞一个catch吗,

如果由1000个异常,那么我们难道就需要搞1000个catch来捕获吗?

如何解决这个问题:

多态。

Throwable该类是所有异常的父类。

​    它下面由两个子类:

​    Error: 错误。这种错误程序员无法解决。内存溢出

​    Exception: 异常。---该类
package demo01;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("计算开始=========================");
        try {
            String s1=sc.next();
            String s2=sc.next();

            int a=Integer.parseInt(s1);
            int b=Integer.parseInt(s2);
            int r = a / b;//----
            System.out.println("计算的结果==============" + r);
        }catch (Exception e){ //Exception e=new Arith()
            System.out.println("捕获异常并处理");
        }
        System.out.println("计算结束====================");
    }
}

实验一下发生多种异常--可以直接使用Exception捕获。

29.4finally

  1. 可以单独与try配合也可以try---catch() 配置。
  2. finally里面的代码必须执行。

package demo01;


public class Test02 {
    public static void main(String[] args) {
        int s = fun();
        System.out.println("1.方法返回的结果:"+s);
    }

    public static int fun(){
        int a=10;
        int b=2;
        int r=0;
        try{
             r=a/b;
            System.out.println("2.正常结束");
            return r;
        }catch (Exception e){
            System.out.println("3.异常捕获并处理");
        }finally {
            System.out.println("4. 无论有没有异常都会执行"); //无论有没有return都会执行该语句
        }
        System.out.println("5.非正常结束");
        return 0;
    }
}

29.5第二种使用throws

抛出异常--抛给调用者。

语法:

public 返回类型 方法名(参数列表) throws 异常类型{
}
public static void fun02() throws Exception{
        int a=10;
        int b=0;
        int c=a/b;
    }

Throwable----它是所有异常的父类

---Error: 错误。表示程序员无法处理

---Exception: 异常.程序能处理

     1. 运行时异常:RuntimeException
            2. 非运行时异常: 其他

 29.6throw关键字

人为抛出一个异常对象。

原来我们写代码时,都是代码自己产生一个异常对象,

那么我们也可以用人为产生一个异常对象。

语法:

throw new 异常类();
 public static void fun03() throws RuntimeException{
        //自己处理
//        try {
//            throw new RuntimeException("人为产生的异常对象");
//        }catch (Exception e){
//
//        }
        throw new RuntimeException("人为产生的异常对象");
    }

例子:

创建一个学生类:

属性: 姓名 年龄 性别

方法: 显示属性信息。

package demo01;


public class Test03 {
    public static void main(String[] args) {
         Student s=new Student();
         s.setName("闫克起");
         s.setAge(25);
         System.out.println(s);

         Student s2=new Student();
         s.setName("赖林龙");
         try {
             s.setAge(-10);
         }catch (Exception e){
             System.out.println(e.getMessage());
              s.setAge(18);
         }
        System.out.println(s);

    }
}
class Student{
     private String name;
     private int age;
    //传入的年龄 1~100 否则不合法。
    public void setAge(int age) throws RuntimeException  {
        if(age>=1&&age<=100){
            this.age = age;
        }else{
            //System.out.println("年龄不合法"); //只能在控制台看见
            throw new RuntimeException("年龄不合法");
        }
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }
}

 29.7自定义异常

系统如果只提供一个Exception类:try catch--够用。

不管什么异常都可以用exception接收。

这些异常是为了分类处理的:接收到不同的异常做不同处理。

比如:账号不存在 密码错误 账号被锁定了----可以通过不同的异常来区分。

语法: 

public class 异常类  extends Exception{
    public 异常类(String msg){
       super(msg);
    }
}
public class AccountNotFoundException  extends Exception{

    public AccountNotFoundException(String msg){
        super(msg);
    }
}
package demo01;

import java.util.Scanner;


public class Test04 {
    public static void main(String[] args) {
        try {
            login();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void login() throws Exception{
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入账号:");
        String zh=sc.next();
        System.out.println("请输入密码:");
        String pwd=sc.next();

        if(zh.equals("admin")){
            if(pwd.equals("123456")){
                System.out.println("登录成功");
            }else{
                throw new PasswordWrongException("密码错误");
            }
        }else{
            throw new AccountNotFoundException("账号错误");
        }
    }
}
//不能达到见名知意,为了操作方便,我们需要自定义异常。
//创建一个类--继承Exception就可以--并定义一个构造方法。

29.8日志打印

以后我们打印的信息--能不能放在控制台---不能。 为了项目维护方便 我们需要把日志打印到文件中。---维护人员通过查看日志文件---维护项目。

log for java log4j

  1. 下载jar

    别人写好的某个功能---打包为一个压缩文件--jar包

log4j-1.2.9.jar 

  1. 将jar添加到项目中去

  • 课堂演示

  1. 添加配置文件log4j.properties

    ### 把日志信息输出到控制台  ###
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %m%n
    ### 把日志信息输出到文件:anbo.log ###
    log4j.appender.file=org.apache.log4j.FileAppender
    #指定输出目录
    log4j.appender.file.File=AAA.log
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l  %m%n
    ### 设置优先级别、以及输出源 级别由debug info warn error ###
    log4j.rootLogger=info,stdout,file
  2. 使用

public class PersonTest{
  public static void main(String[] args){
    //getLogger("PersonTest") 当前在哪个类中添加日志  括号中就写该类的类名。
    Logger logger = Logger.getLogger("PersonTest");
    logger.info("你好哈哈哈");
    logger.warn("此处警告日志");
    logger.debug("你好1111111111111111");
    logger.error();
  }
}

DEBUG - debug调试级别的⽇志

INFO - info 正常级别的⽇志

WARN - warn警告级别的⽇志

ERROR - error错误级别的⽇志

FATAL - fatal致命级别的⽇志

程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光明是人的信仰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值