JavaSe重要点分析

2026/1/18 13:49:16

17

EmptyStackException(空栈异常), IllegalArgumentException(不合法的参数异常), NegativeArraySizeException, NoSuchElementException, SecurityException, SystemException, UndeclaredThrowableException 1. java.lang.NullPointerException

异常的解释是\程序遇上了空指针\,简单地说就是调用了未经初始化的对象或者是不存在的对象,即把数组的初始化和数组元素的初始化混淆起来了。数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,所以还需要对每个元素都进行初始化(如果要调用的话) 2. java.lang.ClassNotFoundException 异常的解释是\指定的类不存在\。

3. java.lang.ArithmeticException 这个异常的解释是\数学运算异常\,比如程序中出现了除以零这样的运算就会出这样的异常。

4. java.lang.ArrayIndexOutOfBoundsException

异常的解释是\数组下标越界\, 现在程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围,一般来说,显示(即直接用常数当下标) 调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了,还有一种情况,是程序中定义的数组的长度是通过某些特定方法决定的,不是事先声明 的,这个时候,最好先查看一下数组的length,以免出现这个异常。

5. java.lang.IllegalArgumentException

这个异常的解释是\方法的参数错误\,比如g.setColor(int red,int green,int blue)这个方法中的三个值,如果有超过255的也会出现这个异常,因此一旦发现这个异常,我们要做的,就是赶紧去检查一下方法调用中的参数传递是不是出现了错误。 6. java.lang.IllegalAccessException

这个异常的解释是\没有访问权限\,当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常。对程序中用了Package的情况下要注意这个异常。

异常语句

2.3.1 try语句可能会抛弃一个或多个例外。

2.3.2catch语句,包括一个例外类型和一个例外对象。例外类型必须为Throwable类的子类,它指明 了catch语句所处理的例外类型,例外对象则由运行时系统在try所指定的代码块中生成并被捕捉,大括号 中包含对象的处理,其中可以调用对象的方法。

catch语句可以有多个,分别处理不同类的例外。Java运行时系统从上到下分别对每个catch语句处理 的例外类型进行检测,直到找到类型相匹配的catch语句为止。

也可以用一个catch语句处理多个例外类型,这时它的例外类型参数应该是这多个例外类型的父类。 2.3.3finally语句

finally所指定的代码都要被执行,通常在finally语句中可以进行资源的清除工作。如关闭打开的文 件等。 2.3.4throws语句

throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。假如你想明确地抛出一 个RuntimeException,你必须用throws语句来声明它的类型。 2.3.5throw语句

throw总是出现在函数体中,用来抛出一个异常。 3 要害字及其中语句流程详解 3.1try的嵌套

18

每当碰到一个try语句,异常的框架就放到堆栈上面,直到所有的try语句都完成。假如下一级的try 语句没有对某种异常进行处理,堆栈就会展开,直到碰到有处理这种异常的try语句。下面是一个try语句 嵌套的例子。 class MultiNest { static void procedure() { try { int a = 0; int b = 42/a;

} catch(java.lang.ArithmeticException e) {

System.out.println(\ } }

public static void main(String args[]) { try { procedure();

} catch(java.lang. Exception e) {

System.out.println(\ } } }

这个例子执行的结果为:

in procedure, catch ArithmeticException: java.lang.ArithmeticException: / by zero

成员函数procedure里有自己的try/catch控制,所以main不用去处理ArrayIndexOutOfBoundsException;当然如果在procedure中catch到异常时使用throw e;语句将异常抛出,那么main当然还是能够捕捉并处理这个procedure抛出来的异常。例如在procedure函数的catch中的System.out语句后面增加throw e;语句之后,执行结果就变为:

in procedure, catch ArithmeticException: java.lang.ArithmeticException: / by zero in main, catch Exception: java.lang.ArithmeticException: / by zero

我认为try catch和正常的if else一样都是程序流程块,同样他们内部定义的变量对外部都是不可见的。如果try中的程序执行过程中有异常e抛出,如果e是catch中的定义的异常或是其子类,那么程序就会跳转到catch那边执行catch中的程序,如果catch中的程序又有异常抛出,那么就看这个异常有没有新的try catch块来捕获它,如果没有的话,那它就抛出了,程序中止执行。关于finally的理解就是任何调用try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning。 3.5 如何抛出异常

如果你知道你写的某个函数有可能抛出异常,而你又不想在这个函数中对异常进行处理,只是想把它抛出去让调用这个函数的上级调用函数进行处理,那么有两种方式可供选择: 第一种方式:直接在函数头中throws SomeException,函数体中不需要try/catch。

第二种方式:使用try/catch,在catch中进行一定的处理之后(如果有必要的话)抛出某种异常。 第三种方法:使用try/catch/finally。

19

Sleep与wait的区别?

1、这两个方法来自不同的类分别是Thread和Object

2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)

4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在sleep的过程中过程中有可能被其他对象调用它的interrupt(),产生InterruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。

注意sleep()方法是一个静态方法,也就是说他只对当前对象有效,通过t.sleep()让t对象进入sleep,这样的做法是错误的,它只会是使当前线程被sleep 而不是t线程

wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产生InterruptedException,效果以及处理方式同sleep()方法

Wait的扩展: 如何实现事件通知模型 Message类:

package com.tarena.thread; public class Message { }

MessagerHandler 类: package com.tarena.thread;

import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicBoolean; public class MessagerHandler {

private Object _lockObj = new Object();

private ConcurrentLinkedQueue msgs = new ConcurrentLinkedQueue(); private AtomicBoolean isRunning = new AtomicBoolean(false); public MessagerHandler() {

new Thread(\

public void run() { }

isRunning.set(true); _handle();

public String msg;

}.start();

20

}

MessageHandler类:

package com.tarena.thread;

public class TestHandler extends MessagerHandler{

@Override

protected void handle(Message msg) { } /**

* @param args */

public static void main(String[] args) { }

Message msg = new Message(); msg.msg = \测试消息驱动\;

new TestHandler().notifyMessage(msg);

System.out.println(\接收到的消息为:\+msg.msg); } /**

* 发送消息 *

* @param msg */

public final void notifyMessage(Message msg) { }

private void _handle() { }

protected void handle(Message msg) { }

while (isRunning.get()) { }

if (msgs.isEmpty()) { }

synchronized (_lockObj) { }

handle(msgs.poll());

try { }

_lockObj.wait();// 等待 } catch (InterruptedException e) {

msgs.add(msg);

synchronized (_lockObj) { }

_lockObj.notify();

} else {


JavaSe重要点分析.doc 将本文的Word文档下载到电脑
搜索更多关于: JavaSe重要点分析 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219