Java基础之:异常及异常处理

我们将java程序执行过程中出现的不正常现象称为异常,例如:之前遇到的数组下标越界异常,空指针异常等等

执行过程中发生的异常事件分为两类:

Error(错误):Java虚拟机无法解决的严重问题,如:JVM系统内部错误,资源耗尽等严重情况。比如:StackOverFlowError(栈溢出),Error是严重错误,程序会直接崩溃掉。

Exception:其他因为编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问等。Exception分为两大类:运行时异常(在程序运行过程中)、编译时异常(在程序编译过程中)

常见的运行时异常

NullPointerException:空指针异常

public class NullPointerException_ {

private static String str;

public static void main(String[] args) {

// TODO Auto-generated method stub

System.out.println(str.length());

System.out.println("hello~");

}

}

ArithmeticException:数学运算异常

当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例, 例如:int i = 10 / 0

ArrayIndexOutOfBoundsException:数组下标越界异常

public class ArrayIndexOutOfBoundsException_ {

public static void main(String[] args) {

int[] arr = {1,2};

System.out.println(arr[4]);

}

ClassCastException:类型转换异常

当试图将对象强制转换为不是实例的子类时,抛出该异常。例如,以下代码将生成一个 ClassCastException

public class ClassCastException_ {

public static void main(String[] args) {

Animal a = new Dog();

Cat cat = (Cat)a;

}

}

class Animal {

}

class Dog extends Animal {

}

class Cat extends Animal {

}

NumberFormatException:数字格式不正确异常

当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常 => 使用异常我们可以确保输入是满足条件数字.

public class NumberFormatException_ {

public static void main(String[] args) {

String name = "小范~";

int num = Integer.parseInt(name);

}

}

常见的编译时异常

SQLException //操作数据库时,查询表可能发生异常

IOException //操作文件时,发生的异常

FileNotFoundException //当操作一个不存在的文件时,发生异常

ClassNotFoundException //加载类,而该类不存在时,异常

EOFException // 操作文件,到文件末尾,发生异常

IllegalArguementException //参数异常

异常处理

异常处理就是当异常发生时,对异常处理的方式。

两种方式:

try-catch-finally

程序员在代码中捕获异常,并自行处理

throws

将发生的异常抛出给调用方,最顶级的调用方就是JVM

try-catch异常处理

Java提供try和catch块来处理异常。try块用于包含可能出错的代码。catch块用于处理try块中发生的异常。可以根据需要在程序中有任意数量的try...catch块。

基本语法:

try{

//可能出现异常的代码

//将异常生成对应的异常对象,作为参数传递给catch

}catch(异常对象){

//异常处理

}

public class Exception_ {

public static void main(String[] args) {

String a = null;

try {

System.out.println(a.length());

System.out.println(a);

} catch (Exception e) {

// TODO: handle exception

System.out.println(e.getMessage());

}

}

}

注意事项

如果异常发生了,则异常发生那条语句后面的代码不会执行,直接进入catch块

如果异常没有发生,正常执行try块,不会进入catch块

可以使用多个catch块,捕获不同的异常(进行不同的业务处理),要求父类异常在后面,子类异常在前面。例如: RuntimeException在后面,NullPointerException在前面。如果发生异常只会匹配一个catch。

try-catch-finally异常处理

相较于try-catch而言,多了一个finally块,它的作用是:不管有没有出现异常,都一定会执行finally块中的代码。

当然也可以使用try-finally,但这种方法和不处理异常是一样的,最后会让JVM机来处理异常。而JVM机处理异常的方式,就是直接输出异常信息然后终止程序。所以不建议这样使用。

try-catch-finally案例

public class try_catch_finally{

public static void main(String args[]){

int[] a = {1,2,3};

try{

System.out.println(a[4]);

}catch{

System.out.println("数组下标越界异常");

}finally{

System.out.println("finally块执行....");

}

}

}

程序输出:

数组下标越界异常

finally块执行....

练习题

考虑下面程序输出:

package class_exception;

public class Test {

@SuppressWarnings("finally")

public static int method() {

try {

String[] names = new String[3];

if (names[1].equals("john")) {// 空指针异常

System.out.println(names[1]);

} else {

names[3] = "lucy";

}

return 1;

} catch (ArrayIndexOutOfBoundsException e) {

return 2;

} catch (NullPointerException e) {

return 3;

} finally { // 一定要执行

return 4;

}

}

public static void main(String[] args) {

System.out.println(method());

}

}

练习题2

考虑程序输出:

package class_exception;

public class Test {

public static int method() {

int i = 1;

try {

i++; // 2

String[] names = new String[3];

if (names[1].equals("john")) { // 空指针异常

System.out.println(names[1]);

} else {

names[3] = "lucy";

}

return 1;

} catch (ArrayIndexOutOfBoundsException e) {

return 2;

} catch (NullPointerException e) {

return ++i; //提示:不是立即返回 记录 i= i+1 = 3 保存到 temp = 3

} finally {

++i;

System.out.println("i=" + i);

}

}

public static void main(String[] args) {

System.out.println(method());

}

}

应用案例

如果用户输入的不是一个正整数,就提示他反复输入,直到输入一个正整数为止

import java.util.Scanner;

public class ClassWork {

@SuppressWarnings("resource")

public static void main(String[] args) {

Scanner input = new Scanner(System.in);

int age;

System.out.println("输入年龄:");

for(;;) {

try {

age = new Scanner(System.in).nextInt();

break;

} catch (Exception e) {

System.out.println("再次输入年龄(正整数):");

continue;

}

}

System.out.println("END");

}

}

throws异常处理

如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。

在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。

import java.io.FileInputStream;

import java.io.FileNotFoundException;

public class Throws01 {

public static void main(String[] args) throws FileNotFoundException {

// 1. 使用try

// 2. 使用throws

m1();

System.out.println("ok");

}

public static void m1() throws FileNotFoundException {

FileInputStream fis = new FileInputStream("d://aa.txt");// 编译异常

}

}

使用细节:

对于编译异常,程序中必须处理,使用try-catch或throws

对于运行时异常,程序如果没有处理,默认就是throws方式处理,将其抛给最顶层调用方JVM

子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型

在throws 过程中,如果有方法 try-catch , 就相当于处理异常,就可以不必throws

细节3案例:

class Father {

public void m1() throws RuntimeException{

}

}

class Son extends Father{

@Override

public void m1() throws NullPointerException{

}

}

自定义异常

定义类:自定义异常类名(程序员自己写) 继承Exception或RuntimeException

如果继承Exception,属于编译异常

如果继承RuntimeException,属于运行异常(一般来说,继承RuntimeException)

自定义异常应用案例

package class_exception.ClassCustomException;

import java.util.Scanner;

/**

* 当我们接收Person对象年龄时,要求范围在 1 – 130 之间,否则抛出一个自定义异常(要求 继承自定义异常)

*/

public class ClassWork01 {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

Person p = new Person();

System.out.println("请输入年龄:");

for(;;) {

try {

int a = scanner.nextInt();

p.setAge(a);

break;

} catch (Exception e) {

// TODO: handle exception

System.out.println(e.getMessage());

System.out.println("请重新输入年龄:");

continue;

}

}

}

}

