JAVA中运行时异常

合集下载

编译时异常和运行时异常的区别

编译时异常和运行时异常的区别

编译时异常和运⾏时异常的区别最简单的说法:javac出来的异常就是编译时异常,就是说把源代码编译成字节码(class)⽂件时报的异常,⼀般如果⽤Eclispe,你敲完代码保存的时候就是编译的时候。

出来的异常就是运⾏时异常Java异常可分为3种: (1)编译时异常:ng.Exception (2)运⾏期异常:ng.RuntimeException (3)错误:ng.Errorng.Exception和ng.Error继承⾃ng.Throwable;ng.RuntimeException继承⾃ng.Exception.编译时异常:程序正确,但因为外在的环境条件不满⾜引发。

例如:⽤户错误及I/O问题----程序试图打开⼀个并不存在的远程Socket端⼝。

这不是程序本⾝的逻辑错误,⽽很可能是远程机器名字错误(⽤户拼写错误)。

对商⽤软件系统,程序开发者必须考虑并处理这个问题。

Java 编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译。

运⾏期异常:这意味着程序存在bug,如数组越界,0被除,⼊参不满⾜规范.....这类异常需要更改程序来避免,Java编译器强制要求处理这类异常。

错误:⼀般很少见,也很难通过程序解决。

它可能源于程序的bug,但⼀般更可能源于环境问题,如内存耗尽。

错误在程序中⽆须处理,⽽有运⾏环境处理。

顺便说⼀下:编译期和运⾏期的区别编译期和运⾏期进⾏的操作是不相同的,编译器只是进⾏语法的分析,分析出来的错误也只是语法上的错误,⽽运⾏期在真正在分配内存··⽐如说你写⼀个while循环,⼀直往栈⾥写,编译器是不会出错的,可是运⾏期就会出现栈满的错误··。

Java异常处理运行时异常(RuntimeException)详解及实例

Java异常处理运行时异常(RuntimeException)详解及实例

Java异常处理运⾏时异常(RuntimeException)详解及实例Java异常处理运⾏时异常(RuntimeException)详解及实例RuntimeExceptionRunntimeException的⼦类:ClassCastException多态中,可以使⽤Instanceof 判断,进⾏规避ArithmeticException进⾏if判断,如果除数为0,进⾏returnNullPointerException进⾏if判断,是否为nullArrayIndexOutOfBoundsException使⽤数组length属性,避免越界这些异常时可以通过程序员的良好编程习惯进⾏避免的1:遇到运⾏时异常⽆需进⾏处理,直接找到出现问题的代码,进⾏规避。

2:就像⼈上⽕⼀样⽛疼⼀样,找到原因,⾃⾏解决即可3:该种异常编译器不会检查程序员是否处理该异常4:如果是运⾏时异常,那么没有必要在函数上进⾏声明。

案例1:除法运算功能(div(int x,int y))2:if判断如果除数为0,throw new ArithmeticException();3:函数声明throws ArithmeticException4:main⽅法调⽤div,不进⾏处理5:编译通过,运⾏正常6:如果除数为0,报异常,程序停⽌。

7:如果是运⾏时异常,那么没有必要在函数上进⾏声明。

1:Object类中的wait()⽅法,内部throw了2个异常 IllegalMonitorStateException InterruptedException1:只声明了⼀个(throws) IllegalMonitorStateException是运⾏是异常没有声明。

class Demo{public static void main(String[] args){div(2, 1);}public static void div(int x, int y) {if (y == 0) {throw new ArithmeticException();}System.out.println(x / y);}}感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。

java.util.concurrent.brokenbarrierexception异常原理

java.util.concurrent.brokenbarrierexception异常原理

java.util.concurrent.brokenbarrierexception异常原理•Java中的BrokenBarrierException异常是什么?BrokenBarrierException异常是Java中的一种运行时异常,它是在使用Barrier进行多线程编程时可能会抛出的异常之一。

•Barrier是什么?Barrier是Java并发编程中的一种同步机制,它可以用来协调多个线程之间的执行顺序。

Barrier会在所有参与的线程都到达指定点后,才会允许这些线程继续执行下去。

•为什么会抛出BrokenBarrierException异常?BrokenBarrierException异常是在使用java.util.concurrent.CyclicBarrier类的await()方法时可能会抛出的。

这个方法在等待其他线程到达屏障时可能会被中断,从而导致抛出BrokenBarrierException异常。

