Java 中的异常处理机制

生活中的异常:  不能够完整而顺利的完成一些工作

 根据不同的异常进行相应的处理,而不会就此终端我们的生活

引出: 

 异常处理:

  方式:      1.选择结构(逻辑判断)避免

     demo:if逻辑处理异常

import java.util.Scanner;


public class TestIF {

    /**
     * 程序中的异常
     * @param 房上的猫
     */
    public static void main(String[] args) {
        //处理异常的方式1:if ..逻辑判断
        Scanner input=new Scanner(System.in);
        System.out.print("请输入第一个整数:");
        if(input.hasNextInt()==true){
            
            int num1=input.nextInt();//1)输入不是整数类型  2)除法 输入 0
            System.out.print("请输入第二个整数:");
            int num2=input.nextInt();
            if(num2==0){
                System.err.println("除数不能为0,程序退出");
                System.exit(1);// 退出程序
            }
            else
            {
                int jg=num1/num2;//输入num2可能输入  0
                System.out.println(jg);
            }
        }else
        {
            System.err.println("输入的不是整数,程序退出");
            System.exit(1);
        }
        
        

    }

}

 弊端:  1)代码臃肿         2)程序员要花很大精力“堵漏洞”         3)程序员很难堵住所有漏洞 2.使用异常机制

异常处理机制,是专门应对异常出现后,如何解决该异常的一种手段     异常是指程序在运行过程中所发生的不正常的时间,它会中断正在运行的程序     Java编程语言使用异常处理机制为程序提供了错误处理机制 异常处理关键字 捕获异常:  try(试一试):执行可能产生异常的代码 catch(抓住,捕获):捕获异常 finally(最终):无论是否发生异常,代码总能执行 声明异常: throws(抛出):声明方法可能要抛出的各种异常 抛出异常:  throw(抛出):手动抛出异常

   throws声明异常,抛给调用者,调用必须进行try...catch    位置:方法名后面进行 声明异常,多个异常使用逗号隔开     //声明异常,多个异常用逗号隔开   只要有throws,强制要求方法调度方法必须 手段1:try catch 2.继续向上抛  public static void a() throws 异常类型{      //可能出现异常的代码  }    throw:手动抛出异常        throw new Exception("异常");

 注:在真实开发中,如果我们定制了工具类,工具类中有特别复杂的方法,需要各种断定,这个时候,工具类的方法一定有一个机制,就是异常上抛的机制,作用:为了工具的使用房,可以感知到这个异常

 demo 01:

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


public class TestExceptionThrows1 {

    /**
     * throws声明异常,抛给调用者处理,调用者必须进行try..catch
     * 位置: 方法名后面进行 声明异常,多个异常使用逗号隔开
     */
    public static void divid() throws InputMismatchException,ArithmeticException,Exception{
    
            Scanner input=new Scanner(System.in);
            System.out.print("请输入第一个整数:");
            int num1=input.nextInt();//1)输入不是整数类型  2)除法 输入 0
            System.out.print("请输入第二个整数:");
            int num2=input.nextInt();
            int jg=num1/num2;//输入num2可能输入  0
            System.out.println(jg);
                    
            
        
    }
    public static void main(String[] args) {
        //调用处必须处理
        try {
            divid();
        } catch (InputMismatchException e) {
            System.err.println("输入不匹配");
            e.printStackTrace();
        } catch (ArithmeticException e) {
             System.err.println("除数不能为0");
            e.printStackTrace();
        } catch (Exception e) {
             System.err.println(e.getMessage());
            e.printStackTrace();
        }
        
        
    }

}

demo 02:

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


public class TestExceptionThrows2 {

    /**
     * throws声明异常,抛给调用者处理,调用者必须进行try..catch
     * 位置: 方法名后面进行 声明异常,多个异常使用逗号隔开
     */
    public static void divid() throws InputMismatchException,ArithmeticException,Exception{
    
            Scanner input=new Scanner(System.in);
            System.out.print("请输入第一个整数:");
            int num1=input.nextInt();//1)输入不是整数类型  2)除法 输入 0
            System.out.print("请输入第二个整数:");
            int num2=input.nextInt();
            int jg=num1/num2;//输入num2可能输入  0
            System.out.println(jg);
                    
            
        
    }
    
    public static void main(String[] args) throws InputMismatchException,ArithmeticException,Exception{
        //调用处不处理,抛给了java虚拟机继续处理
        
            divid();
        
        
        
    }

}

demo 03:

