异常在生活中随处可能发生, 生活中的上班开车回家,在中途堵车,这就是异常,异常就是在程序运行过程中出现错误
import java.util.*;
public class Test3 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("请输入被除数:");
try {
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(String.format("%d / %d = %d", num1,num2,num1/num2));
System.out.println("感谢所有本程序");
} catch (Exception e) {
System.err.println("出现错误:被除数和除数必须是整数,"+"除数不能为零。");
e.printStackTrace();
}
}
}
在这里有三种情况:
try语句块中的语句正常执行,不会发生异常,catch块中的语句不执行。
try语句块在执行中遇到异常,且相应的catch中声明的异常匹配,try中剩余的代码被忽略,catch块中语句将执行。
try语句块在执行中遇到异常,且相应的catch中声明的异常不匹配,那么程序立刻推出。
异常有如下:
异常 | 说明 |
---|---|
Exception | 异常层次结构的根类 |
ArithmeticException | 算术错误情形,如以零作为除数 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 尝试访问null对象成员 |
ClassNotFoundException | 不能加载所需的类 |
InputMismatchException | 欲得到的数据类型与实际输入的类型不匹配 |
IllegalArgumentException | 对象强制类型转换出错 |
ClassCastException | 对象强制类型转换出错 |
NumberFormatException | 数字格式转换异常,如把“abc”转换成数字 |
public class Test4 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("请输入被除数:");
try {
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(String.format("%d / %d = %d", num1,num2,num1/num2));
} catch (Exception e) {
System.err.println("出现错误:被除数和除数必须是整数,"+"除数不能为零。");
System.out.println(e.getMessage());
}finally {
System.out.println("感谢所有本程序");
}
}
}
在这里有二种情况
import java.util.Scanner;
import java.util.InputMismatchException;//注意这里的MismatchException要导入
public class Test7 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("请输入被除数:");
try {
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(String.format("%d / %d = %d", num1,num2,num1/num2));
} catch (InputMismatchException e) {
System.err.println("被除数和除数必须是整数。");
}catch(ArithmeticException e) {
System.err.println("除数不能为零。");
}catch(Exception ex){
System.err.println("其他未知异常。");
}finally {
System.out.println("感谢所有本程序!");
}
}
}
多重catch块必须由从子类到父类,因为所有的Exception都是从Exception类开始。
如果将父类放在前面那么后面的exception就不会被执行。
public class Test8 {
public static void main(String[] args) {
try {
divide();
} catch (Exception e) {
System.out.println("出现错误:被除数和除数必须是整数,"+"除数不能为零");
e.printStackTrace();
}
}
public static void divide() throws Exception {
Scanner in = new Scanner(System.in);
System.out.print("请输入被除数:");
int num1 = in.nextInt();
System.out.print("请输入除数");
int num2 = in.nextInt();
System.out.println(String.format("%d / %d = %d", num1,num2,num1/num2));
}
}
public class Person {
private String name = "";
private int age = 0;
private String sex = "男";
public void setSex(String sex) throws Exception{
if ("男".equals(sex)||"女".equals(sex)) {
this.sex = sex;
}else {
throw new Exception("性别必须是\"男\"或者\"女\"!");
}
}
public void print() {
System.out.println(this.name+"("+this.sex+","+this.age+"岁)");
}
}
import org.apache.log4j.Logger;
public class Test9 {
private static Logger logger = Logger.getLogger(Test11.class.getName());
public static void main(String[] args) {
Person person = new Person();
try {
person.setSex("Male");
person.print();
} catch (Exception e) {
logger.error("被除数和除数必须是整数",e);
e.printStackTrace();
}
}
}
Throw和throws的区别在一下3方面:
Java的异常体系包括许多异常类,它们之间存在继承关系。
在MyEclipsc中使用log4j的步骤:
日志根据记录内容的不同,主要分为以下三类:
输出级别与命名
log4j.rootLogger = debug ,stdout
debug指的是日志记录器(Logger)的输出级别:
级别为:
fatal>error>warn>info>debug
### 设置Logger输出级别和输出目的地 ###
log4j.rootLogger=debug, stdout,logfile
### 把日志信息输出到控制台 ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
### 把日志信息输出到文件:jbit.log ###
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=jbit.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}%l %F %p %m%n
ConsoleAppender:输出日志事件到控制台。通过Target属性配置输出到System.out或System.err默认的目标到System.out
FileAppender:输出日志事件到一个文件。通过File属性配置文件的路径及名称
SimpleLayout:以一种非常简单的方式格式化日志输出,它输出级别Level,然后跟着一个破折号“—”,最后是日志消息
PatternLayout:根据指定的转换模式格式化日志输出,从而支持丰富多样的输出格式。需要配置layout.ConversionPattern属性,若没有配置该属性,则使用默认的转换模式