•如何避免抛出BrokenBarrierException异常?在使用CyclicBarrier的await()方法时,需要考虑异常处理,可以使用try-catch语句捕获BrokenBarrierException异常,并对它进行处理。

•如何处理BrokenBarrierException异常?处理BrokenBarrierException异常的方法可以根据具体情况灵活选择,例如:1.等待其他线程重新到达屏障,然后继续等待或执行下去。

2.抛出自定义的异常或返回特定的值。

3.释放锁或资源。

•总结Java中的BrokenBarrierException异常是与CyclicBarrier类相关的一种异常,需要在使用同步机制时特别注意。

为了避免异常的出现,可以采取合适的异常处理方式,以确保程序的正常运行。

•CyclicBarrier和CountDownLatch有什么区别?CyclicBarrier和CountDownLatch都是Java并发编程中的同步机制,但它们有一些区别:1.CyclicBarrier可以对线程进行分组,每组线程都可以在到达屏障时执行特定的任务;而CountDownLatch只能等待一组线程完成任务后才能执行。

Java常见异常(RuntimeException)详细介绍并总结

Java常见异常(RuntimeException)详细介绍并总结

Java常见异常(RuntimeException)详细介绍并总结本⽂重在Java中异常机制的⼀些概念。

写本⽂的⽬的在于⽅便我很长时间后若是忘了这些东西可以通过这篇⽂章迅速回忆起来。

1. 异常机制1.1 异常机制是指当程序出现错误后,程序如何处理。

具体来说,异常机制提供了程序退出的安全通道。

当出现错误后,程序执⾏的流程发⽣改变,程序的控制权转移到异常处理器。

1.2 传统的处理异常的办法是,函数返回⼀个特殊的结果来表⽰出现异常(通常这个特殊结果是⼤家约定俗称的),调⽤该函数的程序负责检查并分析函数返回的结果。

这样做有如下的弊端:例如函数返回-1代表出现异常,但是如果函数确实要返回-1这个正确的值时就会出现混淆;可读性降低,将程序代码与处理异常的代码混爹在⼀起;由调⽤函数的程序来分析错误,这就要求客户程序员对库函数有很深的了解。

1.3 异常处理的流程1.3.1 遇到错误,⽅法⽴即结束,并不返回⼀个值;同时,抛出⼀个异常对象1.3.2 调⽤该⽅法的程序也不会继续执⾏下去,⽽是搜索⼀个可以处理该异常的异常处理器,并执⾏其中的代码2 异常的分类2.1 异常的分类2.1.1 异常的继承结构:基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception,具体的RuntimeException继承RuntimeException。

2.1.2 Error和RuntimeException及其⼦类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。

2.2 每个类型的异常的特点2.2.1 Error体系 Error类体系描述了Java运⾏系统中的内部错误以及资源耗尽的情形。

应⽤程序不应该抛出这种类型的对象(⼀般是由虚拟机抛出)。

如果出现这种错误,除了尽⼒使程序安全退出外,在其他⽅⾯是⽆能为⼒的。

运行时异常非运行异常和检查异常非检查异常

运行时异常非运行异常和检查异常非检查异常

运⾏时异常⾮运⾏异常和检查异常⾮检查异常可以看出异常的家族势⼒庞⼤,通常我们说的异常是包括exceptio和error。

Exception家族我们恐怕见的不少,但是error家族我们可能就没什么印象了,下⾯我来说说这两个类的区别:Error(错误):是程序⽆法处理的错误,表⽰运⾏应⽤程序中较严重问题。

⼤多数的错误与代码编写者执⾏的操作⽆关,⽽是表⽰代码运⾏时 JVM(Java 虚拟机)出现的问题。

例如,Java虚拟机运⾏错误(Virtual MachineError),当 JVM 不再有继续执⾏操作所需的内存资源时,将出现 OutOfMemoryError。

这些异常发⽣时,Java虚拟机(JVM)⼀般会选择线程终⽌。

这些错误表⽰故障发⽣于虚拟机⾃⾝、或者发⽣在虚拟机试图执⾏应⽤时,如Java虚拟机运⾏错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。

这些错误是不可查的,因为它们在应⽤程序的控制和处理能⼒之外,⽽且绝⼤多数是程序运⾏时不允许出现的状况。

对于设计合理的应⽤程序来说,即使确实发⽣了错误,本质上也不应该试图去处理它所引起的异常状况。

在 Java中,错误通过Error的⼦类描述。

