JAVA中运行时异常

JAVA中运行时异常
JAVA中运行时异常

总结了一下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 Methods

package 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 Exception

e.getMessage(): Here's my Exception

e.toString(): https://www.360docs.net/doc/64442152.html,ng.Exception: Here's my Exception

e.printStackTrace():

https://www.360docs.net/doc/64442152.html,ng.Exception: Here's my Exception

at ExceptionMethods.main

可以看到,该方法连续提供了大量信息——每类信息都是前一类信息的一个子集。

本章的第一个例子是:

if(t == null)

throw new NullPointerException();

看起来似乎在传递进入一个方法的每个句柄中都必须检查null(因为不知道调用者是否已传递了一个有效的句柄),这无疑是相当可怕的。但幸运的是,我们根本不必这样做——它属于Java进行的标准运行期检查的一部分。若对一个空句柄发出了调用,Java会自动产生一个NullPointerException违例。所以上述代码在任何情况下都是多余的。

这个类别里含有一系列违例类型。它们全部由Java自动生成,毋需我们亲自动手把它们包含到自己的违例规范里。最方便的是,通过将它们置入单独一个名为RuntimeException 的基础类下面,它们全部组合到一起。这是一个很好的继承例子:它建立了一系列具有某种共通性的类型,都具有某些共通的特征与行为。此外,我们没必要专门写一个违例规范,指出一个方法可能会“掷”出一个RuntimeException,因为已经假定可能出现那种情况。由于它们用于指出编程中的错误,所以几乎永远不必专门捕获一个“运行期违例”——RuntimeException——它在默认情况下会自动得到处理。若必须检查RuntimeException,我们的代码就会变得相当繁复。在我们自己的包里,可选择“掷”出一部分RuntimeException。

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

//: NeverCaught.java

// Ignoring RuntimeExceptions

public class NeverCaught {

static void f() {

throw new RuntimeException("From f()");

}

static void g() {

f();

}

public static void main(String[] args) {

g();

}

} ///:~

大家已经看到,一个RuntimeException(或者从它继承的任何东西)属于一种特殊情况,因为编译器不要求为这些类型指定违例规范。

输出如下:

https://www.360docs.net/doc/64442152.html,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) 一个我们不能捕获的错误(例如,由客户程序员接收传递给自己方法的一个空句柄)。

(2)作为一名程序员,一个应在自己的代码中检查的错误(如ArrayIndexOutOfBoundException,此时应注意数组的大小)。

可以看出,最好的做法是在这种情况下违例,因为它们有助于程序的调试。

另外一个有趣的地方是,我们不可将Java违例划分为单一用途的工具。的确,它们设计用于控制那些讨厌的运行期错误——由代码控制范围之外的其他力量产生。但是,它也特别有助于调试某些特殊类型的编程错误,那些是编译器侦测不到的。

覆盖一个方法时,只能产生已在方法的基础类版本中定义的违例。这是一个重要的限制,因为它意味着与基础类协同工作的代码也会自动应用于从基础类衍生的任何对象(当然,这属于基本的OOP概念),其中包括违例。

下面这个例子演示了强加在违例身上的限制类型(在编译期):

//: StormyInning.Java

// Overridden methods may throw only the

// exceptions specified in their base-class

// versions, or exceptions derived from the

// base-class exceptions.

class BaseballException extends Exception {}

class Foul extends BaseballException {}

class Strike extends BaseballException {}

abstract class Inning {

Inning() throws BaseballException {}

void event () throws BaseballException {

// Doesn't actually have to throw anything

}

abstract void atBat() throws Strike, Foul;

void walk() {} // Throws nothing

}

class StormException extends Exception {}

class RainedOut extends StormException {}

class PopFoul extends Foul {}

interface Storm {

void event() throws RainedOut;

void rainHard() throws RainedOut;

}

public class StormyInning extends Inning

implements Storm {

// OK to add new exceptions for constrUCtors,

// but you must deal with the base constructor

// exceptions:

StormyInning() throws RainedOut,

BaseballException {}

StormyInning(String s) throws Foul,

BaseballException {}

// Regular methods must conform to base class:

//! void walk() throws PopFoul {} //Compile error

// Interface CANNOT add exceptions to existing

// methods from the base class:

//! public void event() throws RainedOut {}

// If the method doesn't already exist in the

// base class, the exception is OK:

public void rainHard() throws RainedOut {}

// You can choose to not throw any exceptions,

// even if base version does:

public void event() {}

// Overridden methods can throw

// inherited exceptions:

void atBat() throws PopFoul {}

public static void main(String[] args) {

try {

StormyInningsi = new StormyInning();

si.atBat();

} catch(PopFoul e) {

} catch(RainedOut e) {

} catch(BaseballException e) {}

// Strike not thrown in derived version.

try {

// What happens if you upcast?

Inning i = new StormyInning();

i.atBat();

// You must catch the exceptions from the

// base-class version of the method:

} catch(Strike e) {

} catch(Foul e) {

} catch(RainedOut e) {

} catch(BaseballException e) {}

}

} ///:~

在Inning中,可以看到无论构建器还是event()方法都指出自己会“掷”出一个违例,但它们实际上没有那样做。这是合法的,因为它允许我们强迫用户捕获可能在覆盖过的event()版本里添加的任何违例。同样的道理也适用于abstract方法,就象在atBat()里展示的那样。

