本篇文章给大家谈谈java错误处理,以及java的错误异常怎么处理对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
1、详细描述java是如何处理异常的?2、北大青鸟java培训:异常处理的Java最佳方法?3、java异常处理存在的意义是什么?4、JAVA语言中,异常处理有哪几种方式?5、java中错误(error)和异常(exception)有什么主要区别?
详细描述java是如何处理异常的?
当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用…)时,JAVA就会用异常对象来描述。
JAVA中用2种方法处理异常:
1.在发生异常的地方直接处理;
2.将异常抛给调用者,让调用者处理。
JAVA异常可分为3种:
(1)检查性异常:java.lang.Exception
(2)运行期异常:java.lang.RuntimeException
(3)错误:java.lang.Error
顶层是java.lang.Throwable类,检查性异常,运行期异常,错误都是这个类的子孙类。
java.lang.Exception和java.lang.Error继承自java.lang.Throwable,而java.lang.RuntimeException继承自java.lang.Exception.
检查性异常——程序正确,但因为外在的环境条件不满足引发。例如:用户错误及I/O问题—-程序试图打开一个并不存在的远程Socket端口。这不是程序本身的逻辑错误,而很可能是远程机器名字错误(用户拼写错误)。对商用软件系统,程序开发者必须考虑并处理这个问题。JAVA编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译。
运行期异常——这意味着程序存在bug,如数组越界,0被除,入参不满足规范…..这类异常需要更改程序来避免,JAVA编译器强制要求处理这类异常。
错误——一般很少见,也很难通过程序解决。它可能源于程序的bug,但一般更可能源于环境问题,如内存耗尽。错误在程序中无须处理,而有运行环境处理。
如何处理异常?
1.try…catch
程序运行产生异常时,将从异常发生点中断程序并向外抛出异常信息。
Java代码
int x = (int)(Math.random()*5);
int y = (int)(Math.random()*10);
int[] z =new int[5];
try
{
System.out.println(“y/x=”+(y/x));
System.out.println(“y=”+y+”z[y]=”+z[y]);
}
catch (ArithmeticException exc1)
{
System.out.println(“算术运算异常:”+exc1.getMessage());
}
catch (ArrayIndexOutOfBoundsException exc2)
{
System.out.println(“数据越界异常:”+exc2.getMessage());
}
说明:ArithmeticException和ArrayIndexOutOfBoundsException都属运行期异常:java.lang.RuntimeException,如果不用try…catch捕获,程序也是可通过编译的,但如果属于检查性异常:java.lang.Exception,必须而且一定要用try…catch…对其进行处理。
2.finally
如果把finally块置try…catch…语句后,finally块一般都会得到执行,它相当于一个万能的保险,即使前面的try块发生异常,而又没有对应异常的catch块,finally块将马上执行。
以下情形,finally块将不会被执行:
(1)finally块中发生了异常;
(2)程序所在线程死亡;
(3)在前面的代码中用了System.exit();
(4)关闭CPU。
3.多个异常的处理规则:
定义多个catch可精确地定位异常。如果为子类的异常定义了特殊的catch块,而父类的异常则放在另外一个catch块中,此时,必须满足以下规则:子类异常的处理块必须在父类异常处理块的前面,否则会发生编译错误。所以,越特殊的异常越在前面处理,越普遍的异常越在后面处理。这类似于制订防火墙的规则次序:较特殊的规则在前,较普通的规则在后。
自己也可以定义并抛出异常,方法是2步:创建异常,抛出异常(首先实例化一个异常对象,然后用thow抛出)合在一起就是—-
thow new IOException(“异常说明信息”)。将创建异常,抛出异常合在一起的好处是:创建异常时,会包含异常创建处的行信息,异常被捕获时可以通过堆栈迹(stack Trace)的形式报告这些信息。如果在同一行代码创建和抛出异常,对于程序的调试将非常有用。
所以,thow new XXX()已经成为一个标准的异常抛出范式。
在定义一个方法时,方法块中调用的方法可能会抛出异常,可用上面的thow new XXX()处理,如果不处理,那么必须在方法定义时,用thows声明这个方法会抛出的异常。
对异常的处理,有一条行之有效的默认规则:向上抛出—–被调用类在运行过程中对遇到的异常一概不作处理,而是直接向上抛出,一直到最上层的调用类,调用类根据应用系统的需求和特定的异常处理规则进行处理,如向控制台输出异常堆栈信息,打印在日志文件中。用一句形象的话来说,就是谁使用,谁(最上层的调用类)处理。
北大青鸟java培训:异常处理的Java最佳方法?
异常处理是Java开发中的一个重要部分。
它是关乎每个应用的一个非功能性需求,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等。
Java提供了几个异常处理特性,以try,catch和finally关键字的形式内建于语言自身之中。
Java编程语言也允许你创建新的异常,并通过使用throw和throws关键字抛出它们。
事实上,在Java编程中,Java的异常处理不单单是知道语法这么简单,它必须遵循标准的JDK库,和几个处理错误和异常的开源代码。
这里北大青鸟将讨论一些关于异常处理的Java最佳实践。
1、为可恢复的错误使用检查型异常,为编程错误使用非检查型错误。
选择检查型还是非检查型异常,对于Java编程人员来说,总是让人感到困惑。
检查型异常保证你对错误条件提供异常处理代码,这是一种从语言到强制你编写健壮的代码的一种方式,但同时会引入大量杂乱的代码并导致其不可读。
当然,如果你有替代品和恢复策略的话,捕捉异常并做些什么看起来似乎也在理。
在Java编程中选择检查型异常还是运行时异常。
2、在finally程序块中关闭或者释放资源这在Java编程中,是一个广为人知的最佳实践,在处理网络和IO类的时候,相当于一个标准。
在finally块中关闭资源,在正常和异常执行的情况下,保证之前和稀缺资源的合理释放,这由finally块保证。
从Java7开始,该语言有了一项更有趣的功能:资源管理自动化或者ARM块能实现这一功能。
尽管如此,我们仍然要记住在finally块中关闭资源,这是对于释放像FileDescriptors这类,应用在socket和文件编程的情况下的有限资源很重要的。
3、在堆栈跟踪中包含引起异常的原因很多时候,当一个由另一个异常导致的异常被抛出的时候,Java库和开放源代码会将一种异常包装成另一种异常。
日志记录和打印根异常就变得非常重要。
Java异常类提供了getCause方法来检索导致异常的原因,这些(原因)可以对异常的根层次的原因提供更多的信息。
该Java实践对在进行调试或排除故障大有帮助。
时刻记住,如果你将一个异常包装成另一种异常时,构造一个新异常要传递源异常。
4、始终提供关于异常的有意义的完整的信息异常信息是最重要的地方,因为这是程序员首先看到的第一个地方,这里你能找到问题产生的根本原因。
这里始终提供精确的真实的信息。
5、避免过度使用检查型异常检查型异常在强制执行方面有一定的优势,但同时它也破坏了代码,通过掩盖业务逻辑使代码可读性降低。
只要你不过度使用检查型异常,你可以最大限度的减少这类情况,这样做的结果是你会得到更清洁的代码。
你同样可以使用Java7的新功能,以移除重复项。
6、将检查型异常转为运行时异常这是在像Spring之类的多数框架中用来限制使用检查型异常的技术之一,大部分出自于JDBC的检查型异常,都被包装进DataAccessException中,而(DataAccessException)异常是一种非检查型异常。
这是Java最佳实践带来的好处,特定的异常限制到特定的模块,像SQLException放到DAO层,将意思明确的运行时异常抛到客户层。
7、记住对性能而言,异常代价高昂需要记住的一件事是异常代价高昂,同时让你的代码运行缓慢。
假如你有方法从ResultSet(结果集)中进行读取,这时常会抛出SQLException异常而不会移到下一元素,这将会比不抛出异常的正常代码执行的慢的多。
因此最大限度的减少不必要的异常捕捉和移动,那里没有什么固定的原因。
不要仅仅是抛出和捕捉异常,如果你能使用boolean变量去表示执行结果,可能会得到更整洁,更高性能的解决方案。
修正错误的根源,避免不必须要的异常捕捉。
java异常处理存在的意义是什么?
Java中异常处理的意义主要有两个方面:
一是为了给用户友好的提示,不至于遇到特殊情况程序终止或者出现一堆报错信息,处理之后就可以自定义一些指导建议提供给用户;
异常处理方法:Java提供特有的语句进行处理异常。
try{
需要被检测的代码。
}
catch(异常类 变量){
处理异常的代码。
}
finally{
一定会执行的语句。
}
throws:声明方法可能要抛出的异常。
throw:手动抛出异常。
异常在子类覆盖中的体现:
①子类覆盖父类时,如果父类方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或该异常的子类。
②父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。
③如果父类或者接口的方法没有抛出异常,那么子类在覆盖方法时,也不可以抛出异常。
④如果子类方法发生了异常。就必须进行try处理,绝对不能抛出。
JAVA语言中,异常处理有哪几种方式?
有两中方式:1.捕获异常,自己处理.
2.throw出去,让别人处理.
举个例子:
public class A{
try{
可能放生异常的语句…
}catch(Exception e){
e.getMessage();//自己处理
}
}
public class A throws Exception{
可能放生异常的语句…
}//throw出去,让别人处理
注意这里用的是throws
如果在方法里面则用throw
举例:
public class A{
try{
可能放生异常的语句…
}catch(Exception e){
e.getMessage();//自己处理
throw new Exception (“”);
}
}
java中错误(error)和异常(exception)有什么主要区别?
Error(错误)表示系统级的错误和程序不必处理的异常,一般是指与虚拟机相关的问题,是java运行环境中的内部错误或者硬件问题。比如:内存资源不足等。对于这种错误,程序基本无能为力,除了退出运行外别无选择,它是由Java虚拟机抛出的。\x0d\x0a\x0d\x0aException(违例)表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。\x0d\x0aException又分为运行时异常,受检查异常。\x0d\x0a运行时异常,表示无法让程序恢复的异常,导致的原因通常是因为执行了错误的操作,建议终止程序,因此,编译器不检查这些异常。\x0d\x0a受检查异常,是表示程序可以处理的异常,也即表示程序可以修复(由程序自己接受异常并且做出处理),所以称之为受检查异常。
java错误处理的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java的错误异常怎么处理、java错误处理的信息别忘了在本站进行查找喔。