个⼈理解:出现Error错误⼀般不是由于你编写的代码出现问题,⽽是由于JVM运⾏你这段代码出现了问题,⽐如堆溢出,配置⽂件出错等,这些你是⽆法⼈为的在你代码⾥可以保证的,必须要额外的去操作,重新配置虚拟机,修改配置⽂件等等。

Exception(异常):是程序本⾝可以处理的异常。

也就是你常见的空指针异常(NullPointerException),数组超出范围异常(IndexOutOfBoundsException)等等。

通常,Java的异常(包括Exception和Error)分为检查异常(checked exceptions)和⾮检查的异常(unchecked exceptions)。

浅析Java异常处理机制及应用

浅析Java异常处理机制及应用

浅析Java异常处理机制及应用摘要:Java异常处理机制是Java编程语言中最为重要的机制之一,它可以在代码中处理各种类型的异常。

本文将对Java异常处理机制进行浅析,并从应用层面探讨一些常见的Java异常处理方法。

关键词:Java,异常处理,应用正文:一、Java异常处理机制Java异常处理机制是Java编程语言中最为重要的机制之一。

在Java语言中,异常是指一个程序运行时产生的意外情况,可以是代码中的错误,也可以是由于外部环境因素导致的错误。

Java提供了一整套异常处理机制,可以帮助开发者处理各种类型的异常。

在Java中,异常通常被定义为继承自Throwable类的任意一个子类。

常见的异常类型包括RuntimeException、IOException、ClassNotFoundException、ArithmeticException等等。

Java中异常的处理主要分为两种方式:try-catch块和throws语句。

try-catch块是一种捕捉异常的方法,其基本语法结构如下:```try {// 可能会抛出异常的代码块} catch (type1 e1) {// 处理type1类型异常的代码块} catch (type2 e2) {// 处理type2类型异常的代码块} finally {// 不管是否发生异常,都会执行的代码块}```throws语句是一种抛出异常的方法,其基本语法结构如下:```public void methodName() throws ExceptionType {// 可能会抛出异常的代码块}```二、Java异常处理的应用Java异常处理机制应用广泛,以下是应用层面探讨一些常见的Java异常处理方法。

1、基于try-catch块的异常处理try-catch块是Java中最基本的异常处理方法。

它可以在程序运行时捕捉异常,并且根据不同的异常类型采取不同的处理方法。

java常见运行时错误

java常见运行时错误

java常见运⾏时错误java常见运⾏时异常1.算术异常类:ArithmeticExecption2.3.空指针异常类:NullPointerException4.5.类型强制转换异常:ClassCastException6.7.数组负下标异常:NegativeArrayException8.9.数组下标越界异常:ArrayIndexOutOfBoundsException10.11.违背安全原则异常:SecturityException12.13.⽂件已结束异常:EOFException14.15.⽂件未找到异常:FileNotFoundException16.17.字符串转换为数字异常:NumberFormatException18.19.20.操作异常:SQLException21.22.23.输⼊输出异常:IOException24.25.26.⽅法未找到异常:NoSuchMethodException27.28.29.1. .lang.nullpointerexception30. 这个异常⼤家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调⽤了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图⽚,调⽤数组这些操作中,⽐如图⽚未经初始化,或者图⽚创建时的路径错误等等。

对数组操作中出现空指针,很多情况下是⼀些刚开始学习编程的朋友常犯的错误,即把数组的初始化和数组元素的初始化混淆起来了。

数组的初始化是对数组分配需要的空间,⽽初始化后的数组,其中的元素并没有实例化,依然是空的,所以还需要对每个元素都进⾏初始化(如果要调⽤的话)31.32. 2. ng.classnotfoundexception33. 这个异常是很多原本在jb等开发环境中开发的程序员,把 jb下的程序包放在wtk下编译经常出现的问题,异常的解释是"指定的类不存在",这⾥主要考虑⼀下类的名称和路径是否正确即可,如果是在jb下做的程序包,⼀般都是默认加上package的,所以转到wtk 下后要注意把package的路径加上。

Java运行时异常和受检异常区别解析

Java运行时异常和受检异常区别解析

Java运行时异常和受检异常区别解析Java是一种广泛使用的编程语言,具有强大的异常处理机制。

在Java中,异常分为运行时异常和受检异常两种类型。

这两种异常在语法上有所不同,也有不同的处理方式和使用场景。

本文将深入探讨Java运行时异常和受检异常的区别,并分析它们的特点和应用。

