澳门新葡萄京娱乐场 3

澳门新葡萄京娱乐场Java 异常类总结

本文由码农网 –
小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!

澳门新葡萄京娱乐场 1

Java异常定义:

接上文50个常见的 Java
错误及避免方法(第二部分)

在上一篇文章中,我们介绍了20种常见的编译器错误,并就如何避免这些错误做了说明。现在,我们将重点转移(尽管不只是专注于某一块),来探讨一下运行时异常以及导致这些异常的原因。接下来我们将聊聊30种常见的异常和错误,并且告诉你如何在代码中解决这些问题。21.“ArrayIndexOutOfBoundsException”这是代码在尝试访问不在数组的索引取值范围内的元素时会显示的运行时错误消息。如下所示的代码会触发此异常:

在Java语言中,将程序执行中发生的不正常情况称为“异常”,异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的

31.“Could Not Create Java Virtual Machine”

当我们尝试调用带有错误参数的Java代码时,通常会产生此Java错误消息(@ghacksnews):

Error: Could not create the Java Virtual Machine
Error: A fatal exception has occurred. Program will exit.

这通常是由于代码中的声明存在错误或为其分配适当的内存而引起的。

阅读关于如何修复Java软件错误“Could Not Create Java Virtual
Machine”的讨论。(@StackOverflow)

String[] name = { "tom", "dick", "harry"};for (int i = 0; i = name.length; i++) { System.out.print(name[i] + 'n');}

Java异常的层次结构:

32.“class file contains wrong class”

澳门新葡萄京娱乐场 ,当Java代码尝试在错误的目录中寻找类文件时,就会出现“class file contains
wrong class”的问题,导致类似于以下内容的错误消息:

MyTest.java:10: cannot access MyStruct 
bad class file: D:JavatestMyStruct.java 
file does not contain class MyStruct 
Please remove or make sure it appears in the correct subdirectory of the classpath. 
MyStruct ms = new MyStruct();

要修复此错误,以下这些提示可以提供帮助:

  • 确保源文件的名称和类的名称匹配——包括大小写。
  • 检查软件包语句是否正确或是否缺失。
  • 确保源文件位于正确的目录中。

阅读此关于如何修复“class file contains wrong
class”错误的讨论。(@StackOverflow)

如下是另外一个例子 (@DukeU):

澳门新葡萄京娱乐场 2

33.“ClassCastException”

“ClassCastException”消息指示了Java代码正在尝试将对象转换为错误的类。在来自Java
Concept of Day的这个例子中,运行以下程序:

package com;
class A
{
    int i = 10;
}
class B extends A
{
    int j = 20;
}
class C extends B
{
    int k = 30;
}
public class ClassCastExceptionDemo
{
    public static void main(String[] args)
    {
        A a = new B();   //B type is auto up casted to A type
        B b = (B) a;     //A type is explicitly down casted to B type.
        C c = (C) b;    //Here, you will get class cast exception
        System.out.println(c.k);
    }
}

导致以下错误:

Exception in thread “main” java.lang.ClassCastException: com.B cannot be cast to com.C
at com.ClassCastExceptionDemo.main(ClassCastExceptionDemo.java:23)

Java代码将创建一个类和子类的层次结构。为了避免“ClassCastException”错误,请确保新类型属于正确的类或其父类之一。如果使用泛型,则编译代码时可能会捕获这些错误。

阅读此教程以了解如何修复“ClassCastException”的Java软件错误。(@java_concept)

int[] list = new int[5];list[5] = 33; // illegal index, maximum index is 4

java.lang.Error

34.“ClassFormatError”

“ClassFormatError”消息指示链接错误,并且发生在类文件不能被读取或解释为类文件的时候。

Caused by: java.lang.ClassFormatError: Absent Code attribute in method that is
        not native or abstract in class file javax/persistence/GenerationType
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)

有若干原因会导致“ClassFormatError”错误:

  • 类文件以ASCII模式而不是二进制模式上传。
  • Web服务器必须以二进制而不是ASCII格式发送类文件。
  • 可能会有一个类路径错误,阻止了代码找到类文件。
  • 如果类被加载两次,那么第二次将导致抛出异常。
  • 正在使用旧版本的Java运行时。

阅读此关于导致Java“ClassFormatError”错误的原因的讨论。(@StackOverflow)

数组的索引是从零开始的,并且比数组长度小了1。通常,在定义数组索引的限制时,要使用“”而不是“=”。可以看看这个例子,索引是如何触发“ArrayIndexOutOfBoundsException”的。
(@StackOverflow)22.“StringIndexOutOfBoundsException”当代码尝试访问字符串中不在字符串范围内的字符串片段时,就会出现此问题。这种情况通常会发生在代码尝试创建一个字符串的子字符串,可是传入的参数值不符合字符串长度限制的时候。如下就是这类问题的一个例子
(@javacodegeeks):

Direct Known Subclasses:

35.“ClassNotFoundException”

“ClassNotFoundException”仅在运行时发生——意味着在编译期间有一个类在运行时缺失了。这是一个链接错误。

澳门新葡萄京娱乐场 3

很像“NoClassDefFoundError”,在以下情况下会出现这个问题:

  • 该文件不在正确的目录中。
  • 类的名称必须与文件的名称相同(不包括文件扩展名)。 名称区分大小写。

阅读此关于导致“ClassNotFoundException”原因的更多案例的讨论。(@StackOverflow)。

