一、异常

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、包与包之间的访问权限

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

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

    Java中的异常处理 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. Java中所有异常的基类Throwable:Throwable又分为Error类和Excepti ...

  2. 【转】零基础学习Fiddler抓包改包

    看到一篇讲关于Fiddler抓包工具的讲解,个人感觉写得很仔细,但是作者说禁止转载,那就放个链接Mark一下 http://tmq.qq.com/2016/12/fiddler_packet_capt ...

  3. python基础学习1 -异常捕获

    #!/usr/bin/env python # -*- coding:utf-8 -*- #-------try-except try: file_name = input("请输入需要打开 ...

  4. [腾讯 TMQ] 零基础学习 Fiddler 抓包改包

    本文转载于https://testerhome.com/topics/7159 一.Fiddler1.1.简介Fiddler是一款HTTP协议调试代理工具,它能够抓取记录本机所有HTTP(S)请求,通 ...

  5. java基础学习日志--异常案例

    package test7; public class InvalidScroreException extends Exception { public InvalidScroreException ...

  6. python基础学习Day10 函数形参的动态参数、*args **kwargs 命名空间 global 与 nonlocal

    一.函数形参的动态参数 原因:为了拓展,对于实参数量不固定,故需要万能参数,即动态参数, *args   **kwargs # def sum1(*args): # 在函数定义时,在*位置参数,聚合. ...

  7. Python入门基础学习(模块,包)

    Python基础学习笔记(五) 模块的概念:模块是python程序架构的一个核心概念 每个以拓展名py结尾的python源代码文件都是一个模块 模块名同样也是一个标识符,需要符合标识符的命名规则 在模 ...

  8. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  9. Yaf零基础学习总结4-Yaf的配置文件

    在上一节的hello yaf当中我们已经接触过了yaf的配置文件了, Yaf和用户共用一个配置空间, 也就是在Yaf_Application初始化时刻给出的配置文件中的配置. 作为区别, Yaf的配置 ...

  10. Node.js系列基础学习-----回调函数,异步

    Node.js基础学习 Node.js回调函数 Node.js异步编程的直接体现就是回调,异步编程依托回调来实现,但不是异步.回调函数在完成任务后就会被调用,Node有很多的回调函数,其所有的API都 ...

随机推荐

  1. Metatable和Metamethod

    Metatable和Metamethod是用来干啥的?它们可以使得表a和b的表达式“a + b”变得有意义,其中metatable使两个不相关的表a和b之间可以进行操作,而操作的具体行为比如说&quo ...

  2. 基于tiny4412的Linux内核移植 --- aliases节点解析

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  3. 哀悼我的第一次"创业"经历

    下周考完最后一科,大学四年时光基本上算是落下帷幕,剩下的就只是整整毕业设计了.如果按照正常的节奏,这个学期应该能够搞完毕业设计的2/3,但无奈还在广州的一家公司里面实习,没有多少时间弄,得拖到3月了. ...

  4. C++中指针常量和常量指针的区别

    在C++学习使用过程中,每个人都不可避免地使用指针,而且都或多或少的接触过常量指针或指针常量,但是对这两个的概念还是很容易搞糊涂的. 本文即是简单描述指针常量和常量指针的区别. 常量指针 定义: 又叫 ...

  5. Web前端面试题集锦

    前端开发面试知识点大纲: 注意 转载须保留原文链接(http://www.cnblogs.com/wzhiq896/p/5927180.html )作者:wangwen896 HTML&CSS ...

  6. ok6410 android driver(5)

    Test the android driver by JNI (Java Native Interface), In the third article, we know how to compile ...

  7. 【iOS】线程安全的文件读写

    前段时间看了一遍GCD(Grand Central Dispatch)多线程,GCD是苹果为多核开发提供的解决方案 多线程最常见的问题就是读写,比如数据库读写,文件读写,读取是共享的,写是互斥,允许多 ...

  8. Google判断广告点击作弊的几种方式和数据

     Google判断广告点击作弊的几种方式和数据. 作弊广告点击的CTR数据太高网上有研究说如果CTR值大于了10%的站被干掉的可能性很高,他们会被单独拿出来分析.一般来说低于6-7%的CTR是安全红线 ...

  9. Winform中的窗体一些常用属性

    Winform窗体的常用窗体属性 1)窗体全屏显示 this.DesktopBounds = Screen.GetWorkingArea(this);  //全屏显示桌面 注:可以放在初始化方法中,也 ...

  10. Ahjesus Nodejs02 使用集成开发环境

    下载最新版webstorm, 选择此集成开发环境是因为支持性较好,在vs下也有插件支持,不过感觉有些牵强 附vs插件 NTVS 详细介绍 安装好以后就需要配置npm NPM 国内高速镜像 source ...