public class PersonThrow {
    private String  name;
    private int age;
    private String sex;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        if(age>=0 && age<=100){
            this.age = age;
        }else{
            try {
                //手动抛出异常
                throw new Exception("输入的年龄必须是0~100之间的数");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) throws Exception {
        if(!sex.equals("男") && !sex.equals("女")){
            throw new Exception("输入必须是男或女");
        }else
        {
        this.sex = sex;
        }
    }
    
    
}

异常的分类

常见的异常处理类型

解析:检查时异常:编译时系统提示必须使用异常处理机制环绕(chenked异常)

    运行时异常:运行时抛出异常

使用try-catch-finally处理异常

  异常是一种特殊的对象,类型为 java.lang.Exception或其子类

 语法: 格式1 :

try{
            //可能发生异常的语句
 } catch(Exception){
    //捕获异常
 }finally{
   //无论是否有异常,都进入执行
 }

执行顺序:   try块 发生异常 产生异常对象   异常类型匹配 进入 catch块   程序继续执行

printStactTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程   ex.getMessage();     返回异常信息描述的字符串   ex.printStactTrace();   异常堆栈信息   显示具体异常类型   显示产生异常的具体位置

当异常类型不匹配时,程序之间中断

打印自定义处理信息:  System.err.println(“自定义信息”);

 多路异常捕获:

多个catch块并列,但异常类型不同(捕获可能出现多种异常的代码块)

注:子异常一定在顶级一次之前

   demo:try..catch处理异常

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


public class TestExceptionTry {

    /**
     * 
     */
    public static void main(String[] args) {
        
        try {
            Scanner input=new Scanner(System.in);
            System.out.print("请输入第一个整数:");
            int num1=input.nextInt();//1)输入不是整数类型  2)除法 输入 0
            System.out.print("请输入第二个整数:");
            int num2=input.nextInt();
            int jg=num1/num2;//输入num2可能输入  0
            System.out.println(jg);
        }catch(ArithmeticException ae){
            System.err.println("除数不能为0"+ae.getMessage());
            ae.printStackTrace();
        }catch(InputMismatchException ae){
            System.err.println("输入的不是整数");
            System.exit(1);
        }    
        catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        
        
    }

}

(C) 房上的猫 。 保留所有权利。  https://www.cnblogs.com/lsy131479/

如需转载,请注明出处!!!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Script Boy (CN-SIMO)

突如其来的"中断异常",我(Java)该如何处理?

一、何为异常? 1.生活中的实例 生活中存在许多不正常: 上班路上自行车掉链子 上厕所手机掉马桶 下班回家钥匙丢失 。。。。。。。 2.程序中的实...

2180
来自专栏Java爬坑系列

【JAVA零基础入门系列】Day6 Java字符串

  字符串,是我们最常用的类型,每个用双引号来表示的串都是一个字符串。Java中的字符串是一个预定义的类,跟C++ 一样叫String,而不是Char数组。至于...

1758
来自专栏Java爬坑系列

【Java】单词倒序输出

  如何将一段单词倒序输出?把“Hello Java Hello China”变成“China Hello Java Hello”?   看起来好像很简单,只需...

1908
来自专栏编程之旅

线性表的顺序存储结构

举个简单的例子,蔺老师在给九班学生安排座位之前,会让学生们从矮到高按照身高的高矮升序排列,假如蔺老师的班上只有十个学生,而全班共有50个座位,那蔺老师会把这10...

592
来自专栏蘑菇先生的技术笔记

探索C#之6.0语法糖剖析

1966
来自专栏ios 技术积累

ios Category

category是Objective-C 2.0之后添加的语言特性,category的主要作用是为已经存在的类添加方法。除此之外,apple还推荐了catego...

381
来自专栏老马说编程

(24) 异常 (上) / 计算机程序的思维逻辑

之前我们介绍的基本类型、类、接口、枚举都是在表示和操作数据,操作的过程中可能有很多出错的情况,出错的原因可能是多方面的,有的是不可控的内部原因,比如内存不够了、...

1626
来自专栏偏前端工程师的驿站

(cljs/run-at (->JSVM :browser) "语言基础")

前言  两年多前知道cljs的存在时十分兴奋,但因为工作中根本用不上,国内也没有专门的职位于是搁置了对其的探索。而近一两年来又刮起了函数式编程的风潮,恰逢有幸主...

1947
来自专栏郭耀华‘s Blog

Java集合框架(五)—— Map、HashMap、Hashtable、Properties、SortedMap、TreeMap、WeakHashMap、IdentityHashMap、EnumMap

Map Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另一组值用于保存Map里的value,key和v...

2697
来自专栏JarvanMo的IT专栏

Dart In Action -Dar的基本数据类型(一)

本文基本上是将dart官网部分内容进行翻译,没兴趣的请出门左转至Dart的官网,有兴趣的同志请继续阅读本文。 Flutter教程在这里

642

扫描关注云+社区