public class StringCharAtExample { public static void main(String[] args) { String str = "Java Code Geeks!"; System.out.println("Length: " + str.length()); //The following statement throws an exception, because //the request index is invalid. char ch = str.charAt(50); }}

AnnotationFormatError, AssertionError, AWTError, CoderMalfunctionError,
FactoryConfigurationError, FactoryConfigurationError, IOError,
LinkageError, ServiceConfigurationError, ThreadDeath,
TransformerFactoryConfigurationError, VirtualMachineError等

36.“ExceptionInInitializerError”

此Java问题发生在静态初始化出错的时候(@GitHub)。
当Java代码稍后使用该类时,将发生“NoClassDefFoundError”错误。

java.lang.ExceptionInInitializerError
  at org.eclipse.mat.hprof.HprofIndexBuilder.fill(HprofIndexBuilder.java:54)
  at org.eclipse.mat.parser.internal.SnapshotFactory.parse(SnapshotFactory.java:193)
  at org.eclipse.mat.parser.internal.SnapshotFactory.openSnapshot(SnapshotFactory.java:106)
  at com.squareup.leakcanary.HeapAnalyzer.openSnapshot(HeapAnalyzer.java:134)
  at com.squareup.leakcanary.HeapAnalyzer.checkForLeak(HeapAnalyzer.java:87)
  at com.squareup.leakcanary.internal.HeapAnalyzerService.onHandleIntent(HeapAnalyzerService.java:56)
  at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:145)
  at android.os.HandlerThread.run(HandlerThread.java:61)
Caused by: java.lang.NullPointerException: in == null
  at java.util.Properties.load(Properties.java:246)
  at org.eclipse.mat.util.MessageUtil.(MessageUtil.java:28)
  at org.eclipse.mat.util.MessageUtil.(MessageUtil.java:13)
  ... 10 more

修复此错误我们需要更多的信息。在代码中使用getCause()可以返回导致错误的异常。

阅读此关于如何追踪ExceptionInInitializerError原因的讨论。(@StackOverflow)

像数组的索引一样,字符串的索引是从零开始的。索引字符串时,最后一个字符的索引值比字符串的长度小1。
“StringIndexOutOfBoundsException”这个错误消息一般都意味着索引正在尝试访问不存在于字符串中的字符。这里有一个说明了“StringIndexOutOfBoundsException”是怎样发生还有如何去修复的例子。(@StackOverflow)23.“NullPointerException”当程序尝试使用没有经过赋值的对象引用时,就会发生“NullPointerException”。(@geeksforgeeks).

 

37.“IllegalBlockSizeException”

当长度消息不是8字节的倍数时,那么在解密期间就会抛出“IllegalBlockSizeException”异常。以下是一个出自ProgramCreek.com的示例(@ProgramCreek):

@Override
protected byte[] engineWrap(Key key) throws IllegalBlockSizeException, InvalidKeyException {
    try {
        byte[] encoded = key.getEncoded();
        return engineDoFinal(encoded, 0, encoded.length);
    } catch (BadPaddingException e) {
        IllegalBlockSizeException newE = new IllegalBlockSizeException();
        newE.initCause(e);
        throw newE;
    }
}

“IllegalBlockSizeException”可能是由以下原因引起的:

  • 使用不同的加密和解密算法选项。
  • 要解密的消息可能在传输中被截断或乱码。

阅读关于如何防止IllegalBlockSizeException
Java软件错误消息的讨论。(@StackOverflow)

// A Java program to demonstrate that invoking a method// on null causes NullPointerExceptionimport java.io.*;class GFG{ public static void main (String[] args) { // Initializing String variable with null value String ptr = null; // Checking if ptr.equals null or works fine. try { // This line of code throws NullPointerException // because ptr is null if (ptr.equals("gfg")) System.out.print("Same"); else System.out.print("Not Same"); } catch(NullPointerException e) { System.out.print("NullPointerException Caught"); } }}

java.lang.RuntimeException

38.“BadPaddingException”

当使用填充来创建一个消息而不是8字节的倍数时,那么在解密期间可能会出现“BadPaddingException”异常。这是出自Stack
Overflow的一个例子(@StackOverflow):

javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)

加密数据是二进制的,所以不要尝试将其存储在字符串或在加密期间没有被正确填充的数据中。

阅读关于如何防止BadPaddingException的讨论。(@StackOverflow)

Java
程序经常出现如下状况:语句引用一个值为空的对象。尝试去访问已经定义但是还没有分配过引用的类。这里就开发人员可能会在什么时候遇到“NullPointerException”以及如何处理它,进行了讨论。(@StackOverflow)24.“NoClassDefFoundError”“NoClassDefFoundError”会发生在解释器找不到在主方法使用到了的类的文件的时候。如下是DZone的示例
(@DZone):如果你对如下程序执行编译:

Direct Known Subclasses:

39.“IncompatibleClassChangeError”

“IncompatibleClassChangeError”是LinkageError的一种形式,如果一个在基类在编译子类之后发生变化,那么就会出现此异常。下面这个例子来自于How
to Do in
Java(@HowToDoInJava):

Exception in thread "main" java.lang.IncompatibleClassChangeError: Implementing class
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at net.sf.cglib.core.DebuggingClassWriter.toByteArray(DebuggingClassWriter.java:73)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:26)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:144)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:116)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104)
at net.sf.cglib.proxy.Enhancer.(Enhancer.java:69)

出现“IncompatibleClassChangeError”有可能的原因是:

  • 忘记了主方法的静态。
  • 非法使用了legal类。
  • 类被改变了,并且存在通过旧的签名从另一个类到这个类的引用。尝试删除所有类文件并重新编译所有内容。

尝试解决“IncompatibleClassChangeError”的这些步骤(@javacodegeeks)

class A{ // some code}public class B{ public static void main(String[] args) { A a = new A(); }}

ArithmeticException, ArrayStoreException, BufferOverflowException,
BufferUnderflowException,  ClassCastException, DataBindingException,
DOMException, EmptyStackException, EnumConstantNotPresentException,
EventException, FileSystemAlreadyExistsException,
FileSystemNotFoundException,
IllegalArgumentException,IllegalPathStateException,
IllegalStateException, IllformedLocaleException, ImagingOpException,
IncompleteAnnotationException, IndexOutOfBoundsException,
JMRuntimeException,  MissingResourceException,
NegativeArraySizeException, NoSuchElementException,NullPointerException,
ProfileDataException, ProviderException, ProviderNotFoundException, 
RejectedExecutionException, SecurityException, SystemException,
TypeConstraintException, TypeNotPresentException,
UndeclaredThrowableException, UnknownEntityException,
UnmodifiableSetException, UnsupportedOperationException,
WebServiceException, WrongMethodTypeException等

40.“FileNotFoundException”

当具有指定路径名的文件不存在时,将抛出此Java软件错误消息。

@Override public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
    if (uri.toString().startsWith(FILE_PROVIDER_PREFIX)) {
        int m = ParcelFileDescriptor.MODE_READ_ONLY;
        if (mode.equalsIgnoreCase("rw")) m = ParcelFileDescriptor.MODE_READ_WRITE;
        File f = new File(uri.getPath());
        ParcelFileDescriptor pfd = ParcelFileDescriptor.open(f, m);
        return pfd;
    } else {
        throw new FileNotFoundException("Unsupported uri: " + uri.toString());
    }
}