1. 异常的概念和分类在编程中,异常是指程序运行过程中可能发生的错误或异常情况。

Java中的异常分为两种类型:运行时异常和受检异常。

运行时异常是指在程序运行过程中可能出现的错误,但不需要在代码中显式地处理。

这些异常通常是由程序员的错误或逻辑问题引起的,如除零错误、空指针引用等。

运行时异常的典型特点是它们是RuntimeException类或其子类的实例。

受检异常是指在程序运行过程中可能出现的错误,但必须在代码中显式地处理。

这些异常通常是由外部因素引起的,如文件读取错误、网络连接问题等。

受检异常的典型特点是它们是Exception类或其子类的实例,但不是RuntimeException类的子类。

2. 运行时异常的特点和使用场景运行时异常具有以下特点:- 运行时异常不需要在代码中显式地处理,可以选择捕获和处理,也可以不处理。

- 运行时异常通常是由程序员的错误或逻辑问题引起的,如数组越界、类型转换错误等。

- 运行时异常的出现通常意味着代码存在缺陷或错误,需要程序员进行修复。

运行时异常的使用场景包括:- 在开发过程中,如果发现代码中存在逻辑错误或潜在的异常情况,可以使用运行时异常来表示并抛出。

- 运行时异常也可以用于简化代码逻辑,使代码更加简洁和易读。

3. 受检异常的特点和使用场景受检异常具有以下特点:- 受检异常必须在代码中显式地处理,要么通过try-catch语句捕获和处理,要么通过throws关键字声明抛出。

- 受检异常通常是由外部因素引起的,如文件读取错误、网络连接问题等。

- 受检异常的出现通常意味着程序需要采取一些措施来处理外部因素的影响,保证程序的正常运行。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

总结了一下JAVA中常见的几种RuntimeException,大约有如下几种:1.NullPointerException -空指针引用异常2.ClassCastException -类型强制转换异常。

3.IllegalArgumentException -传递非法参数异常。

4.ArithmeticException -算术运算异常5.ArrayStoreException -向数组中存放与声明类型不兼容对象异常6.IndexOutOfBoundsException -下标越界异常7.NegativeArraySizeException -创建一个大小为负数的数组错误异常8.NumberFormatException -数字格式异常9.SecurityException -安全异常10.UnsupportedOperationException -不支持的操作异常如下:RuntimeException是开发中最容易遇到的,下面列举一下常见的RuntimeException:1、NullPointerException:见的最多了,其实很简单,一般都是在null对象上调用方法了。

String s=null;booleaneq=s.equals(""); // NullPointerException这里你看的非常明白了,为什么一到程序中就晕呢?public intgetNumber(String str){if(str.equals("A")) return 1;else if(str.equals("B")) return 2;}这个方法就有可能抛出NullPointerException,我建议你主动抛出异常,因为代码一多,你可能又晕了。