“interface Storm”非常有趣,因为它包含了在Incoming中定义的一个方法——event(),

以及不是在其中定义的一个方法。这两个方法都会“掷”出一个新的违例类型:RainedOut。当执行到“StormyInning extends”和“implements Storm”的时候,可以看到Storm中的event()方法不能改变Inning中的event()的违例接口。同样地,这种设计是十分合理的;否则的话,当我们操作基础类时,便根本无法知道自己捕获的是否正确的东西。当然,假如interface 中定义的一个方法不在基础类里,比如rainHard(),它产生违例时就没什么问题。

对违例的限制并不适用于构建器。在StormyInning中,我们可看到一个构建器能够“掷”出它希望的任何东西,无论基础类构建器“掷”出什么。然而,由于必须坚持按某种方式调用基础类构建器(在这里,会自动调用默认构建器),所以衍生类构建器必须在自己的违例规范中声明所有基础类构建器违例。

StormyInning.walk()不会编译的原因是它“掷”出了一个违例,而Inning.walk()却不会“掷”出。若允许这种情况发生,就可让自己的代码调用Inning.walk(),而且它不必控制任何违例。但在以后替换从Inning衍生的一个类的对象时,违例就会“掷”出,造成代码执行的中断。通过强迫衍生类方法遵守基础类方法的违例规范,对象的替换可保持连贯性。

覆盖过的event()方法向我们显示出一个方法的衍生类版本可以不产生任何违例——即便基础类版本要产生违例。同样地,这样做是必要的,因为它不会中断那些已假定基础类版本会产生违例的代码。差不多的道理亦适用于atBat(),它会“掷”出PopFoul——从Foul衍生出来的一个违例,而Foul违例是由atBat()的基础类版本产生的。这样一来,假如有人在自己的代码里操作Inning,同时调用了atBat(),就必须捕获Foul违例。由于PopFoul是从Foul 衍生的,所以违例控制器(模块)也会捕获PopFoul。

最后一个有趣的地方在main()内部。在这个地方,假如我们明确操作一个StormyInning 对象,编译器就会强迫我们只捕获特定于那个类的违例。但假如我们上溯造型到基础类型,编译器就会强迫我们捕获针对基础类的违例。通过所有这些限制,违例控制代码的“健壮”程度获得了大幅度改善(注释③)。

③:ANSI/ISO C++施加了类似的限制,要求衍生方法违例与基础类方法掷出的违例相同,或者从后者衍生。在这种情况下,C++实际上能够在编译期间检查违例规范。

我们必须认识到这一点:尽管违例规范是由编译器在继承期间强行遵守的,但违例规范并不属于方法类型的一部分,后者仅包括了方法名以及自变量类型。因此,我们不可在违例规范的基础上覆盖方法。除此以外,尽管违例规范存在于一个方法的基础类版本中,但并不表示它必须在方法的衍生类版本中存在。这与方法的“继承”颇有不同(进行继承时,基础类中的方法也必须在衍生类中存在)。换言之,用于一个特定方法的“违例规范接口”可能在继承和覆盖时变得更“窄”,但它不会变得更“宽”——这与继承时的类接口规则是正好相反的。

Java语言提供两种异常处理机制

得到一个异常对象是,它将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码。找到能够处理这种类型异常的方法后,运行时系统把当前异常交给这个方法处理;如果找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。捕获异常是通过try-catch-finally语句实现的。语法为:try{ ... }catch(ExceptionName1 e){ ... }catch(ExceptionName2 e){ ... } ... }finally{ ... } 2)声明抛弃异常:当Java 程序运行时系统得到一个异常对象时,如果一个方法并不知道如何处理所出现的异常,则可在方法声明时,声明抛弃异常。声明抛弃异常是在一个方法声明中的throws子句中指明的。如:public int read() throws IOException{ ... } 其中throws IOException就是声明抛弃异常,throws后可以跟多个异常类型。 1. https://www.360docs.net/doc/64442152.html,ng.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等。对数组操作中出现空指针,很多情况下是一些刚开始学习编程的朋友常犯的错误,即把数组的初始化和数组元素的初始化混淆起来了。数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,所以还需要对每个元素都进行初始化(如果要调用的话) 2. https://www.360docs.net/doc/64442152.html,ng.classnotfoundexception 这个异常是很多原本在jb等开发环境中开发的程序员,把jb下的程序包放在wtk下编译经常出现的问题,异常的解释是"指定的类不存在",这里主要考虑一下类的名称和路径是否正确即可,如果是在jb下做的程序包,一般都是默认加上package的,所以转到wtk下后要注意把package的路径加上。 3. https://www.360docs.net/doc/64442152.html,ng.arithmeticexception 这个异常的 好好检查一下自己程序中涉及到数学运算的地方,公式是不是有不妥了。 4. 是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了,还有一种情况,是程序中定义的数组的长度是通过某些特定方法决定的,不是事先声明的,这个时候,最好先查看一下数组的length,以免出现这个异常。 5. https://www.360docs.net/doc/64442152.html,ng.illegalargumentexception 这个异常的解释是"方法的参数错误",很多j2me的类库中的方法在一些情况下都会引发这样的错误,比如音量调节方法中的音量参数如果写成负数就会出现这个异常,再比如g.setcolor(int red,int green,int blue)这个方法中的三个值,如果有超过255的也会出现这个异常,因此一旦发现这个异常,我们要做的,就是赶紧去检查一下方法调用中的参数传递是不是出现了错误。 6. https://www.360docs.net/doc/64442152.html,ng.illegalaccessexception 这个异常的解释是"没有访问权限",当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常。对程序中用了package的情况下要注意这个异常。其他还有很多异常,我就不一一列举了,我要说明的是,一个合格的程序员,需要对程序中常见的问题有相当的了解和相应的解决办法,否则仅仅停留在写程序而不会改程序的话,会极大影响到自己的开发的。关于异常的全部说明,在api里都可以查阅。算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeArrayException 数组下标越界异常:ArrayIndexOutOfBoundsException 违背安全原则异常:SecturityException 文件已结束异常:EOFException 文件未找到异常:FileNotFoundException 字符串转换为数字异常:NumberFormatException 操作数据库异常:SQLException 输入输出异常:IOException 方法未找到异常:NoSuchMethodException https://www.360docs.net/doc/64442152.html,ng.AbstractMethodError 抽象方法错误。当应用试图调用抽象方法时抛出。https://www.360docs.net/doc/64442152.html,ng.AssertionError 断言错。用来指示一个断言失败的情况。https://www.360docs.net/doc/64442152.html,ng.ClassCircularityError 类循环依赖错误。在初始化一个类时, 个文件中读取Java类,而检测到该文件的内容不符合类的有效格式时抛出。https://www.360docs.net/doc/64442152.html,ng.Error 错误。是所有错误的基类,用于标识严重的程序运行问题。这些问题通常描述一些不应被应用程序捕获的反常情况。https://www.360docs.net/doc/64442152.html,ng.ExceptionInInitializerError 初始化程序错误。当执行一个类的静态初始化程序的过程中,发生了异

