基础学习day10--异常、包

一、异常

1.1、异常定义

异常:--不正常,程序在运行时出现不正常情况

异常由来:其实也是现实生活中一个具体的事物,马可以通过JAVA的类的形式表现描述,并封装成类。

Java对不正常情况描述后的,对象体现。

异常:两种.

一种是严重的问题:java通过Error类进行描述

对于Error一般不编写针对必的代码对其进行处理

对与非严重的:java通过Exception类进行描述

对于Exception可以使用针对必的处理方式进行处理。

示例:

package com.day10.demo1;

public class Demo1 {

    public static void main(String[] args) {

        System.out.println(div(5,0));
        System.out.println("over");

    }

    public static int div(int a,int b){
        return a/b;
    }

}

结果:

Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.day10.demo1.Demo1.div(Demo1.java:14)
at com.day10.demo1.Demo1.main(Demo1.java:7)

算术异常,因为除数为0,所以,有异常了

1.2、异常体系结构

Java 提供了两类主要的异常:runtime exception 和checked exception。所有的checked exception 是从java.lang.Exception 类衍生出来的,而
runtime exception 则是从java.lang.RuntimeException 或java.lang.Error类衍生出来的。

它们的不同之处表现在两方面:机制上和逻辑上

runtime exceptions:

  • 在定义方法时不需要声明会抛出runtime exception
  • 在调用这个方法时不需要捕获这个runtime exception
  • runtime exception 是从java.lang.RuntimeException 或
  • java.lang.Error 类衍生出来的。

checked exceptions:

  • 定义方法时必须声明所有可能会抛出的checked exception
  • 在调用这个方法时,必须捕获它的checked exception,不然就得
  • 把它的exception 传递下去
  • checked exception 是从java.lang.Exception 类衍生出来的

从逻辑的角度来说,checked exceptions 和runtime exception 是有不同的使用目的的。

checked exception 用来指示一种调用方能够直接处理的异常情况。checked exception 迫使你捕获它并处理这种异常情况。

而runtime exception 则用来指示一种调用方本身无法处理或恢复的程序错误。

1.3、异常使用语句