除了没有指定路径名的文件之外,这可能意味着现有文件无法访问。

阅读关于为什么会抛出“FileNotFoundException”的讨论。(@StackOverflow)

它会生成两个 .class 文件:A.class 和 B.class。删除 A.class 文件并且运行
B.class 文件,就会得到 NoClassDefFoundError 错误消息:

 

41.“EOFException”

当输入期间意外终止文件或流时,将抛出“EOFException”。
以下是抛出EOFException异常的一个示例,来自JavaBeat应用程序:

import java.io.DataInputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class ExceptionExample {
    public void testMethod1() {
        File file = new File("test.txt");
        DataInputStream dataInputStream = null;
        try {
            dataInputStream = new DataInputStream(new FileInputStream(file));
            while (true) {
                dataInputStream.readInt();
            }
        } catch (EOFException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (dataInputStream != null) {
                    dataInputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        ExceptionExample instance1 = new ExceptionExample();
        instance1.testMethod1();
    }
}

运行上面的程序,将抛出以下异常:

java.io.EOFException
at java.io.DataInputStream.readInt(DataInputStream.java:392)
at logging.simple.ExceptionExample.testMethod1(ExceptionExample.java:16)
at logging.simple.ExceptionExample.main(ExceptionExample.java:36)

当DataInputStream类尝试在流中读取数据但没有更多数据时,将抛出“EOFException”。它也可以发生在ObjectInputStream和RandomAccessFile类中。

阅读关于运行Java软件时可能发生“EOFException”的讨论。(@StackOverflow)

Exception in thread "main" java.lang.NoClassDefFoundError: Aat MainClass.main(MainClass.java:10)Caused by: java.lang.ClassNotFoundException: Aat java.net.URLClassLoader.findClass(URLClassLoader.java:381)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

从大体来分异常为两块:

42.“UnsupportedEncodingException”

当不支持字符编码时,会抛出此Java软件错误消息(@Penn)。

public UnsupportedEncodingException()

正在使用的Java虚拟机可能不支持给定的字符集。

阅读关于如何在运行Java软件时处理“UnsupportedEncodingException”异常的讨论。(@StackOverflow)

如果存在如下问题,就会发生这样的问题:该文件不在正确的目录。类的名称必须与文件的名称相同,且名称是区分大小写的。你可以读一读这里关于为什么会在运行
Java
软件时发生“NoClassDefFoundError”的讨论。(@StackOverflow)25.“NoSuchMethodFoundError”
Java
软件尝试调用类的方法而该方法在类里面没有定义时,就会出现这样的错误消息
(@myUND):

  1. error—错误 :
    是指程序无法处理的错误,表示应用程序运行时出现的重大错误。例如jvm运行时出现的OutOfMemoryError以及Socket编程时出现的端口占用等程序无法处理的错误。

  2. Exception — 异常 :异常可分为运行时异常跟编译异常

  3. 检查性异常: 不处理编译不能通过

  4. 非检查性异常:不处理编译可以通过,如果有抛出直接抛到控制台

  5. 运行时异常: 就是非检查性异常

  6. 非运行时异常: 就是检查性异常

43.“SocketException”

“SocketException”异常表示创建或访问套接字时出错(@ProgramCreek)。

public void init(String contextName, ContextFactory factory) {
    super.init(contextName, factory);
    String periodStr = getAttribute(PERIOD_PROPERTY);
    if (periodStr != null) {
        int period = 0;
        try {
            period = Integer.parseInt(periodStr);
        } catch (NumberFormatException nfe) {}
        if (period <= 0) {
            throw new MetricsException("Invalid period: " + periodStr);
        }
        setPeriod(period);
    }
    metricsServers =
        Util.parse(getAttribute(SERVERS_PROPERTY), DEFAULT_PORT);
    unitsTable = getAttributeTable(UNITS_PROPERTY);
    slopeTable = getAttributeTable(SLOPE_PROPERTY);
    tmaxTable = getAttributeTable(TMAX_PROPERTY);
    dmaxTable = getAttributeTable(DMAX_PROPERTY);
    try {
        datagramSocket = new DatagramSocket();
    } catch (SocketException se) {
        se.printStackTrace();
    }
}

当由于以下原因而达到最大连接时,通常会抛出此异常:

  • 没有更多的网络端口可用于应用程序。
  • 系统没有足够的内存来支持新的连接。

阅读关于如何在运行Java软件时解决“SocketException”问题的讨论。(@StackOverflow)

Error: Could not find or load main class wiki.java

异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。

44.“SSLException”

此Java软件错误消息发生在与SSL相关的操作出现故障的时候。
以下示例来自Atlassian(@Atlassian):

com.sun.jersey.api.client.ClientHandlerException: javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
   at com.sun.jersey.client.apache.ApacheHttpClientHandler.handle(ApacheHttpClientHandler.java:202)
   at com.sun.jersey.api.client.Client.handle(Client.java:365)
   at com.sun.jersey.api.client.WebResource.handle(WebResource.java:556)
   at com.sun.jersey.api.client.WebResource.get(WebResource.java:178)
   at com.atlassian.plugins.client.service.product.ProductServiceClientImpl.getProductVersionsAfterVersion(ProductServiceClientImpl.java:82)
   at com.atlassian.upm.pac.PacClientImpl.getProductUpgrades(PacClientImpl.java:111)
   at com.atlassian.upm.rest.resources.ProductUpgradesResource.get(ProductUpgradesResource.java:39)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
   at java.lang.reflect.Method.invoke(Unknown Source)
   at com.atlassian.plugins.rest.common.interceptor.impl.DispatchProviderHelper$ResponseOutInvoker$1.invoke(DispatchProviderHelper.java:206)
   at com.atlassian.plugins.rest.common.interceptor.impl.DispatchProviderHelper$1.intercept(DispatchProviderHelper.java:90)
   at com.atlassian.plugins.rest.common.interceptor.impl.DefaultMethodInvocation.invoke(DefaultMethodInvocation.java:61)
   at com.atlassian.plugins.rest.common.expand.interceptor.ExpandInterceptor.intercept(ExpandInterceptor.java:38)
   at com.atlassian.plugins.rest.common.interceptor.impl.DefaultMethodInvocation.invoke(DefaultMethodInvocation.java:61)
   at com.atlassian.plugins.rest.common.interceptor.impl.DispatchProviderHelper.invokeMethodWithInterceptors(DispatchProviderHelper.java:98)
   at com.atlassian.plugins.rest.common.interceptor.impl.DispatchProviderHelper.access$100(DispatchProviderHelper.java:28)
   at com.atlassian.plugins.rest.common.interceptor.impl.DispatchProviderHelper$ResponseOutInvoker._dispatch(DispatchProviderHelper.java:202)
   ...
Caused by: javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
   ...
Caused by: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
   ...
Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

发生这种情况的原因有:

  • 服务器或客户端上的证书已过期。
  • 服务器端口已重置为另一个端口。

阅读关于可能导致Java软件“SSLException”错误的讨论。(@StackOverflow)

当声明中有错别字的时候,一般就会出现“NoSuchMethodFoundError”这样的错误。阅读这里的教程可以了解如何避免
NoSuchMethodFoundError 错误。 (@javacodegeeks)26.
“NoSuchProviderException”
当请求了一个不可用的安全方案提供方的时候,就会引发“NoSuchProviderException”
(@alvinalexander):

 

45.“MissingResourceException”

当资源丢失时,会发生“MissingResourceException”异常。如果资源在正确的类路径中,那么通常是因为属性文件没有正确配置。下面有一个例子(@TIBCO):

java.util.MissingResourceException: Can't find bundle for base name localemsgs_en_US, locale en_US
java.util.ResourceBundle.throwMissingResourceException
java.util.ResourceBundle.getBundleImpl
java.util.ResourceBundle.getBundle
net.sf.jasperreports.engine.util.JRResourcesUtil.loadResourceBundle
net.sf.jasperreports.engine.util.JRResourcesUtil.loadResourceBundle

阅读关于如何在运行Java软件时修复“MissingResourceException”的讨论。

javax.mail.NoSuchProviderException

常见异常总结:

46.“NoInitialContextException”

当Java应用程序想要执行命名操作但无法创建连接时,会发生“NoInitialContextException”异常(@TheASF)。

[java] Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
[java]     at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
[java]     at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:247)
[java]     at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:284)
[java]     at javax.naming.InitialContext.lookup(InitialContext.java:351)
[java]     at org.apache.camel.impl.JndiRegistry.lookup(JndiRegistry.java:51)