Java中常见错误和异常解决方法(打印)

https://www.360docs.net/doc/64442152.html,ng.NullPointerException 原因是:有空指针,有地址没赋值 2.Exception in thread "main" https://www.360docs.net/doc/64442152.html,ng.ArithmeticException: / by zero 原因是除数是0 3.ArrayIndexOutOfBoundsException 原因是:数组越界 https://www.360docs.net/doc/64442152.html,ng.NumberFormatException 原因是:数字格式化有问题 5.Unhandled exception type Exception 原因是:没有进行异常处理 6.进行国际化操作的时候遇到这样的错误:Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name Message, locale zh_CN 答:因为在命令提示符中,是没有错误的 解决方法是:在myeclipse中,会出现这个错误 java国际化之Can't find bundle for base name 1.初步学习 最近在学习ResourseBundle时遇到了“Can't find bundle for base name ”这个错误搞了很 久才解决了。原因就是类路径问题要将属性文件放在类路径中!百度里很多都是教程但没有涉及到解决方法!2.中文显示: 测试文件 java 代码 package com.lht.ResourseBundleStudy; import java.util.ResourceBundle; public class ResourseBundleDemo { public static void main(String[] args) { ResourceBundle resource = ResourceBundle.getBundle("test"); System.out.print(resource.getString("msg0") + "!"); System.out.println(resource.getString("msg1") + "!"); } } test.properties msg0="Hello World" msg1="da jia hao" 开始自己测试的时候:将属性文件放在bin/下也试过也不行无赖中就在google中搜索了一 下终于在sun的java论坛

java异常处理例题代码