public intgetNumber(String str){if(str==null) throw new NullPointerException("参数不能为空");//你是否觉得明白多了if(str.equals("A")) return 1;else if(str.equals("B")) return 2;}2、NumberFormatException:继承IllegalArgumentException,字符串转换为数字时出现。

比如inti= Integer.parseInt("ab3");3、ArrayIndexOutOfBoundsException:数组越界。

比如int[] a=new int[3]; int b=a[3];4、StringIndexOutOfBoundsException:字符串越界。

比如String s="hello"; char c=s.chatAt(6);5、ClassCastException:类型转换错误。

比如Object obj=new Object(); String s=(String)obj;6、UnsupportedOperationException:该操作不被支持。

如果我们希望不支持这个方法,可以抛出这个异常。

既然不支持还要这个干吗?有可能子类中不想支持父类中有的方法,可以直接抛出这个异常。

7、ArithmeticException:算术错误,典型的就是0作为除数的时候。

8、IllegalArgumentException:非法参数,在把字符串转换成数字的时候经常出现的一个异常,我们可以在自己的程序中好好利用这个异常。

我们可创建一个控制器,令其捕获所有类型的违例。

具体的做法是捕获基础类违例类型Exception(也存在其他类型的基础违例,但Exception是适用于几乎所有编程活动的基础)。

如下所示:catch(Exception e) {System.out.println("caught an exception");}这段代码能捕获任何违例,所以在实际使用时最好将其置于控制器列表的末尾,防止跟随在后面的任何特殊违例控制器失效。

对于程序员常用的所有违例类来说,由于Exception类是它们的基础,所以我们不会获得关于违例太多的信息,但可调用来自它的基础类Throwable的方法:String getMessage()获得详细的消息。

String toString()返回对Throwable的一段简要说明,其中包括详细的消息(如果有的话)。

void printStackTrace()void printStackTrace(PrintStream)打印出Throwable和Throwable的调用堆栈路径。

调用堆栈显示出将我们带到违例发生地点的方法调用的顺序。

第一个版本会打印出标准错误,第二个则打印出我们的选择流程。

若在Windows下工作,就不能重定向标准错误。

因此,我们一般愿意使用第二个版本,并将结果送给System.out;这样一来,输出就可重定向到我们希望的任何路径。

除此以外,我们还可从Throwable的基础类Object(所有对象的基础类型)获得另外一些方法。

对于违例控制来说,其中一个可能有用的是getClass(),它的作用是返回一个对象,用它代表这个对象的类。

我们可依次用getName()或toString()查询这个Class类的名字。

亦可对Class对象进行一些复杂的操作,尽管那些操作在违例控制中是不必要的。

本章稍后还会详细讲述Class对象。

下面是一个特殊的例子,它展示了Exception方法的使用(若执行该程序遇到困难,请参考第3章3.1.2小节“赋值”)://: ExceptionMethods.Java// Demonstrating the Exception Methodspackage c09;public class ExceptionMethods {public static void main(String[] args) {try {throw new Exception("Here's my Exception");} catch(Exception e) {System.out.println("Caught Exception");System.out.println("e.getMessage(): " + e.getMessage());System.out.println("e.toString(): " + e.toString());System.out.println("e.printStackTrace():");e.printStackTrace();}}} ///:~该程序输出如下:Caught Exceptione.getMessage(): Here's my Exceptione.toString(): ng.Exception: Here's my Exceptione.printStackTrace():ng.Exception: Here's my Exceptionat ExceptionMethods.main可以看到,该方法连续提供了大量信息——每类信息都是前一类信息的一个子集。

本章的第一个例子是:if(t == null)throw new NullPointerException();看起来似乎在传递进入一个方法的每个句柄中都必须检查null(因为不知道调用者是否已传递了一个有效的句柄),这无疑是相当可怕的。

但幸运的是,我们根本不必这样做——它属于Java进行的标准运行期检查的一部分。

若对一个空句柄发出了调用,Java会自动产生一个NullPointerException违例。

所以上述代码在任何情况下都是多余的。

这个类别里含有一系列违例类型。

它们全部由Java自动生成,毋需我们亲自动手把它们包含到自己的违例规范里。

最方便的是,通过将它们置入单独一个名为RuntimeException的基础类下面,它们全部组合到一起。

这是一个很好的继承例子:它建立了一系列具有某种共通性的类型,都具有某些共通的特征与行为。

此外,我们没必要专门写一个违例规范,指出一个方法可能会“掷”出一个RuntimeException,因为已经假定可能出现那种情况。

由于它们用于指出编程中的错误,所以几乎永远不必专门捕获一个“运行期违例”——RuntimeException——它在默认情况下会自动得到处理。

若必须检查RuntimeException,我们的代码就会变得相当繁复。

在我们自己的包里,可选择“掷”出一部分RuntimeException。

如果不捕获这些违例,又会出现什么情况呢?由于编译器并不强制违例规范捕获它们,所以假如不捕获的话,一个RuntimeException可能过滤掉我们到达main()方法的所有途径。

为体会此时发生的事情,请试试下面这个例子://: NeverCaught.java// Ignoring RuntimeExceptionspublic class NeverCaught {static void f() {throw new RuntimeException("From f()");}static void g() {f();}public static void main(String[] args) {g();}} ///:~大家已经看到,一个RuntimeException(或者从它继承的任何东西)属于一种特殊情况,因为编译器不要求为这些类型指定违例规范。

输出如下:ng.RuntimeException: From f()at NeverCaught.f(NeverCaught.java:9)at NeverCaught.g(NeverCaught.java:12)at NeverCaught.main(NeverCaught.java:15)所以答案就是:假若一个RuntimeException获得到达main()的所有途径,同时不被捕获,那么当程序退出时,会为那个违例调用printStackTrace()。

注意也许能在自己的代码中仅忽略RuntimeException,因为编译器已正确实行了其他所有控制。

因为RuntimeException在此时代表一个编程错误:(1)一个我们不能捕获的错误(例如,由客户程序员接收传递给自己方法的一个空句柄)。

相关文档
最新文档