这解决起来可能会是一个复杂的问题,但这里有一些可能导致“NoInitialContextException”Java错误消息的原因:

  • 应用程序可能没有正确的凭据进行连接。
  • 代码可能无法识别所需的JNDI实现。
  • InitialContext类可能没有配置正确的属性。

阅读关于运行Java软件时“NoInitialContextException”意味什么的讨论。(@StackOverflow)

如果你在尝试找出“NoSuchProviderException”为什么会发生的原因,请进行如下检查:JRE
配置。配置中的 Java 主目录配置。使用的哪个 Java
环境。安全方案提供方选项。你可以读一下这里关于导致“NoSuchProviderException”的原因的讨论。(@StackOverflow)27.
AccessControlException
AccessControlException
表示请求访问的系统资源被拒绝了,例如本例中的 JBossDeveloper
(@jbossdeveloper):

非检查性异常(RuntimeException):

47.“NoSuchElementException”

当迭代(例如“for”循环)尝试访问下一个元素而没有元素的时候,就会出现“NoSuchElementException”异常。

public class NoSuchElementExceptionDemo{
    public static void main(String args[]) {
        Hashtable sampleMap = new Hashtable();
        Enumeration enumeration = sampleMap.elements();
        enumeration.nextElement();  //java.util.NoSuchElementExcepiton here because enumeration is empty
    }
}
Output:
Exception in thread "main" java.util.NoSuchElementException: Hashtable Enumerator
        at java.util.Hashtable$EmptyEnumerator.nextElement(Hashtable.java:1084)
        at test.ExceptionTest.main(NoSuchElementExceptionDemo.java:23)

抛出“NoSuchElementException”可能的途径:

  • Enumeration:: nextElement()
  • NamingEnumeration::next()
  • StringTokenizer:: nextElement()
  • Iterator::next()

阅读此关于如何在Java软件中修复“NoSuchElementException”的教程。(@javinpaul)