try{
    // 有可能出现异常的语句
}catch(异常类 异常对象){
    // 编写异常的处理语句
}[ catch(异常类 异常对象){
    // 编写异常的处理语句
} catch(异常类 异常对象){
    // 编写异常的处理语句
} …. ]
[finally{
    一定会运行到的程序代码 ;
}

主要搭配:try-catch、try-catch-finally、try-finally三种形式

1.4、使用try--catch

没有使用异常

package com.day10.exception.demo1;

public class Demo1 {

    public static void main(String[] args) {

        int x=5;
        int y=0;
        int index=div(x,y);
        System.out.println("执行完成");

    }
     public static int div(int a,int b){
            return a/b;
        }
}

结果:

Exception in thread "main" java.lang.ArithmeticException: / by zero

最后输出语句没有执行

使用try--catch

package com.day10.exception.demo1;

public class Demo1 {

    public static void main(String[] args) {

        int x=5;
        int y=0;
        try {
            int retsult=x/y;
        } catch (Exception e) {

            e.printStackTrace();
        }

        System.out.println("执行完成");

    }

}

结果:

java.lang.ArithmeticException: / by zero
at com.day10.exception.demo1.Demo1.main(Demo1.java:10)
执行完成

异常代码块后面的代码被执行了。

try-中的代码发生异常后,跳转到相就的 catch块中,捕获异常,完成后,执行异常块后面的代码

1.5、try-catch-finally

package com.day10.exception.demo1;

public class Demo1 {

    public static void main(String[] args) {

        int x=5;
        int y=0;
        try {
            int retsult=x/y;
            System.out.println("执行到我说明没有异常");
        } catch (Exception e) {
            System.out.println("发生异常了");
            e.printStackTrace();
        }finally{
            System.out.println("我一定会被执行");
        }

        System.out.println("执行完成");

    }

}

结果:

发生异常了
我一定会被执行
执行完成
java.lang.ArithmeticException: / by zero
at com.day10.exception.demo1.Demo1.main(Demo1.java:10)

1.6、finally中的代码不执行

package com.day10.exception.demo1;

public class Demo1 {

    public static void main(String[] args) {

        int x=5;
        int y=0;
        try {
            int retsult=x/y;
            System.out.println("执行到我说明没有异常");
        } catch (Exception e) {
            System.out.println("发生异常了");
            e.printStackTrace();
            System.exit(0); //或者-1
        }finally{
            System.out.println("我一定会被执行");
        }

        System.out.println("执行完成");

    }

}
发生异常了
java.lang.ArithmeticException: / by zero
    at com.day10.exception.demo1.Demo1.main(Demo1.java:10)

1.7、如果有return 怎么执行

try中有return

package com.day10.exception.demo1;

public class Demo2 {

    public static void main(String[] args) {

        System.out.println(getException());
    }
    public static int getException(){

        try {
            int x=5;
            System.out.println("try return");
            return x;
        } catch (Exception e) {
            System.out.println("catch return");
        }finally{
            System.out.println("finally return");
        }
        return 0;
    }

}

结果:

try return
finally return
5

try中的return并不会影响finally中的代码执行

catch中有return

package com.day10.exception.demo1;

public class Demo2 {

    public static void main(String[] args) {

        System.out.println(getException());
    }
    public static int getException(){
        int x=5;
        try {
            int result=x/0;
            System.out.println("try return");
            return x;
        } catch (Exception e) {
            System.out.println("catch return");
            return ++x;
        }finally{
            System.out.println("finally return");
        }
    }

}

结果:

catch return
finally return
6

catch中的return也不会影响finally中的执行,但是返回结果会是catch中的return结果,会将try中的结果覆盖

finally中有return

package com.day10.exception.demo1;

public class Demo2 {

    public static void main(String[] args) {

        System.out.println(getException());
    }
    public static int getException(){
        int x=5;
        try {
            int result=x/0;
            System.out.println("try return");
            return x;
        } catch (Exception e) {
            System.out.println("catch return");
            return ++x;
        }finally{
            System.out.println("finally return");
            return ++x;
        }
    }

}

结果:

catch return
finally return
7

finally中的return也不会影响finally中的执行,但是返回结果会是finally中的return结果,会将try和catch中的结果覆盖

1.8、多个catch块

exception异常 一定要放在最扣,不然下方的异常无法执行到,只会执行父类执行而子类的异常不会被捕获

package com.day10.exception.demo1;

import java.util.InputMismatchException;
import java.util.Scanner;
/*
 * 求2个整数的商 当异常发生时,程序如何处理
 */
public class Demo2 {

    public static void main(String[] args) {

        // 从键盘获得输入
        try {
            Scanner input = new Scanner(System.in);
            System.out.println("请输入被除数:");
            int num1 = input.nextInt();
            System.out.println("请输入除数:");
            int num2 = input.nextInt();
            int result = num1 / num2;
            System.out.println(num1 + "与" + num2 + "的商:   " + result);
        } catch (InputMismatchException e) {
            System.out.println("输入的不是数字");
            e.printStackTrace();

        } catch (ArithmeticException e) {
            System.out.println("除数不能为0");
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println("其它错误!");
            e.printStackTrace();
        } finally {
            System.out.println("谢谢使用!");
        }

    }

}

结果1:

请输入被除数:
fsd
输入的不是数字
谢谢使用!
java.util.InputMismatchException

结果2

请输入被除数:
9
请输入除数:
0
除数不能为0
谢谢使用!
java.lang.ArithmeticException: / by zero

结果3:

请输入被除数:
7
请输入除数:
3
7与3的商: 2
谢谢使用!

1.9、自定义异常

自定义异常只需要继承Exception类就

定义异常类,只需要继承Exception类即可。

当然可以继承其它的如:Exception,Throwable,RuntimeException及其子类,其中继承Exception,Throwable,效果,如果不要求调用者一定要处理抛出的异常可以继承RuntimeException及其子类

调用时只需要throw new 自定义异常名(信息)

package com.day10.exception.demo1;
/**
 * 自定义异常
 * @author denny
 *
 */
public class MyException extends Exception {

    public MyException() {
        super();
    }

    public MyException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);

    }

    public MyException(String message, Throwable cause) {
        super(message, cause);

    }

    public MyException(String message) {
        super(message);

    }

    public MyException(Throwable cause) {
        super(cause);
    }

}