class Person{

private int age;

public Person(int age) {

this.age = age;

}

public Person() {

}

//创建方法使用异常

public void setAge(int a) throws AException{

if(!(a>=0 && a<=130)) {

throw new AException("异常 要求范围在 1 – 130 之间");

}

}

}

class AException extends RuntimeException{

/**

* 添加版本号,不用管

*/

private static final long serialVersionUID = 1L;

//使用构造器传入异常信息

public AException(String name){

super(name);

}

}

自定义异常应用案例2

package class_exception.ClassCustomException;

import java.util.Scanner;

/**

* 编写应用程序,接收一个数,要求不能输入负数,进行异常处理。要求使用继承 RuntimeException 来实现,

*/

public class ClassWork02 {

public static void main(String[] args) {

Scanner s = new Scanner(System.in);

System.out.println("输入一个数:");

try {

int a = s.nextInt();

//因为是运行时异常,也可以不使用try处理

if(a<0) {

throw new IntException("不能输入负数");

}

}catch(RuntimeException e){

System.out.println("异常信息:" + e.getMessage());

}

System.out.println("END");

}

}

class IntException extends RuntimeException{

private static final long serialVersionUID = 1L;

public IntException(String name) {

super(name);

}

}

throw 和 throws 的区别

java 数字运算异常_Java基础之:异常及异常处理相关推荐

  1. java 负数异常_java基础之异常

    一.Throw(抛出异常,让调用者处理) Throw(将异常抛给调用者) 在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象.那么,抛出一个异常具体如何操作呢? 1. 创建一个异常 ...

  2. java 抛出异常的作用_Java 基础之异常抛出

    Java 基础之异常抛出 Java,基础,异常抛出 在 Java 里,除了对异常的捕获外,你还可以抛出异常,还可以创造异常.抛出异常的作用就是告诉你的调用者,程序出现了不正常的情况了,得不要期望的结果 ...

  3. java 数据库 异常类型_Java基础 -- 常见异常

    1.常见异常 Exception 类是 Throwable 类的子类.除了Exception类外,Throwable还有一个子类Error . 异常类有两个主要子类:IOException和Runti ...

  4. java 编写异常_Java基础编程之异常处理

    Java异常类是对于程序中可能出现的错误或者异常的一种处理方式.在设计程序的过程中,对于可能出现的异常错误,比如说用户输入错误,设备错误,磁盘满了或者代码错误等等,通常采用异常处理的方式来进行处理可能 ...

  5. java lang runtimeexception什么意思_Java基础之异常

    1.异常结构 Java中异常的父类接口为Throwable,它的两个实现类为Error和Exception.根据Javac对异常的分类可以将异常划分为两类,如下所示: 不可检查异常:Error 和 R ...

  6. java的数据异常_java的各种异常

    展开全部 Java Exception: 1.Error 2.Runtime Exception 运行时异常 3.Exception 4.throw 用户自定义异常 异常类分两大类型:Error类代表 ...

  7. java常见检查异常_java中常见异常总汇,附解释

    Java Exception: 1.Error 2.Runtime Exception 运行时异常 3.Exception 4.throw 用户自定义异常 异常类分两大类型:Error类代表了编译和系 ...

  8. java property异常_Java常见的异常和解决的办法

    Java程序设计中我们经常会遇到异常,遇到异常不要浮躁,找到问题的原因解决是很容易的.我们整理了一些异常和解决的方法供大家参考. 1.java.lang.IllegalStateException: ...

  9. Java中非法参数的异常_Java中的异常

    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常. ...

