异常的方法
处理异常的三种解决方法
1.给用户提示
try {
int x=10;
int y =0;
int t = x/y;
System.out.println("可能异常后面的代码");
}catch (Exception e){
System.out.println("有异常,不知道啥异常");//异常处理1.给用户提醒
}
2.直接将异常信息打印在控制台
try {
int x=10;
int y =0;
int t = x/y;
System.out.println("可能异常后面的代码");
}catch (Exception e){
//使用e.getMessage ();直接将异常打印在控制台
System.out.println(e.getMessage());
}
3.记录日志:异常的信息记录在文件中
public static void main(String[] args) throws FileNotFoundException {
try {
int x=10;
int y =0;
int t = x/y;
System.out.println("可能异常后面的代码");
}catch (Exception e){
//打印输出异常的信息,记录日志:异常的信息记录在文件中,需要throws FileNotFoundException; 打印在E盘log.txt文件中
/*e.printStackTrace("E:\\log.txt");*/
PrintWriter p = new PrintWriter("E:\\log.txt");
e.printStackTrace(p);
p.flush();
p.close();//关闭与文件的通道,如果没有,文件一直在程序中被占用
}
System.out.println("后面的代码");
}
Finally
/**
try{
可能出现异常的代码
}catch (异常类型(只捕获指定类型的异常)){
处理异常
}finally {
无论try,catch 中出现异常,也会先执行finally中的内容
}
try{
可能出现异常的代码
}finally {
try+finally,没有进行异常处理,try中一旦出现问题,后面的代码就结束运行
}
System.out.println("后面的代码");
*/
public class FinallyDemo1 {
public static void main(String[] args) {
FinallyDemo1 f = new FinallyDemo1();
System.out.println(f.Test(10,0));
}
public int Test(int x , int y){
try{
return x/y;
}catch (Exception e){
return -1;
}finally {
/*
即使try,catch 中出现异常,已经返回值,但也会先执行finally中的内容
*/
System.out.println("Finally 中的代码");
}
}
}
throws
定义一个方法时可以使用throws关键字声明,表示此方法不处理异常,而是交给方法调用处进行处理
声明:public void test() throws 异常1,异常2{
}
使用了throws的方法,调用时必须处理声明的异常,要么try-catch,要么继续使用throws声明
/**
* throws:作为方法的声明,声明此方法中可能出现的某种异常,调用时,需要注意
*/
public static void main(String[] args) {
Demo4 d4 = new Demo4();
try {
d4.Meth1();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public void Meth1() throws UnsupportedEncodingException, FileNotFoundException {
Meth2();
}
//声明此方法可能会出现异常,可以声明多个,一般多为编译期异常
public void Meth2() throws UnsupportedEncodingException, FileNotFoundException {
try {
"abc".getBytes("utf-8");
} finally {
System.out.println("需要执行的代码");
}
}
任何方法都可以使用throws关键字声明异常类型,包括抽象方法
子类重写父类的方法时,子类方法不能声明抛出比父类类型更大的异常
public abstract class Demo5 {
public abstract void test() throws UnsupportedEncodingException;
}
public abstract class Demo5Son extends Demo5{
/**
子类中重写方法,声明的异常类型小于或等于父类的异常类型
*/
@Override
public void test() throws UnsupportedEncodingException {
}
}
throw
用于显示抛出异常,抛出时抛出的是一个异常类的实例化对象
语法:throw throw new 异常类构造方法
public class Demo6 {
public static void main(String[] args) throws SorcseException {
Demo6 d6=new Demo6();
try {
System.out.println(d6.checkScore(101));
} catch (Exception e) {
e.printStackTrace();
}
}
public String checkScore(int score) throws SorcseException{
if (score<0||score>100){
//当不满足某种条件时,在方法中显示的抛出一个异常对象,执行后后面的代码就不执行
throw new RuntimeException();
}
if (score>90){
return "优秀";
}else{
return "不优秀";
}
}
}
自定义异常
用自定义异常标记业务逻辑的错误,避免与标准异常混淆
public class Demo6 {
public static void main(String[] args) {
Demo6 d6 = new Demo6();
try {
d6.checkScore(101);
} catch (Exception e) {
e.getMessage();
e.printStackTrace();
}
}
public String checkScore ( int score) throws ScoreException {
if (score < 0 || score > 100) {
throw new ScoreException("成绩不合法");
}
if (score > 90) {
return "优秀";
} else {
return "不优秀";
}
}
}
/*
自定义异常类:根据业务逻辑的需要,来指定一种场景下的异常类
*/
public class ScoreException extends Exception{
public ScoreException(String message) {
super(message);
}
}
throw和throws区别(this super )
- throw用于方法体中,用来抛出一个实际的异常对象,使用throw后,要么使用try-catch 捕获异常,要么throws声明异常
- throws用于方法声明处,用来声明该方法可能会产生的异常类型,可以是多个异常类型,用来强制调用该方法时处理这些异常
- throws可用于抽象方法