App9_1.java:输出一个数组的所有元素,捕获数组下标越界异常和除娄为0异常。public class App9_1{ public static void main(String args[]){ int i; int[] a={1,2,3,4}; for(i=0;i<5;i++) System.out.println(" a["+i+"]="+a[i]); System.out.println("5/0"+(5/0)); } } App9_2.java:使用try-catch-finall语句对程序中的异常进行捕获与处理。 public class App9_2{ public static void main(String args[]){ int i; int a[]={1,2,3,4}; for (i=0;i<5;i++){ try{ System.out.print("a["+i+"]/"+i+"="+(a[i]/i)); } catch(ArrayIndexOutOfBoundsException e){ System.out.print("捕获到了数组下标越界异常"); } catch(ArithmeticException e){ System.out.print("异常类名称是:"+e); //显示异常信息 } catch(Exception e){ System.out.println("捕获"+e.getMessage()+"异常!"); //显示异常信息 } finally{ System.out.println(" finally i="+i); } } System.out.println("继续!!"); } } App9_3.java:使用throw语句在方法中抛出异常。 public class App9_3{ public static void main(String args[]){ int a=5,b=0; try{ if (b==0) throw new ArithmeticException(); //抛出异常,不是必须的 else System.out.println(a+"/"+b+"="+a/b); //若不抛出异常,则运行此行

Java常见异常和错误

Java常见异常和错误 1、在某一路径下执行编译好的class文件出错。 异常如下: E:\liwy>java Test98 Exception in thread "main" https://www.360docs.net/doc/64442152.html,ng.NoClassDefFoundError: Test98 如果出现了以上错误提示,常见问题有如下两种:1 大小写写错了,2 路径不正确。 2、数组错误,访问不存在的数组,数组超出绑定,代码如下: public class ArrayDemo { public static void main(String args[]){ int array[] = null; //声明数组 array = new int[3]; //为数组开辟空间,大小为3 for(int i=0;i

java异常处理试题及答案

异常处理练习题 一、选择题 1.java中用来抛出异常的关键字是 (C) A、try B、catch C、throw D、finally 2.关于异常,下列说法正确的是(A) A、异常是一种对象 B、一旦程序运行,异常将被创建 C、为了保证程序运行速度,要尽量避免异常控制 D、以上说法都丌对 3.(A)类是所有异常类的父类。 A、Throwable B、Error C、Exception D、AWTError 4.java语言中,下列哪一子句是异常处理的出口(C) A、try{…}子句 B、catch{…}子句 C、finally{…}子句 D、以上说法都丌对 5.下列程序的执行,说法错误的是 (C) public class MultiCatch { public static void main(String args[]) { try { int a=args.length; int b=42/a; int c[]={1}; c[42]=99; System.out.println(“b=”+b); } catch(ArithmeticException e) { System.out.println(“除0异常:”+e); } catch(ArrayIndexOutOfBoundsException e) { System.out.println(“数组超越边界异常:”+e); } } } A、程序将输出第15行的异常信息 B、程序第10行出错 C、程序将输出“b=42”

D、程序将输出第15和19行的异常信息 6.下列程序的执行,说法正确的是(D) class ExMulti { static void procedure() { try { int c[]={1}; c[42]=99; } catch(ArrayIndexOutOfBoundsException e) { System.out.println(“数组超越界限异常:”+e); } } public static void main(String args[]) { try { procedure(); int a=args.length; int b=42/a; System.out.println(“b=”+b); } catch(ArithmeticException e) { System.out.println(“除0异常:”+e); } } } A、程序只输出第12行的异常信息 B、程序只输出第26行的异常信息 C、程序将不输出异常信息 D、程序将输出第12行和第26行的异常信息 7.下面程序抛出了一个“异常”并捕捉它。请在横线处填入适当内容完成程序。class TrowsDemo { static void procedure() throws IllegalAccessExcepton { System.out.println(“inside procedure”); throw__new_____IllegalAccessException(“demo”);

Java中常见异常类型及分析

Java常见异常类型及原因分析 这里介绍几种常见的异常并对原因进行分析,包括: ●NullPointException异常; ● ClassCastException异常; ● ArrayIndexOutOfBoundsException异常; ●UnsupportedClassVersionError错误; ●NumberFormatExceptio异常 ●堆栈溢出和内存溢出。 1 NullPointException异常 顾名思义,NullPointerException是空指针异常。但是在Java中没有指针,怎么会有空指针异常呢? 在C++中,声明的指针需要指向一个实例(通过new方法构造),这个指针可以理解为地址。 在Java中,虽然没有指针,但是有引用(通常称为对象引用,一般直接说对象),引用也是要指向一个实例对象(通过new方法构造)的,从这种意义上说,Java中的引用与C++中的指针没有本质的区别,不同的是,处于安全的目的,在Java中不能对引用进行操作,而在C++中可以直接进行指针的运算,例如book++等。 所以这里的NullPointerException虽然不是真正的空指针异常,但本质上差不多,是因为引用没有指向具体的实例,所以当访问这个引用的方法的时候就会产生这种异常。例如下面的代码: String str = "这是一个测试用的字符串!"; System.out.println(str.length()); 这段代码没有问题,但是如果改成下面的代码: String str ; System.out.println(str.length()); 就会产生NullPointerException异常了,当然一般人不会犯这样低级的错误。 那这种异常通常是如何产生的呢?比较多见的是下面的两种情况: 1)把调用某个方法的返回值直接赋值给某个引用,然后调用这个引用的方法。在这种情况下,如果返回的值是null,必然会产生NullPointerException异常。例如: String userName=request.getParameter("userName"); if(userName.length()==0) ...... else ...... 如果request.getParameter("userName")的结果为null,则这里就会产生这种异常。 2)在方法体中调用参数的方法。这种情况下,如果调用方法的时候传递进来的值是null,也要产生NullPointerException异常。 要解决这种异常,只需要检查异常出现在第几行(通常在集成开发环境中会提示用户错误发生在第几行),然后查看调用了哪个对象的方法,然后检查这个对象为什么没有赋值成

Java中异常处理

第13章异常课堂练习(2理论+2习题课+2上机) 【教学目标】 ?了解异常和异常处理的概貌(第13.2节)。 ?探究使用异常处理的优点(第13.3节)。 ?区别异常的类型:Error (致命的) 和Exception (非致命的), 以及必检和免检异常(第13.4节)。 ?在方法头中声明异常(第13.5.1节)。 ?在方法中抛出异常(第13.5.2节)。 ?编写try-catch 块处理异常(第13.5.3节)。 ?解释异常是如何传播的(第13.5.3节)。 ?在try-catch块中使用finally子句(第13.6节)。 ?只为非预期错误使用异常(第13.7节)。 ?在catch 块中重新抛出异常(第13.8节)。 ?创建链式异常(第13.9节)。 ?定义自定制的异常类(第13.10节)。 【教学重点】 ?了解异常的处理机制 ?异常的解决方法 ?Exception类的作用及其使用方法 ?必检异常、免检异常的特点 【基本知识点】 1、常见异常演示 (1)算数异常:https://www.360docs.net/doc/64442152.html,ng.ArithmeticException 在算术运算中,0作为除数时,系统将产生该异常,示例: public static void main(String[] args) { int x=10; int y=0; int m=x/y; } Exception in thread "main" https://www.360docs.net/doc/64442152.html,ng.ArithmeticException: / by zero at exception.NotChecketException.main(NotChecketException.java:7)(2)数组越界异常:https://www.360docs.net/doc/64442152.html,ng.ArrayInd exOutOfBoundsException 在数组下标越界时,将产生该异常,示例:

常见异常列表(精)

算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeArrayException 数组下标越界异常:ArrayIndexOutOfBoundsException 违背安全原则异常:SecturityException 文件已结束异常:EOFException 文件未找到异常:FileNotFoundException 字符串转换为数字异常:NumberFormatException 操作数据库异常:SQLException 输入输出异常:IOException 方法未找到异常:NoSuchMethodException https://www.360docs.net/doc/64442152.html,ng.AbstractMethodError 抽象方法错误。当应用试图调用抽象方法时抛出。 https://www.360docs.net/doc/64442152.html,ng.AssertionError 断言错。用来指示一个断言失败的情况。 https://www.360docs.net/doc/64442152.html,ng.ClassCircularityError 类循环依赖错误。在初始化一个类时,若检测到类之间循环依赖则抛出该异常。 https://www.360docs.net/doc/64442152.html,ng.ClassFormatError 类格式错误。当Java虚拟机试图从一个文件中读取Java类,而检测到该文件的内容不符合类的有效格式时抛出。 https://www.360docs.net/doc/64442152.html,ng.Error 错误。是所有错误的基类,用于标识严重的程序运行问题。这些问题通常描述一些不应

被应用程序捕获的反常情况。 https://www.360docs.net/doc/64442152.html,ng.ExceptionInInitializerError 初始化程序错误。当执行一个类的静态初始化程序的过程中,发生了异常时抛出。静态初始化程序是指直接包含于类中的static语句段。 https://www.360docs.net/doc/64442152.html,ng.IllegalAccessError 违法访问错误。当一个应用试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。 https://www.360docs.net/doc/64442152.html,ng.IncompatibleClassChangeError 不兼容的类变化错误。当正在执行的方法所依赖的类定义发生了不兼容的改变时,抛出该异常。一般在修改了应用中的某些类的声明定义而没有对整个应用重新编译而直接运行的情况下,容易引发该错误。 https://www.360docs.net/doc/64442152.html,ng.InstantiationError 实例化错误。当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常. https://www.360docs.net/doc/64442152.html,ng.InternalError 内部错误。用于指示Java虚拟机发生了内部错误。 https://www.360docs.net/doc/64442152.html,ng.LinkageError 链接错误。该错误及其所有子类指示某个类依赖于另外一些类,在该类编译之后,被依赖的类改变了其类定义而没有重新编译所有的类,进而引发错误的情况。 https://www.360docs.net/doc/64442152.html,ng.NoClassDefFoundError 未找到类定义错误。当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误。 https://www.360docs.net/doc/64442152.html,ng.NoSuchFieldError 域不存在错误。当应用试图访问或者修改某类的某个域,而该类的定义中没有该域的定义时抛出该错误。 https://www.360docs.net/doc/64442152.html,ng.NoSuchMethodError

Java作业实验六---异常处理

提交方式: 把文件名改为学号姓名,提交文档和源码(只需提交最顶层包文件夹) 实验六异常处理 一、实验目的 1.学会利用Try-catch-finally语句来捕获和处理异常; 2.掌握自定义异常类的方法。 二、实验要求 1.通过编程理解系统异常处理的机制和创建自定义异常的方法。 2.掌握基础类。 三、实验内容 (一)异常处理机制 1. 编写使用try…catch 语句处理异常的程序文件Demo4_1.java,

编译并运行程序,并把运行结果复制在下面 。 注意:如果在catch 语句中声明的异常类是Exception,catch 语句也能正确地捕获,这是因为Exception是ArithmeticException的父类。如果不能确定会发生哪种情况的异常,那么最好指定catch的参数为Exception,即说明异常的类型为Exception。 2、源文件是Demo3_2.java。要捕捉的异常是除数为零和数组下标越界。通过修改a和c[]下标值体验程序。 【思考】 ①先运行上面程序,观察运行结果。 ②按下条件分别修改数据,编译后运行,观察输出结果,分析在try…catch块里那些语句没有被执行,为什么? 块外那些语句可被执行到,为什么? 修改a=0,保持c[2]=200; 保持a=10,修改c[3]=200, 修改a=0,修改c[3]=200; ③再添加一个catch{Exception e}{ },位置在最前面,观察编译信息,说明什么? 3、编写Demo3_3.java 程序,计算两数相除并输出结果。使用两个catch子句,分别捕捉除数为0的异常和参数输入有误异常。源代码如下:

最新java异常处理作业(1113132845)

Java异常处理作业 孙月巧 1、参考下面的程序,试修改程序,捕获相关异常,使得程序能正常运行。【提示:用错误数据测试,即可得到异常类名,运行时主方法参数输入abc 测试】 package November; import java.util.Scanner; public class StringIndexOutOf{ public static void main(String args[]){ System.out.println("请输入一个字符串:"); try{ Scanner reader=new Scanner(System.in); String str = reader.nextLine(); System.out.println("第四个字符为 " + str.charAt(3)); int aa = Integer.parseInt(str); System.out.println("平方为 " + aa * aa); } catch(StringIndexOutOfBoundsException e){ System.out.println("您输入的数值下标越界"); } catch(NumberFormatException nfe){ System.out.println("您输入的不是数字"); } } } 2、从命令行得到5个整数,放入一整型数组,然后打印输出,要求:如果输入数据不为整数,要捕获Integer.parseInt()产生的异常,显示“请输入整数”,捕获输入参数不足5个的异常(数组越界),显示“请输入至少5个整数”。 package November; public class Test2 { public static void main(String[] args) { System.out.println("请输入五个整数:"); try {

JAVA常见编译错误信息及说明

Java编译错误信息及说明 1、java:33:不是语句 解释:程序中出现了没有任何意义的字符(串),可能是无意中打出了没有任何意义的字符; 2、java:34:需要';' 解释:某条语句没有以分号结束; 3、java:36:缺少返回语句 解释:带返回值的函数缺少return语句; 4、java:33:不兼容的类型 解释:运算符两边的数据类型不一致或者不能做隐式转换; 5、java:36:无法访问的语句 解释:此语句永远不可能被执行,可能是此语句之前存在类似于while(true)的语句,导致此语句永远不可能被执行; 6、java:34:非法的表达式开始 解释:有不符合语法规范的表达式出现; 7、java:34:找不到符号 解释:使用了没有定义或没有引入的变量; 8、java:33:非法字符:\65307 解释:在中文输入状态下输入了一些标点符号; 9、java:18:不可转换的类型 解释:运算符两边的数据类型不一致或者不能做隐式转换; 10、java:19:"else"不带有"if" 解释:编译器找到else语句但是没有找到与之对应的if语句,可能是由于大括号没有成对出现;

11、java:12:可能损失精度 解释:把高精确度类型的数据赋值给低精确度类型的变量; 12、java:17:需要')' 解释:括号没有成对出现; 13、java:8:可能尚未初始化变量s 解释:局部变量s没有赋初值; 14、java:7:不可比较的类型:int和Boolean 解释:运算符两边操作数的数据类型不符合运算符的使用规范; 15、java:6:已在isLeap(int)中定义year 解释:变量year被重复定义; 16、java:21:字符字面值的行结尾不合法 解释:程序语句的结尾不是java规定的结束符号,而是其他的符号; 17、java:9:需要<标识符> 解释:可能是由于用户指定了数据类型,但未指定该类型的变量名; 18、java:8:无法从静态上下文中引用非静态变量this 解释:在静态方法中使用了非静态变量this; 19、java:12:在switch或loop外部中断 解释:在非循环语句或非switch语句中使用了中断循环功能的语句break; 20、java:21:对于结果类型为void的方法,无法返回值 解释:空返回值方法中出现了return语句; 21、java:12:需要数组,但找到int 解释:在应该出现数组的地方没有找到数组类型的变量,而是找到int类型的变量; 22、java:13:无法将Node中的setData(int)应用于()

java的常见问题及解决方法

1."https://www.360docs.net/doc/64442152.html,mons.collections.SequencedHashMap"'s signer information does not match signer information of other classes in the same package 这是由于struts提供的commons-beanutils.jar和hibernate提供的commons-collections.jar冲突成的, 可以从spring提供的lib中找到这个两个jar https://www.360docs.net/doc/64442152.html,ng.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.IdentNode 用hql 时,忘了给表名加别名,如select p from Position,应该是select p from Position p 3.The Server didn 't send back a proper XML response 用FCKEditor时 原因:解析不了xml文件 解决方法: 情况一:web.xml的配置是否正确,具体查看《FCKEditor使用指南.pdf》,还有fckeditor自带的几个jar 包 情况二:加入serializer.jar,xalan.jar 情况三:把项目下的fckeditor包删了,重新加入一遍 https://www.360docs.net/doc/64442152.html,.eclipse.swt.SWTError: No more handles [Unknown Mozilla path (MOZILLA_FIVE_HOME not set)] SWTError:没有更多的处理[未知Mozilla的路径 (MOZILLA_FIVE_HOME未设置)] 环境:linux下运行swt程序(我出现此问题是,在linux下嵌套浏览器) 原因:firefox版本不一致 解决:重装一个firefox,并设置相关变量 5.Exception in thread "main" org.eclipse.swt.SWTError: No more handles [Could not detect registered XULRunner to use] 环境:用XULRunner 在java application中嵌套浏览器 原因:没有注册XULRunner 解决:window下环境中,在程序中加入,如(第二个参数是下载解压后的存放路径): static{ System.setProperty("org.eclipse.swt.browser.XULRunnerPath", "C:\\xulrunner"); } 6.Exception in thread "main" https://www.360docs.net/doc/64442152.html,ng.UnsatisfiedLinkError: no swt-win32-3536 or swt-win32 in swt.library.path, java.library.path or the jar file

Java异常处理总结(精)

Java 异常处理总结 找到一个关于异常总结的很详细的文章, 分享下. 异常在我们编程中很重,在适当的位置,合理的处理或者抛出异常,对程序来说至关重要。转:异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C 开始,你也许已经知道如何用if...else... 来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出现,那么你每个地方都要做相同处理,感觉相当的麻烦! Java 语言在设计的当初就考虑到这些问题,提出异常处理的框架的方案,所有的异常都可以用一个类型来表示,不同类型的异常对应不同的子类异常(这里的异常包括错误概念),定义异常处理的规范,在1.4版本以后增加了异常链机制,从而便于跟踪异常!这是Java 语言设计者的高明之处,也是Java 语言中的一个难点,下面是我对Java 异常知识的一个总结,也算是资源回收一下。 一、Java 异常的基础知识 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误https://www.360docs.net/doc/64442152.html,ng.Error ;如果你用System.out.println(11/0,那么你是因为你用0做了除数,会抛出https://www.360docs.net/doc/64442152.html,ng.ArithmeticException 的异常。有些异常需要做处理,有些则不需要捕获处理,后面会详细讲到。天有不测风云,人有旦夕祸福,Java 的程序代码也如此。在编程过程中,首先应当尽可能去避免错误和异常发生,对于不可避免、不可预测的情况则在考虑异常发生时如何处理。 Java 中的异常用对象来表示。Java 对异常的处理是按异常分类处理的,不同异常有不同的分类,每种异常都对应一个类型(class ),每个异常都对应一个异常(类的)对象。 异常类从哪里来?有两个来源,一是Java 语言本身定义的一些基本异常类型,二是用户通过继承Exception 类或者其子类自己定义的异常。Exception 类及其

JAVA实验报告5 异常处理实验

中南财经政法大学武汉学院实验报告 实验课名称:__JAVA语言____ 学生姓名:_______ 专业班级:__网络工程1104 学号:11071125__ 开课时间:___2013年2月26日_ 教务处制

《Java程序设计基础》实验报告 实验序号:05实验项目名称:异常处理 学号11071125姓名专业、班级 实验地点计-202指导教师时间2013-5-14一、实验目的及要求 了解异常处理机制; 了解异常的概念; 掌握抛出异常、捕获异常和异常处理的方法; 了解自定义异常类的定义和使用方法。 二、实验设备(环境)及要求 1、Windows-XP操作系统 2、Eclipse应用程序 三、实验内容与步骤 编写一个类ExceptionTest1,在main方法中使用try、catch、finally: ①在try块中,编写被0除的代码。 ②在catch块中,捕获被0除所产生的异常,并且打印异常信息。 ③在finally块中,打印一条语句。 四、实验结果与数据处理 import java.util.*; public class ExceptionTest1{ public static void main(String[]args){ Scanner in=new Scanner(System.in); try{ System.out.print("请输入被除数:"); double beichushu=in.nextDouble(); System.out.print("请输入除数:"); double chushu=in.nextDouble(); if(chushu==0) throw new ArithmeticException("请输入不为0的数字!"); double i=(beichushu/chushu); System.out.println("二者的商为:"+i);}catch(InputMismatchException e1){ System.out.println("请输入数字!");

java中常见的NullPointerException异常

java中常见的NullPointerException异常 下面列出了我们学习java时常出现的NullPointerException异常,以及它的解决办法 1,空指针错误https://www.360docs.net/doc/64442152.html,ng.NullPointerException 使用基本的JAVA数据类型,变量的值要么已经是默认值,如果没有对其正常赋值,程序便不能通过编译,因此使用基本的JAVA数据类 型(double,float,boolean,char,int,long)一般不会引起空指针异常。由此可见,空指针异常主要跟与对象的操作相关。 下面先列出了可能发生空指针异常的几种情况及相应解决方案: 不管对象是否为空就直接开始使用。 (JSP)代码段1:out.println(request.getParameter("username")); 描述:代码段1的功能十分简单,就是输出用户输入的表域"username"的值。 说明:看上去,上面的语句找不出什么语法错误,而且在大多数情况下也遇不到什么问题。但是,如果某个用户在输入数据时并没有提供表单域"username"的值,或通过某种途径绕过表单直接输入时,此时request.getParameter("username")的值为空(不是空字符串,是空对象null。),out对象的println方法是无法直接对空对象操作,因此代

码段1所在的JSP页面将会抛出"https://www.360docs.net/doc/64442152.html,ng.NullPointerException"异常。即使对象可能为空时,也调用https://www.360docs.net/doc/64442152.html,ng.Object或Object对象本身的一些方法如toString(), equals(Object obj)等操作。 (JSP)代码段2:String userName = request.getParameter("username"); If (userName.equals("root")) {....} 描述:代码段2的功能是检测用户提供的用户名,如果是用户名称为"root"的用户时,就执行一些特别的操作。 说明:在代码段2中,如果有用户没有提供表单域"username"的值时,字符串对象userName为null值,不能够将一个null的对象与另一个对象直接比较,同样,代码段2所在的JSP页面就会抛出 (https://www.360docs.net/doc/64442152.html,ng.NullPointerException)空指针错误。 (JSP)代码段3:String userName = session.getAttribute("https://www.360docs.net/doc/64442152.html,ername").toString(); 描述:代码段3的功能是将session中https://www.360docs.net/doc/64442152.html,ername的值取出,并将该值赋给字符串对象userName。说明:在一般情况下,如果在用户已经进行某个会话,则不会出现什么问题;但是,如果此时应用服务器重新启动,而用户还没有重新登录,(也可能是用户关闭浏览器,但是仍打开原来的页面。)那么,此时该session的值就会失效,同时

java异常(习题)

java异常(习题) 练习 1. 填空 Java 中所有的错误都继承自______类;在该类的子类中, _______类表示严重的底层错误,对于这类错误一般处理的方式是___________;_______类表示例外、异常。 2. 查api,填空 异常类,从分类上说,该类属于__________(已检查| 未检查)异常,从处理方式上说,对这种异常___________________; 异常类,从分类上说,该类属于_________(已检 查|未检查)异常,从处理方式上说,对这种异常__________________。 (try-catch-finally)有如下代码:

要求: 1) MyException1 为已检查异常,MyException2 为未检查异常 2) 这两个异常均具有两个构造函数,一个无参,另一个带字符串参数,参数表示产生异常的详细信息。 6. (自定义异常)在上一题的基础上,把下面代码补充完整。

throws B. throws C. throws D. 不能抛出任何异常。 选择正确答案: A.编译不通过 B.编译通过,输出No Exception C.编译通过,输出ex1 D.编译通过,输出ex2 E.编译通过,输出ex3

10. *(try-catch,局部变量)有如下代码 选择正确答案: A. 编译不通过 B. 编译通过,输出-1 C. 编译通过,输出0 11. *(try-catch-finally)有如下代码

class MySuper { public void m() throws IOException { } } class MySub extends MySuper { public void m() throws EOFException { } } class MySub2 extends MySub { public void m() throws FileNotFoundException { } } 以上代码是否能编译通过如果不能,应该如何修改 14. *(自定义异常)完成某个计费系统的用户登录和注册模块,要求如下: 1)创建一个User 类,包括:用户登录名(username)、密码(password)、用户真实姓 名(name)、电子邮件地址(email)属性和相应的构造方法及set/get 方法。 2)创建两个自定义异常类,一个LoginException,表示登录异常。一个RegisterException,表示注册异常。自定义的两个异常,都要求有一个接受字符串类型参数的构造方法。 3)创建一个UserBiz 接口,该接口中定义两个方法: void register(String username, String password, String password2, String name, String email) throws RegisterException **(异常的捕获和抛出)有以下代码:

java常见错误集锦

java常见错误以及可能原因集锦 0、需要标识符 a) 不在函数内 1、非法表达式开始 b) 可能:丢失括号 . 2. no data found a) 可能:setInt(1,100)中,没有100这个值 3. 找不到符号 a) 可能:没导入包 4. 指定了无效URL a) 可能:数据库名或IP错误,即连接出错 5. 类路径没有找到 a) 可能: ClassNotFoundException: oracle.jdbc.driver.OracleDriver b) 原因: 一般是指包名写错,或者没有import包,或者没有在类路径中找到jar文件 c) 解决: 没有加载Oracle驱动jar,在.bash_profile中把ojdbc14.jar加进来 6. 空指针异常 a) 可能: 数据源错误比如数据库名或IP错误 7. 不能执行查询 a) 可能: 数据库中表的问题,比如列名不存在 8. invalid identity a) 可能: 列名出错 9. 若在数据库中创建了两个sequence ,运行时出现异常可能是先后执行了多次select 语句,导致与原有的序列号产生冲突 10. 表名或列名不存在 a) 可能:表不存在或者没有插入数据到表中 11. 不支持的类,类的版本错误 a) 可能:没有导入jdk5.0,或者编译器仍为1.4 12. MappingNotFoundException a) Maybe: In the Eclipse Not refersh , or not exist in the dirctory