ERROR Could not register mbeans java.security.AccessControlException: WFSM000001: Permission check failed (permission "("javax.management.MBeanPermission" "org.apache.logging.log4j.core.jmx.LoggerContextAdmin#-[org.apache.logging.log4j2:type=51634f]" "registerMBean")" in code source "(vfs:/C:/wildfly-10.0.0.Final/standalone/deployments/mySampleSecurityApp.war/WEB-INF/lib/log4j-core-2.5.jar )" of "null")

java.lang.ArithmeticException,数学运算异常,当出现异常的运算条件时,抛出此异常

48.“NoSuchFieldError”

当应用程序尝试访问对象中的一个字段,但指定的字段不再存在于对象中时,将抛出此Java软件错误消息(@sourceforge)。

public NoSuchFieldError()

通常,该错误在编译器中被捕获,但是如果在编译和运行之间更改了类定义,则在运行时将被捕获。

阅读此关于如何在运行Java软件时发现什么导致“NoSuchFieldError”的讨论。(@StackOverflow)

可以读一读这里这篇关于解决“AccessControlException”错误的讨论。
(@github)28. “ArrayStoreException”“ArrayStoreException”会发生在向
Java 的数组中转换元素受到转换规则限制而发生中断的时候。例如,这个来自于
JavaScan.com 的这个例子就表现了发生这种问题的程序 (@java_scan):

java.lang.ArrayStoreException,数组存储异常

49.“NumberFormatException”

当应用程序尝试将字符串转换为数字类型,但该数字不是有效的数字字符串时,会出现此Java软件错误消息(@alvinalexander)。

package com.devdaily.javasamples;
public class ConvertStringToNumber {
    public static void main(String[] args) {
        try {
            String s = "FOOBAR";
            int i = Integer.parseInt(s);
            // this line of code will never be reached
            System.out.println("int value = " + i);
        }
        catch (NumberFormatException nfe) {
            nfe.printStackTrace();
        }
    }
}

可能抛出“NumberFormatException”的原因有:

  • 数字中的前导或尾随空格。
  • 标志不在数字前面。
  • 数字有逗号。
  • 本地化可能不会将其分类为有效数字。
  • 数字太大,不适合数字类型。

阅读关于如何在运行Java软件时避免“NumberFormatException”的讨论。(@StackOverflow)。

 /* ............... START ............... */ public class JavaArrayStoreException { public static void main(String...args) { Object[] val = new Integer[4]; val[0] = 5.8; } } /* ............... END ............... */

java.lang.IllegalArgumentException,方法的参数错误

50.“TimeoutException”

当阻塞操作超时时,会出现此Java软件错误消息。

private void queueObject(ComplexDataObject obj) throws TimeoutException, InterruptedException {
    if (!queue.offer(obj, 10, TimeUnit.SECONDS)) {
        TimeoutException ex = new TimeoutException("Timed out waiting for parsed elements to be processed. Aborting.");
        throw ex;
    }
}

阅读此关于如何在运行Java软件时处理“TimeoutException”的讨论。(@StackOverflow)。

输出结果如下:

java.lang.ClassCastException,类型转换异常,当试图将对象强制转换为不是实例的子类时,抛出该异常

结论

到这里就全部完结了!
如果你细细阅读了整篇文章,那么相信现在你应该能处理各种运行时和编译器的错误和异常了。编程愉快!

前面两篇链接:

50个常见的 Java
错误及避免方法(第一部分)

50个常见的 Java
错误及避免方法(第二部分)

Exception in thread "main" java.lang.ArrayStoreException: java.lang.Doubleat ExceptionHandling.JavaArrayStoreException.main(JavaArrayStoreException.java:7)

java.lang.IndexOutOfBoundsException,数组下标越界异常,具体分:java.lang.ArrayIndexOutOfBoundsException、java.lang.StringIndexOutOfBoundsException

数组在被初始化的时候,需要声明允许进入数组的对象的种类。因此数组的每个元素都得是相同类型的对象。可以读一读这里关于如何解决“ArrayStoreException”问题的讨论
(@StackOverflow)29. “Bad Magic
Number”
这个错误消息的意思是网络上的类定义文件可能出问题了。如下是服务器端的错误消息示例(@TSS_dotcom):

java.lang.NullPointerException,空指针异常,调用了未经初始化的对象或者是不存在的对象

Java(TM) Plug-in: Version 1.3.1_01Using JRE version 1.3.1_01 Java HotSpot(TM) Client VMUser home directory = C:Documents and SettingsAnkurProxy Configuration: Manual ConfigurationProxy: 192.168.11.6:80java.lang.ClassFormatError: SalesCalculatorAppletBeanInfo (Bad magic number)at java.lang.ClassLoader.defineClass0(Native Method)at java.lang.ClassLoader.defineClass(Unknown Source)at java.security.SecureClassLoader.defineClass(Unknown Source)at sun.applet.AppletClassLoader.findClass(Unknown Source)at sun.plugin.security.PluginClassLoader.access$201(Unknown Source)at sun.plugin.security.PluginClassLoader$1.run(Unknown Source)at java.security.AccessController.doPrivileged(Native Method)at sun.plugin.security.PluginClassLoader.findClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)at sun.applet.AppletClassLoader.loadClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)at java.beans.Introspector.instantiate(Unknown Source)at java.beans.Introspector.findInformant(Unknown Source)at java.beans.Introspector.(Unknown Source)at java.beans.Introspector.getBeanInfo(Unknown Source)at sun.beans.ole.OleBeanInfo.(Unknown Source)at sun.beans.ole.StubInformation.getStub(Unknown Source)at sun.plugin.ocx.TypeLibManager$1.run(Unknown Source)at java.security.AccessController.doPrivileged(Native Method)at sun.plugin.ocx.TypeLibManager.getTypeLib(Unknown Source)at sun.plugin.ocx.TypeLibManager.getTypeLib(Unknown Source)at sun.plugin.ocx.ActiveXAppletViewer.statusNotification(Native Method)at sun.plugin.ocx.ActiveXAppletViewer.notifyStatus(Unknown Source)at sun.plugin.ocx.ActiveXAppletViewer.showAppletStatus(Unknown Source)at sun.applet.AppletPanel.run(Unknown Source)at java.lang.Thread.run(Unknown Source)

java.lang.NumberFormatException,字符串转换为数字异常

“bad magic
number”错误消息发生时,可能存在如下这些情况:类文件的前四个字节不是十六进制数字
CAFEBABE。类文件是以 ASCII 模式而不是二进制模式上传的。Java
程序是在编译之前运行的。可以读一读这里关于如何找到“bad magic
number”的发生原因的讨论。 (@coderanch)30. “Broken Pipe”
这样的错误消息表示来自于文件或网络套接字的数据流已停止工作或在另一端已经处于关闭状态
(@ExpertsExchange)。

 

Exception in thread "main" java.net.SocketException: Broken pipe at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) at java.net.SocketOutputStream.write(SocketOutputStream.java:115) at java.io.DataOutputStream.write

检查性异常类:

数据管道中断发生的原因一般包括如下这些磁盘的暂存空间已经耗尽。RAM可能被堵塞了。数据流可能已经损坏了。读取管道的进程可能已经关闭了。可以读一读这里这篇关于什么是“broken
pipe”错误的讨论。 (@StackOverflow)31. “Could Not Create Java Virtual
Machine”
当 Java 代码尝试使用错误的参数来启动 Java
时,一般会产生这样的错误消息 (@ghacksnews):

java.io.IOException,IO流异常

Error: Could not create the Java Virtual MachineError: A fatal exception has occurred. Program will exit.

java.lang.ClassNotFoundException,类未找到异常

它通常是由于代码中的声明中或者为其分配适当的内存时有错误而引起的。可以读一读这里关于如何修复“Could
not create Java Virtual Machine”错误的讨论。(@StackOverflow)32. “class
file contains wrong class”
“class file contains wrong
class”问题一般会发生在 Java
代码尝试在错误的目录中寻找类文件的时候,产生类似于如下所示的错误消息:

