目录
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
- 可以单独与try配合也可以try---catch() 配置。
- 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
-
下载jar
别人写好的某个功能---打包为一个压缩文件--jar包
-
将jar添加到项目中去
-
课堂演示
-
添加配置文件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
-
使用
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致命级别的⽇志
程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少