最新文章

  1. linuex查看繁忙_如何用九条命令在一分钟内检查Linux服务器性能?
  2. gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解
  3. 7、ABPZero系列教程之拼多多卖家工具 修改注册功能
  4. Unity/UE读取OPC UA和OPC DA数据(UE4)
  5. shell写入文件,后面会覆盖前面
  6. 百度只能靠 AI 续命了?
  7. hadoop上传文件报错
  8. PostgreSQL 中如何delete重复数据
  9. mysql慢查询ep_mysql 慢查询分析
  10. Linux---用户与用户组管理
  11. canon l11121e驱动_佳能L11121e驱动
  12. lumion最全电脑配置推荐,lumion选择什么样的电脑看这里
  13. springboot基于微信小程序的校园体育运动场地及器材租凭系统设计与实现毕业设计源码131052
  14. 51单片机 仿真器驱动安装失败
  15. Spark HA高可用部署、基于文件系统单点恢复、基于zookeeper的Standby Master、如何恢复到上一次活着master挂掉之前的状态 03
  16. 中国自主建成世界口径最大的大视场望远镜
  17. 收藏!数学节为你推荐10本数学好书!
  18. AGS的相关项目的问题和解决方案
  19. 十、Java接口——特殊的抽象类
  20. MOTO sbf文件 打包 封包 修改

热门文章

  1. 单例模式——饿汉式和懒汉式
  2. nginx-正则表达式-重定向
  3. 关于未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值的解决方法...
  4. OpenStack搭建glance
  5. Codeforces Round #346 (Div. 2) D. Bicycle Race 叉积
  6. Flutter ValueNotifier 异步通信、ValueListenableBuilder异步更新数据
  7. Base64的编码实现原理攻略
  8. 九、Spring中使用@Value和@PropertySource为属性赋值
  9. 货币市场基金的基本分类
  10. Putty 重新启动 linux sqlserver服务