上面为算定义异常,使用构造方法重载即可

1.10、throw和throws抛出异常

使用上面的算定义异常

package com.day10.exception.demo1;

public class Person {

    private String name;
    private int age;
    private String gender;

    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 <= 150) {
            this.age = age;
        } else {
            try {
                throw new MyException("年龄只能在0-150岁之间");
            } catch (MyException e) {
                e.printStackTrace();
            }
        }
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) throws MyException {//
        if(gender.equals("男")||gender.equals("女")){
        this.gender = gender;
        }else{
            throw new MyException("性别只能是男或者女!");
            /*
            throw可以在方法体内抛出异常,但必须捕获或者
            在方法体上用throws抛出
            */
        }
    }
     public void printSelf(){
         System.out.println("姓名:"+this.name+"             性别:"+this.gender+"     年龄:"+this.age);
     }

}

测试类

package com.day10.exception.demo1;

public class PersonTest {

    public static void main(String[] args) {
        Person p=new Person();

        try {
            p.setName("张三");
            p.setAge(200);
            p.setGender("人妖");
        } catch (MyException e) {
            e.getMessage();//获取异常信息
        }finally{

        }

    }

}

结果:com.day10.exception.demo1.MyException: 年龄只能在0-150岁之间

因为在执行age赋值时,已经发生异常,所以下面的性别赋没有执行

package com.day10.exception.demo1;

public class PersonTest {

    public static void main(String[] args) {
        Person p=new Person();

        try {
            p.setName("张三");
            p.setAge(20);
            p.setGender("人妖");
            p.printSelf();
        } catch (MyException e) {
            //System.out.println(e.getMessage());//获取异常信息
            e.printStackTrace();
        }finally{

        }

    }

}

结果:

com.day10.exception.demo1.MyException: 性别只能是男或者女!

二、包

2.1、包的含义

对文件进行分类管理,类似于windows中的文件夹,同一包同一层

给类提供多层命名空间,同一个文件夹文件名不相同,层次关系,

写在程序文件的第一行

类名的全称是包名.类名.

包也是一种封装形式

2.2、包的定义

package 包名,

包名必须小写,可以使用.小数点来定义多层次包

必须放在代码的第一行

javac -d  .   java文件名.java  .代表当前文件夹目录

包的出现可以把java的class文件和源文件相分离,只需要将 class文件复制出来运行就可以

定义包名不要重复

2.3、包的导入

import 包名.类名

2.4、包与包之间的访问权限

时间: 2024-10-27 17:26:05

基础学习day10--异常、包的相关文章

Java基础学习补充 -- 异常处理和log4j日志

