异常

Throwable 类

Throwable t = new Throwable();
System.out.println(t.toString());
//全限定名 全类名
——>java. lang. Throwable
Throwable t = new Throwable();
System.out.println(t.getMessage());
——> null
//getMessage()
Throwable t = new Throwable("懒癌");
System.out.println(t.getMessage());
——> 懒癌
//printStackTrace()
public class Test{
  public static void main(String[] args) {
    test();
  }
public static void test(){
  Throwable t = new Throwable ("懒癌");
  t.printStackTrace();
  }
}
java.lang.Throwable: cancer
    at com.TurtleGraph.Test.test(Test.java:16)
    at com.TurtleGraph.Test.main(Test.java:13)
image.png

已知直接子类:

  • Error: Error 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获的严重问题。大多数这样的错误都是异常条件。虽然 ThreadDeath 错误是一个“正规”的条件,但它也是 Error 的子类,因为大多数应用程序都不应该试图捕获它。
    Java虚拟机无法解决的严重问题。
    Error是jvm或硬件出现的错误,一般不用编写代码取处理
    如:JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理。
  • Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。
    Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。
    子类:
    运行时异常,不用显式处理
    检查性异常,显式处理,不是语法错误
//检查性异常
public static void main(String[] args){
  try{
      Class.froName("");
  }catch(Exception e){

  }
}

Exception是需要代码去进行处理
例如:
1 空指针访问
2 试图读取不存在的文件
3 网络连接中断

public static void main(String[] args){
    test(2,0);  
  }
public static void test(int a, int b){
    //当系统直行道a/b时,发现b是0; 由于数学上要求出书不能为0,生成异常对象,调用异常对象的printStackTrace方法
    int c = a/b;
    System.out.println(c);
  }
——> ArithmeticException 数学异常

捕获异常:

public static void main(String[] args){
    test(2,0);  
  }
public static void test(int a, int b){
    //当系统直行道a/b时,发现b是0; 由于数学上要求出书不能为0,生成异常对象
    //把可能出现异常的代码放进try里
    try{
      int c = a/b;
      
    }catch(Exception e){
      System.out.println("除数不能为0");
    }
  System.out.println("hello world");
  }
——> 除数不能为0
    hello world

捕获异常需要注意的细节:
1.try块中的异常经过处理,try块后的代码可以正常运行
2.如果try块里出现了异常代码,try块里异常代码之后的代码就不会执行
3.一个try块后面是可以跟多个catch块,也就是一个try块可以捕获多种类型异常
4.一个try块可以捕获多种类型异常,但是异常的类型必须从小到大进行捕获,否则编译报错

抛出处理

抛出处理要注意的细节

    public static void main(String[] args) {
        

    }
    public static void test(){
        //throw throws
        try {
            throw new Exception();
        }catch (Exception e){
            
        }
    }
}
    public static void main(String[] args) {
        try{
            test();
        }catch (Exception e){
            
        }

    }

    public static void test() throws Exception {
        //throw throws
        throw new Exception();
    }
}
    public static void main(String[] args) throws Exception{
            test();

    }

    public static void test() throws Exception {
        //throw throws
        throw new Exception();
    }
}

1.如果一个方法内部抛出了异常,那么必须要在方法上声明抛出
2.如果调用一个声明抛出异常的方法,那调用者必须处理
3.如果一个方法内部抛出一个异常对象,那么throw语句后面的代码都不会执行,该方法马上停止
4.在一种情况下,一次只能抛出一种异常对象
谁调用谁处理,如果没有处理就是检查性异常

throw & throws

1.throw关键字是用于方法内部,throws用于方法声明
2.throw用于方法内部抛出一个异常对象,throws用于方法声明抛出异常类型
3.throw后只能跟一个异常对象,throws一次可以跟多个异常类型

自定义异常

步骤:
自定义一个类继承Exception

class NoIpException extends Exception{

}
//模拟FQ,如果没插网线,请插上网线
public class Test {
    public static void main(String[] args) {
        try{
            login(null);
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("请插网线");
        }

    }
    public static void login(String ip) throws NoIpException{
        if (ip == null){
            throw  new NoIpException();
        }else {
            System.out.println("您的好友列表: ");
        }
    }
    

}
class NoIpException extends Exception{

}
import org.omg.PortableServer.ThreadPolicyOperations;

import java.util.Scanner;

/**
 * Created by Administrator on 2018/5/30.
 */
public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int money = scanner.nextInt();
               try {
                   payment(money);
               }catch (Exception e){
                   e.printStackTrace();
                   System.out.println("霸王餐");
               }
    }
    public static void payment(int money) throws NoEnoughMoney{
        if (money < 20){
            throw new NoEnoughMoney();
        }else {
            System.out.println("paid");
        }
    }
}
class NoEnoughMoney extends Exception{

}

运行时异常&编译时异常

如果方法上声明了一个运行时异常,那么在方法上可以声明也可以不声明,调用者可以处理也可以不处理,如果一个方法内部抛出了一个编译时异常对象,那么方法上就必须要声明,调用者也必须处理
RunTimeException及其子类都是运行异常
RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。
可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明。

finally块

资源文件使用完一定要解除占用,别的程序无法对该文件进行操作,使用finally的前提一定要使用try块
即使出现异常还是那个也会执行finally块
return, throw 之后finally依旧执行

public class Test {
    public static void main(String[] args) {
        try{
            int c = 1/0;
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("执行finally块");
        }
    }
}
——> 执行finally块
public class Test {
    public static void main(String[] args) {
        try{
            int c = 1/1;
            return;
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("执行finally块");
        }
    }
}
——> 执行finally块

exit 之后finally不执行
exit:终止当前运行的Java虚拟机

public class Test {
    public static void main(String[] args) {
        try{
            int c = 1/1;
            System.exit(1);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("执行finally块");
        }
    }
}
——> 执行finally块

组合:

try+finally:适合处理运行时异常
try+catch:不用释放资源
try+catch+finally:适合处理异常并且释放资源 Ctrl+alt+t

try{
    ......  //可能产生异常的代码
}
catch( ExceptionName1 e ){
    ......  //当产生ExceptionName1型异常时的处置措施
}
catch( ExceptionName2 e ){
......  //当产生ExceptionName2型异常时的处置措施
}  
[ finally{
......   //无论是否发生异常,都无条件执行的语句
        }  ]
image.png

捕获异常的相关信息

  • getMessage() 获取异常信息,返回字符串。打印出错原因
  • printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。打印函数调用栈
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容