13. HibernateException: /hibernate.cfg.xml not found a) Maybe1: hibernate.cfg.xml not in the root directory b) Maybe2: Could not parse configuration . c) resolve: database not connect or use another database 14. ConstraintViolationException a) Maybe: used a not true database 15. 驱动没有找到或者 JDBC Driver not found 可能:连接数据库的驱动jar包不存在或者版本不一致,比如将旧的版本换成新的会造成该类错误 16. 空指针异常, https://www.360docs.net/doc/64442152.html,ng.NullPointerException a) 可能1:数据库连接出错,比如在hibernate.cfg.xml中的数据错误会导致异常。 17. 数据插入异常,GenericJDBCException: could not insert a) 可能1:没有建立表或者表中没有任何数据 b) 可能2:插入数据后没有执行提交语句:commit 18. LazyInitializationException 或者延迟加载异常 a) 可能1:没有在查询语句中加fetch 19. IdentifierGenerationException a) 可能1:高位表没有初始化(比如hi_value中没有记录) 20. could not initialize a collection: [hibernate.entity.Role.modules#32768] Syntax error: Encountered "-" at line 1, column 132. a) 错误原因:红色字部分中“-”为非法字符,替换为module_role 21. could not insert collection rows: [hibernate.entity.Module.roles#1] 在Module.hbm.xml文件的如下配置中加入inverse=”true” 22.在部署Struts时,出现如下错误信息: HTTP Status 404 - Servlet action is not available type Status report message Servlet action is not available description The requested resource (Servlet action is not available) is not available. 问题原因: 1.、web.xml文件中未配置ActionServlet。 2、struts-config.xml文件未配置你要访问的Action。 3、你的jsp文件form标记中action属性的路径名称错误。 4、非以上三种情况。

相关文档
最新文档