Java中的异常处理 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. Java中所有异常的基类Throwable:Throwable又分为Error类和Exception类. 错误:Error类以及他的子类的实例,代表了JVM本身的错误.错误不能被程序员通过代码处理,Error很少出现. 异常:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件.可以被Java异常处理机制使用.Exception又分为检查时异常和运行时异常(RuntimeE

java基础学习——12、包

我们已经写了一些Java程序.之前的每个Java程序都被保存为一个文件,比如Test.java.随后,该程序被编译为Test.class.我们最终使用$java Test来运行程序. 然而,在一个正常的Java项目中,我们往往需要编写不止一个.java程序,最终的Java产品包括了所有的Java程序.因此,Java需要解决组织Java程序的问题.包(package)的目的就是为了更好的组织Java程序. 包的建立 package com.vamei.society; public class H

?Java基础学习——java.lang包下 Class

Class 类的实例表示正在运行的 Java 应用程序中的类或接口.在 Java 中,每个 Class 都有一个相应的 Class 对象,即每一个类,在生成的.class文件中,就会产生一个 Class 对象,用于表示这个类的类型信息.我们获取 Class 实例有几种方法: 例子:1.String objString = new String();Class objClass;objClass = objString.getClass(); 2. objClass = Interger.clas

黑马程序员_毕向东_Java基础视频教程_Java基础学习知识点总结

黑马程序员_毕向东_Java基础视频教程 Java基础学习知识点总结 2016年01月06日  day01 一.基础知识:软件开发 1.什么是软件?软件:一系列按照特定顺序组织的计算机数据和指令的集合. 2.常见的软件:系统软件:如:DOS,Windows,Linux等.应用软件:如:扫雷,迅雷,QQ等. 3.什么是开发?制作软件. 二.基础知识:人机交互方式 4.软件的出现实现了人与计算机之间的更好的交互. 5.交互方式:图形化界面:这种方式简单直观,使用者易于接受,容易上手操作.命令行方式:

分布式基础学习(1)--分布式文件系统

分布式基础学习 所谓分布式,在这里,很狭义的指代以Google的三驾马车,GFS.Map/Reduce.BigTable为 框架核心的分布式存储和计算系统.通常如我一样初学的人,会以Google这几份经典的论文作为开端的.它们勾勒出了分布式存储和计算的一个基本蓝图,已 可窥见其几分风韵,但终究还是由于缺少一些实现的代码和示例,色彩有些斑驳,缺少了点感性.幸好我们还有Open Source,还有Hadoop.Hadoop是 一个基于Java实现的,开源的,分布式存储和计算的项目.作为这个领域最富盛

Python基础学习(十)

Python I/O模型 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 概念说明 在进行解释之前,首先要说明几个概念: 用户空间和内核空间 进程切换 进程的阻塞 文件描述符 缓存 I/O 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件

C++基础学习教程(八)

转载请注明出处:http://blog.csdn.net/suool/article/details/38300117 引入 在进行下一步的学习之前,我们需要厘清几个概念. RAII 首先介绍一个编程习语,"RAII"(ResourceAcquisition Is Initialization,资源获取即为初始化),他描述了利用构造函数\析构函数,并在函数返回时自动析构的机制.简言之,RAII意为构造函数获取一种资源;打开一个文件,一个网络连接,或仅仅是从某I/O流中复制一些标志.这种

java基础学习总结——流

永不放弃,一切皆有可能!!! 只为成功找方法,不为失败找借口! java基础学习总结——流 一.JAVA流式输入/输出原理 流是用来读写数据的,java有一个类叫File,它封装的是文件的文件名,只是内存里面的一个对象,真正的文件是在硬盘上的一块空间,在这个文件里面存放着各种各样的数据,我们想读文件里面的数据怎么办呢?是通过一个流的方式来读,咱们要想从程序读数据,对于计算机来说,无论读什么类型的数据都是以010101101010这样的形式读取的.怎么把文件里面的数据读出来呢?你可以把文件想象成一

JAVA基础学习流程

JAVA基础学习: 第一步:学习JAVA的开发环境配置.开发第一个Java程序.也建议大家开始使用eclipse等IDE,不必纠结是不是一定要从记事本开始. 第二步:学习数据类型.运算符.变量.这是编程的基础,是程序的“砖块”.这些内容大多数编程语言都有,而且非常类似. 第三步:学习控制语句.这是编程的基础,是程序的“混凝土”.有了控制语句+变量,理论上你就可以写任意的程序了.因此,这是进入程序的门槛,需要大量的练习. 第四步:学习面向对象基础.通过类.对象.包等基本概念讲解.学习的时候,一定要

Linux新手入门书籍推荐 鸟哥的linux私房菜-基础学习篇

这本书写的不错.赞~\(≧▽≦)/~ 2017-02-24 下午,我开始在Linux下写第一个.c程序,在终端打印hello world.gcc 源代码文件之后,输出可执行文件,但是 当我输入文件名执行它的时候,却提示我 无法找到命令.于是我找百度,查资料,花了半个小时,终于找到解决方法了, 输入"./filename"即可.... 2017-02-25 我看<基础学习篇>这本书,在P158页下面的例题讲解中找到了昨天下午异常的解析.我就很是感慨,心想:要是早看这本书,半个