java.lang.IllegalAccessException,没有访问权限,拒绝访问一个类的时候,抛出该异常

MyTest.java:10: cannot access MyStructbad class file: D:JavatestMyStruct.javafile does not contain class MyStructPlease remove or make sure it appears in the correct subdirectory of the classpath.MyStruct ms = new MyStruct();^

java.lang.NoSuchMethodException,方法不存在异常

要修复此问题,如下提示可以提供一些帮助:确保源文件的名称和类的名称匹配——包括大小写。检查包的说明语句是否正确或者缺失。确保源文件位于正确的目录。可以读一读这里关于如何修复“类文件包含错误类”错误的讨论。
(@StackOverflow)33. “ClassCastException”“ClassCastException”
消息表示 Java 代码正尝试将对象转换到一个错误的类型。在下面这个来自于
Java 概念日有所进的实例中, 运行着这样的程序:

java.lang.NoSuchFiledException,属性不存在异常

package com;class A{ int i = 10;}class B extends A{ int j = 20;}class C extends B{ int k = 30;}public class ClassCastExceptionDemo{ public static void main(String[] args) { A a = new B(); //B type is auto up casted to A type B b = (B) a; //A type is explicitly down casted to B type. C c = (C) b; //Here, you will get class cast exception System.out.println(c.k); }}

java.lang.EOFException,文件已结束异常,当程序在输入的过程中遇到文件或流的结尾时,引发异常

这会导致如下错误:

 

Exception in thread “main” java.lang.ClassCastException: com.B cannot be cast to com.Cat com.ClassCastExceptionDemo.main(ClassCastExceptionDemo.java:23)

Java 代码会创建一个类和子类的层级结构。为了避免 “ClassCastException”
错误,请确保新的类型归属于正确的类或者它的父类。如果使用了泛型的话,这些错误就可以在编译时被捕获到。可以读一读这篇关于如何修复
“ClassCastException” 错误的教程。 (@java_concept)34.
“ClassFormatError”
“ClassFormatError”
消息指代的是一个链接错误,发生在一个类文件不能被读取或者解释为一个类文件的时候。

Caused by: java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/persistence/GenerationTypeat java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClassCond(Unknown Source)at java.lang.ClassLoader.defineClass(Unknown Source)at java.security.SecureClassLoader.defineClass(Unknown Source)at java.net.URLClassLoader.defineClass(Unknown Source)at java.net.URLClassLoader.access$000(Unknown Source)at java.net.URLClassLoader$1.run(Unknown Source)at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)

关于“ClassFormatError”错误为什么会发生,有几种可能:类文件是以 ASCII
模式而不是二进制模式来上传的。网页服务器是以二进制而非 ASCII
来发送类文件的。可能有类路径错误阻止了代码找到类文件。如果类被加载了两次,第二次就会导致这个异常被抛出来。使用了一个老版本的
Java 运行时。可以读一读这里关于什么会引发“ClassFormatError”的讨论。
(@StackOverflow)35. “ClassNotFoundException”“ClassNotFoundException”
只会发生于运行时——意味着本存在于编译时可是在运行时却丢失了。这是一个链接错误。非常类似于
“NoClassDefFoundError”,如下情况就有可能让这样的问题发生:文件不在正确的目录。类的名称必须跟文件的名称保持一致。名称对大小写是敏感的。可以读一读这里关于什么会导致“ClassNotFoundException“发生的讨论,以了解更多情况
(@StackOverflow).36. “ExceptionInInitializerError”这个 Java
问题会在静态初始化有问题时发生 (@GitHub)。当 Java
代码稍后要用到这个类时, 将会发生“NoClassDefFoundError” 错误.

java.lang.ExceptionInInitializerError at org.eclipse.mat.hprof.HprofIndexBuilder.fill(HprofIndexBuilder.java:54) at org.eclipse.mat.parser.internal.SnapshotFactory.parse(SnapshotFactory.java:193) at org.eclipse.mat.parser.internal.SnapshotFactory.openSnapshot(SnapshotFactory.java:106) at com.squareup.leakcanary.HeapAnalyzer.openSnapshot(HeapAnalyzer.java:134) at com.squareup.leakcanary.HeapAnalyzer.checkForLeak(HeapAnalyzer.java:87) at com.squareup.leakcanary.internal.HeapAnalyzerService.onHandleIntent(HeapAnalyzerService.java:56) at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.os.HandlerThread.run(HandlerThread.java:61)Caused by: java.lang.NullPointerException: in == null at java.util.Properties.load(Properties.java:246) at org.eclipse.mat.util.MessageUtil.(MessageUtil.java:28) at org.eclipse.mat.util.MessageUtil.(MessageUtil.java:13) ... 10 more

要修复此问题还需要更多的信息。在代码中使用 getCause()
可以返回导致被返回的错误发生的异常对象。可以读一读这里关于如何跟踪
ExceptionInInitializerError 的发生原因的讨论。 (@StackOverflow)37.
“IllegalBlockSizeException”
“IllegalBlockSizeException”
会发生在解密时消息长度不是8位的倍数的时候。这里有一个来自于
ProgramCreek.com 的例子(@ProgramCreek):

@Overrideprotected byte[] engineWrap(Key key) throws IllegalBlockSizeException, InvalidKeyException { try { byte[] encoded = key.getEncoded(); return engineDoFinal(encoded, 0, encoded.length); } catch (BadPaddingException e) { IllegalBlockSizeException newE = new IllegalBlockSizeException(); newE.initCause(e); throw newE; }}

“IllegalBlockSizeException”
可能由如下状况所导致:使用的加解密算法不一致。被解密的消息在传递过来的途中被截断或者产生了乱码。可以读一读这里关于如何预防
IllegalBlockSizeException 错误发生的讨论(@StackOverflow)38.
“BadPaddingException”
“BadPaddingException”会发生于解密时填充块被用来创建一个可以用
8 位的倍数来计算长度的消息的时候。这里有一个来自于 Stack Overflow
的例子(@StackOverflow):

javax.crypto.BadPaddingException: Given final block not properly paddedat com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)at javax.crypto.Cipher.doFinal(DashoA13*..)

