`

java异常中Runtime点滴学习

阅读更多

特别关注一下 RuntimeException

 

检查性异常 checked
 java.io.FileInputStream类的read()方法抛出IoException,方法无法履行它的职责
非检查型异常non-checked  运行时异常runtimeException
类的误用 String.chartAt StringIndexOutBoundsException
SUN公司并不打算强制客户程序员每次调用charAt(int index)时都检查index参数的合法性。

 


上面刚刚讨论了一下 Error 类型的异常处理情况, Java 程序员一般无须关注它(处理这种异常)。另外,其实在 Exception 类型的异常对象中,也存在一种比较特别的“异常”类型,那就是 RuntimeException ,虽然它是直接从 Exception 派生而来,但是 Java 编译器( javac )对 RuntimeException 却是特殊待遇,而且是照顾有加。不信,看看下面的两个示例吧!代码如下:
// 示例程序 1
// 它不能编译通过,我们可以理解

 

import java.io.*;

public class Trans {
        public static void main(String[] args) {
                test();
        }

        static void test() {
                // 注意这条语句
                throw new Exception(" 故意抛出一个 Exception");
        }
} 

 // 示例程序 2
// 可它却为什么能够编译通过呢?

import java.io.*;

public class Trans {
        public static void main(String[] args) {
                test();
        }

        static void test() {
                // 注意这条语句
                throw new RuntimeException(" 故意抛出一个 RuntimeException");
        }
} 

 对上面两个相当类似的程序, javac 编译时却遭遇了两种截然不同的处理,按理说,第 2 个示例程序也应该像第 1 个示例程序那样,编译时报错!但是 javac 编译它时,却例外地让它通过它,而且在运行时, java 虚拟机也捕获到了这个异常,并且会在 console 打印出详细的异常信息。运行结果如下:
java.lang.RuntimeException: 故意抛出一个 RuntimeException
at Trans.test(Trans.java:13)
at Trans.main(Trans.java:8)
Exception in thread "main"
为什么对于 RuntimeException 类型的异常(以及从它派生而出的异常类型), javac 和 java 虚拟机都特殊处理呢?要知道,这可是与“ Java 异常处理模型更严谨和更安全”的设计原则相抵触的呀!究竟是为何呢?这简直让人不法理解呀!
只不过, Java 语言中, RuntimeException 被统一纳入到了 Java 语言和 JDK 的规范之中。请看如下代码,来验证一下我们的理解!

import java.io.*; 
public class Trans 
{ 
public static void main(String[] args) 
{ 
test(); 
} 
static void test() 
{ 
int i = 4; 
int j = 0; 
// 运行时,这里将触发了一个 ArithmeticException 
// ArithmeticException 从 RuntimeException 派生而来 
System.out.println("i / j = " + i / j); 
} 
} 

 运行结果如下:
java.lang.ArithmeticException: / by zero
at Trans.test(Trans.java:16)
at Trans.main(Trans.java:8)
Exception in thread "main"
又如下面的例子,也会产生一个 RuntimeException ,代码如下:

import java.io.*; 
public class Trans 
{ 
public static void main(String[] args) 
{ 
test(); 
} 
static void test() 
{ 
String str = null; 
// 运行时,这里将触发了一个 NullPointerException 
// NullPointerException 从 RuntimeException 派生而来 
str.compareTo("abc"); 
} 
} 

 所以,针对 RuntimeException 类型的异常, javac 是无法通过编译时的静态语法检测来判断到底哪些函数(或哪些区域的代码)可能抛出这类异常(这完全取决于运行时状态,或者说运行态所决定的)理解为non_checked可以?,也正因为如此, Java 异常处理模型中的“ must be caught or declared to be thrown ”规则也不适用于 RuntimeException (所以才有前面所提到过的奇怪编译现象,这也属于特殊规则吧)。但是, Java 虚拟机却需要有效地捕获并处理此类异常。当然, RuntimeException 也可以被程序员显式地抛出,而且为了程序的可靠性,对一些可能出现“运行时异常( RuntimeException )”的代码区域,程序员最好能够及时地处理这些意外的异常,也即通过 catch(RuntimeExcetion) 或 catch(Exception) 来捕获它们。如下面的示例程序,代码如下:

import java.io.*; 
public class Trans 
{ 
public static void main(String[] args) 
{ 
try 
{ 
test(); 
} 
// 在上层的调用函数中,最好捕获所有的 Exception 异常! 
catch(Exception e) 
{ 
System.out.println("go here!"); 
e.printStackTrace(); 
} 
} 
// 这里最好显式地声明一下,表明该函数可能抛出 RuntimeException 
static void test() throws RuntimeException 
{ 
String str = null; 
// 运行时,这里将触发了一个 NullPointerException 
// NullPointerException 从 RuntimeException 派生而来 
str.compareTo("abc"); 
} 
} 

 

分享到:
评论
2 楼 qichunren 2008-05-27  
总结得不错.
1 楼 beyondsanli 2008-05-19  
自定义异常小例子,(注意下toString同System.out之间的关系)
public class MyException1 extends Exception{
	int num;
	MyException1(int a)
	{
		num=a;
		
	}
  [color=red] public String toString()
   {
	   return num+"<10!值必须大于10";
   }[/color]}


public class MyException2 extends Exception{
	int num;
	
	MyException2(int a)
	{
		num=a;
	}
	public String toString()
	{
		return num+">100值必须小于100";
	}
}



public class MyExceptionTest {

	/**
	 * @param args
	 */
	
	static void makeException(int a)throws MyException1,MyException2
	{
		if(a<10)
			throw new MyException1(a);
		 if(a>100)
	            throw new MyException2(a);
	        System.out.println("No Exception");

	}
	public static void main(String[] args) {
		// TODO 自动生成方法存根
            int a;
            try
            {
            	//makeException(6);
            	makeException(600);
            }
            catch (MyException1 e)
            {
               [color=red] System.out.println(""+e);[/color]            }
            catch(MyException2 e)
            {
                System.out.println(""+e);
            }

	}

}



相关推荐

    Java SE程序 Runtime类

    Java SE程序 Runtime类Java SE程序 Runtime类Java SE程序 Runtime类Java SE程序 Runtime类Java SE程序 Runtime类Java SE程序 Runtime类Java SE程序 Runtime类Java SE程序 Runtime类Java SE程序 Runtime类Java SE程序...

    Java Runtime Environment JRE 1.4.2

    Java Runtime Environment (JRE) 1.4.2 是Java应用程序执行所需的关键组件,它为开发者和用户提供了在各种操作系统上运行Java应用的基础。这个版本是Sun Microsystems在2004年发布的一个重要里程碑,它在Java技术的...

    Java Runtime Environment 1.6.0.7 (32-bit

    Java Runtime Environment(JRE)是Java程序运行所需的基础组件,由Oracle公司提供。1.6.0.7 版本是针对32位操作系统的一个特定发行版,这意味着它设计用于在32位Windows系统上执行Java应用程序。在这个版本中,Java...

    ArcGIS Runtime SDK for Java 100.12.0

    ArcGIS Runtime SDK for Java 100.12.0 的...如需在生产环境中使用ArcGIS Runtime SDK for Java,请联系ESRI公司获得授权,现在也有国产替代产品GeoScne Runtime SDK for Java,可以联系易智瑞公司获得相关资源和授权。

    Java Runtime Environment1.8.0

    Java Runtime Environment 1.8.0是Java开发和运行应用程序必不可少的一部分,它是Oracle公司发布的Java平台标准版(Java SE)的实现。这个版本是32位的,这意味着它设计用于在32位操作系统上运行,比如Windows XP、...

    32位的Java Runtime Environment

    总结来说,32位的Java Runtime Environment在32位操作系统中起着至关重要的作用,为运行Java应用程序提供必要环境。随着技术的发展,尽管64位环境逐渐成为主流,但32位JRE仍然在特定场景下保持着其价值。理解和掌握...

    64位 java runtime 1.8.0.zip

    Java Runtime Environment(JRE)是Java程序运行所需的基础组件,它是Oracle公司提供的Java平台标准版(Java SE)的一部分。在本例中,我们讨论的是64位版本的JRE 1.8.0,适用于Windows操作系统。这个版本的JRE包含...

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

    异常机制在Java中提供了一种优雅的方式来处理程序中的错误。当发生异常时,程序的控制流会从发生异常的地方跳转到相应的异常处理器。这样可以避免程序在错误状态下继续执行,确保程序的稳定性和安全性。异常处理...

    Java Runtime Environment-6.0

    Java Runtime Environment-6.0.26.exe

    java runtime environment 1.8.0_45 64bit

    - Java 8引入的这两项特性极大地简化了代码,使得函数式编程在Java中变得更加容易。 总结来说,Java Runtime Environment 1.8.0_45 64bit是Java 8的一个关键组成部分,提供了在64位系统上运行Java应用程序的能力。...

    java异常处理ppt

    Java中的异常以对象的形式存在,这些对象通常是特定异常类的实例。异常分为两种类型:**检查型异常(Checked Exception)**和**运行时异常(Runtime Exception)**。检查型异常在编译时就需要被处理,而运行时异常则...

    java runtime environment 1.8.0_45 64bit.rar

    Java Runtime Environment(JRE)是Java程序运行所需的基础组件,它是Oracle公司提供的Java平台标准版(Java SE)的一部分。在本例中,我们讨论的是版本1.8.0_45,这是一个64位的版本,专为64位操作系统设计。这个...

    Java运行环境 Java SE Runtime Environment 8.0.172.x64官方多语言正式版

    Java SE Runtime Environment(运行时环境)包含了运行以 Java 编程语言编写的程序所必需的 Java 虚拟机、运行时类库和 Java 应用程序启动器。 Java 平台的安全性 一个由角色提供的安全信息的描述。适用于开发人员...

    onnxruntime-1.5.2.jar

    onnx的java包,pom引入后可以试验java调用onnx文件进行cpu模型推理。 具体见https://github.com/microsoft/onnxruntime/blob/master/java/src/test/java/sample/ScoreMNIST.java 和 ...

    Java Runtime For MacOS X 10.7

    Java Runtime For MacOS X 10.7

    Java运行环境 Java SE Runtime Environment 8.0.172.x86官方多语言正式版

    Java SE Runtime Environment(运行时环境)包含了运行以 Java 编程语言编写的程序所必需的 Java 虚拟机、运行时类库和 Java 应用程序启动器。 Java 平台的安全性 一个由角色提供的安全信息的描述。适用于开发人员...

    java runtime 最新版 1.8.0.271

    Java Runtime Environment(JRE)是运行Java应用程序所必需的基础组件,它包含了Java虚拟机(JVM)、类库以及其他支持Java程序运行的组件。最新版"1.8.0.271"是Oracle公司发布的Java SE 8的一个更新版本,主要用于...

    onnxruntime-1.10.0-1.5.7-API文档-中英对照版.zip

    标签:bytedeco、onnxruntime、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,...

    Sun Java SE Runtime Environment(JRE)6

    Sun Java SE Runtime Environment (JRE) 6 是Java平台标准版的一个重要版本,它为运行基于Java技术的应用程序提供了所需的运行环境。Java SE是Java Development Kit (JDK)的一部分,但JRE则不包含开发工具,主要是...

    java异常处理

    异常处理机制在Java中被设计为一种结构化的方法,使得程序在遇到不可预见的问题时,能够中断当前的操作,转而执行特定的错误处理代码,而不是简单地崩溃。 1. 异常处理名词解释: - 异常(Exception):在Java中,...

Global site tag (gtag.js) - Google Analytics