被加密的数据是二进制的,因此不要尝试着在一个字符串中去存储它,或者也有可能是加密期间数据没有进行恰当的填充。可以读一读这里关于如何防止
BadPaddingException 发生的讨论。 (@StackOverflow)39.
“IncompatibleClassChangeError”
“IncompatibleClassChangeError”
是链接错误 LinkageError
的一种形式,会在一个基类在其子类已经编译过了之后发生了概念时发生。这里有一个来自于
How to Do in Java 的例子 (@HowToDoInJava):

Exception in thread "main" java.lang.IncompatibleClassChangeError: Implementing classat java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClass(Unknown Source)at java.security.SecureClassLoader.defineClass(Unknown Source)at java.net.URLClassLoader.defineClass(Unknown Source)at java.net.URLClassLoader.access$000(Unknown Source)at java.net.URLClassLoader$1.run(Unknown Source)at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)at java.lang.ClassLoader.loadClassInternal(Unknown Source)at net.sf.cglib.core.DebuggingClassWriter.toByteArray(DebuggingClassWriter.java:73)at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:26)at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:144)at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:116)at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108)at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104)at net.sf.cglib.proxy.Enhancer.(Enhancer.java:69)

当 “IncompatibleClassChangeError”
发生时,有能发生了如下状况:忘记了在主方法的 static
关键词。一个合法的类被非法地使用。一个类发生了修改,可是还有其它类使用原来的签名来引用它。可以尝试把所有的类文件都删除掉然后全部重新编译。可尝试这些步骤来解决“IncompatibleClassChangeError”问题
(@javacodegeeks)40. “FileNotFoundException”这个 Java
软件错误消息会在指定路径名上的文件不存在是被抛出来。

@Override public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { if (uri.toString().startsWith(FILE_PROVIDER_PREFIX)) { int m = ParcelFileDescriptor.MODE_READ_ONLY; if (mode.equalsIgnoreCase("rw")) m = ParcelFileDescriptor.MODE_READ_WRITE; File f = new File(uri.getPath()); ParcelFileDescriptor pfd = ParcelFileDescriptor.open(f, m); return pfd; } else { throw new FileNotFoundException("Unsupported uri: " + uri.toString()); }}

出来指定路径名上的文件不存在之外,这种问题也有可能意思是存在的文件是不可被访问的。可以读一读这里关于为什么“FileNotFoundException”会被抛出的讨论。(@StackOverflow)41.
“EOFException”
“EOFException”会在输出时不经意抵达了文件的终点或者流的终点时被抛出。这里有一个来自于
JavaBeat 的抛出了一个 EOFException 的应用程序示例:

import java.io.DataInputStream;import java.io.EOFException;import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class ExceptionExample { public void testMethod1() { File file = new File("test.txt"); DataInputStream dataInputStream = null; try { dataInputStream = new DataInputStream(new FileInputStream(file)); while (true) { dataInputStream.readInt(); } } catch (EOFException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (dataInputStream != null) { dataInputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { ExceptionExample instance1 = new ExceptionExample(); instance1.testMethod1(); }}

运行上述程序会导致如下异常:

java.io.EOFExceptionat java.io.DataInputStream.readInt(DataInputStream.java:392)at logging.simple.ExceptionExample.testMethod1(ExceptionExample.java:16)at logging.simple.ExceptionExample.main(ExceptionExample.java:36)

当后面已经没有数据可供输出了,可 DataInputStream
仍在尝试读取流中的数据, “EOFException” 就会被抛出来。它也可以发生于
ObjectInputStream 和 RandomAccessFile
类的逻辑里面。可以读一读这里关于在运行 Java
软件时“EOFException”什么时候会发生的讨论。(@StackOverflow)42.
“UnsupportedEncodingException”
该 Java
软件错误消息会在字符编码不被环境所支持的时候产生 (@Penn)。

public UnsupportedEncodingException()

所使用的 Java
虚拟机不支持某一种给定的字符集是有可能的。可以读一读这里关于如何在运行
Java 软件时处理“UnsupportedEncodingException”的讨论
(@StackOverflow)43. “SocketException”“SocketException”
在创建或者访问套接字的时候有错误发生(@ProgramCreek).

public void init(String contextName, ContextFactory factory) { super.init(contextName, factory); String periodStr = getAttribute(PERIOD_PROPERTY); if (periodStr != null) { int period = 0; try { period = Integer.parseInt(periodStr); } catch (NumberFormatException nfe) {} if (period = 0) { throw new MetricsException("Invalid period: " + periodStr); } setPeriod(period); } metricsServers = Util.parse(getAttribute(SERVERS_PROPERTY), DEFAULT_PORT); unitsTable = getAttributeTable(UNITS_PROPERTY); slopeTable = getAttributeTable(SLOPE_PROPERTY); tmaxTable = getAttributeTable(TMAX_PROPERTY); dmaxTable = getAttributeTable(DMAX_PROPERTY); try { datagramSocket = new DatagramSocket(); } catch (SocketException se) { se.printStackTrace(); }}

该异常一般会在最大连接数因为如下原因而满了的时候被抛出来:已经没有更多的网络端口可以供应该应用程序了。系统没有充足的内存来支持新的连接。可以读一读这里关于在运行
Java 软件时如何解决“SocketException”问题的讨论。(@StackOverflow)44.
“SSLException”
该 Java 软件错误消息会在有跟 SSL
相关的操作失败时发生。如下是一个来自于 Atlassian 的示例(@Atlassian):

com.sun.jersey.api.client.ClientHandlerException: javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty at com.sun.jersey.client.apache.ApacheHttpClientHandler.handle(ApacheHttpClientHandler.java:202) at com.sun.jersey.api.client.Client.handle(Client.java:365) at com.sun.jersey.api.client.WebResource.handle(WebResource.java:556) at com.sun.jersey.api.client.WebResource.get(WebResource.java:178) at com.atlassian.plugins.client.service.product.ProductServiceClientImpl.getProductVersionsAfterVersion(ProductServiceClientImpl.java:82) at com.atlassian.upm.pac.PacClientImpl.getProductUpgrades(PacClientImpl.java:111) at com.atlassian.upm.rest.resources.ProductUpgradesResource.get(ProductUpgradesResource.java:39) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.atlassian.plugins.rest.common.interceptor.impl.DispatchProviderHelper$ResponseOutInvoker$1.invoke(DispatchProviderHelper.java:206) at com.atlassian.plugins.rest.common.interceptor.impl.DispatchProviderHelper$1.intercept(DispatchProviderHelper.java:90) at com.atlassian.plugins.rest.common.interceptor.impl.DefaultMethodInvocation.invoke(DefaultMethodInvocation.java:61) at com.atlassian.plugins.rest.common.expand.interceptor.ExpandInterceptor.intercept(ExpandInterceptor.java:38) at com.atlassian.plugins.rest.common.interceptor.impl.DefaultMethodInvocation.invoke(DefaultMethodInvocation.java:61) at com.atlassian.plugins.rest.common.interceptor.impl.DispatchProviderHelper.invokeMethodWithInterceptors(DispatchProviderHelper.java:98) at com.atlassian.plugins.rest.common.interceptor.impl.DispatchProviderHelper.access$100(DispatchProviderHelper.java:28) at com.atlassian.plugins.rest.common.interceptor.impl.DispatchProviderHelper$ResponseOutInvoker._dispatch(DispatchProviderHelper.java:202) ...Caused by: javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty ...Caused by: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty ...Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

如下情况有可能会导致这样的问题发生:服务器或者客户端上的证书已经过期了。服务器上的端口已经被重设成另外的一个。可以读一读这里关于在
Java 软件中什么会导致“SSLException”
错误发生的讨论。(@StackOverflow)45.
“MissingResourceException”
“MissingResourceException”
会在某个资源丢失时发生。如果资源已经处于正确的类路径之下的话,那就一般是因为一个属性配置文件并没有被恰当的进行了配置。这里有一个示例
(@TIBCO):

java.util.MissingResourceException: Can't find bundle for base name localemsgs_en_US, locale en_USjava.util.ResourceBundle.throwMissingResourceExceptionjava.util.ResourceBundle.getBundleImpljava.util.ResourceBundle.getBundlenet.sf.jasperreports.engine.util.JRResourcesUtil.loadResourceBundlenet.sf.jasperreports.engine.util.JRResourcesUtil.loadResourceBundle

可以读一读这里关于在运行 Java
软件时如何修复“MissingResourceException”问题的讨论。46.
“NoInitialContextException”
“NoInitialContextException”会在 Java
应用程序想要执行命名操作可是不能创建一个链接的时候发生(@TheASF).

[java] Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial[java] at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)[java] at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:247)[java] at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:284)[java] at javax.naming.InitialContext.lookup(InitialContext.java:351)[java] at org.apache.camel.impl.JndiRegistry.lookup(JndiRegistry.java:51)

这会是一个解决起来比较复杂的问题,不过还是有一些可能的问题会导致
“NoInitialContextException”
错误消息的产生:应用程序可能没有正常的证书来建立连接。代码也许没有确认
JNDI 所需要的实现。InitialContext
类可能没有正确的属性来进行配置。可以读一读这里关于在运行 Java
应用程序时“NoInitialContextException”
意味着的是什么的讨论。(@StackOverflow)47.
“NoSuchElementException”
“NoSuchElementException” 会在一个迭代
(比如一个 for 循环)尝试去访问已经没有了的下一个 元素时发生。

public class NoSuchElementExceptionDemo{ public static void main(String args[]) { Hashtable sampleMap = new Hashtable(); Enumeration enumeration = sampleMap.elements(); enumeration.nextElement(); //java.util.NoSuchElementExcepiton here because enumeration is empty }}Output:Exception in thread "main" java.util.NoSuchElementException: Hashtable Enumerator at java.util.Hashtable$EmptyEnumerator.nextElement(Hashtable.java:1084) at test.ExceptionTest.main(NoSuchElementExceptionDemo.java:23)

“NoSuchElementException”
可以被如下这些方法抛出:Enumeration::nextElement()NamingEnumeration::next()StringTokenizer::nextElement()Iterator::next()可以读一读这个关于在
Java 软件中如何修复 “NoSuchElementException”的教程。(@javinpaul)48.
“NoSuchFieldError”
该 Java
软件错误消息会在一个应用程序尝试去访问一个对象中的某个域,可是指定域在类中不复存在时发生
(@sourceforge).

public NoSuchFieldError()

该错误一般会在编译器中被捕获,但如果一个类的定义在编译和运行之间被修改了话,也会被捕获到。可以读一读这里关于在
Java
软件中如何找出是什么导致了“NoSuchFieldError”的讨论。@StackOverflow49.
“NumberFormatException”
该 Java
软件错误消息会在应用程序尝试将一个字符串转换成一个数值类型,
而该数值并非一个有效的数字字符串时发生(@alvinalexander)。

package com.devdaily.javasamples;public class ConvertStringToNumber { public static void main(String[] args) { try { String s = "FOOBAR"; int i = Integer.parseInt(s); // this line of code will never be reached System.out.println("int value = " + i); } catch (NumberFormatException nfe) { nfe.printStackTrace(); } }}

当存在如下状况时 “NumberFormatException”
会被抛出:数值中前面或后面的空格。符号不在数值的前头。数值有逗号。本地化逻辑可能不会将其识别为一个有效的数值。数值太大,给定的数值类型装不下。可以读一读这里关于在运行
Java 软件时如何避免“NumberFormatException”的讨论。(@StackOverflow).50.
“TimeoutException”
该 Java
软件错误消息会在有一个阻塞操作超时的时候发生:

private void queueObject(ComplexDataObject obj) throws TimeoutException, InterruptedException { if (!queue.offer(obj, 10, TimeUnit.SECONDS)) { TimeoutException ex = new TimeoutException("Timed out waiting for parsed elements to be processed. Aborting."); throw ex; }}

可以读一读这里关于在运行 Java 软件时如何处理
“TimeoutException”的讨论。(@StackOverflow).总结统共就这些了!
如果你整日都在学习这些,
就应该可以处理许多的运行时和编译器错误以及异常了。要不要把这两篇文章妥善保存起来或者添加到书签以便能快速地进行回顾,敬随君意。而对付高级一点儿的
Java 开发者工具,不要忘了可以下载《Java 开发者综合指南》哦。引用原文:50
Common Java Errors and How to Avoid Them (Part 2)翻译:leoxu

发表评论

电子邮件地址不会被公开。 必填项已用*标注