阅读更多

3顶
0踩

编程语言

转载新闻 30个 Java 开发常见错误及规避技巧

2017-06-28 16:41 by 副主编 jihong10102006 评论(0) 有24421人浏览
上一篇文章中,我们介绍了20种常见的编译器错误,并就如何避免这些错误做了说明。现在,我们将重点转移(尽管不只是专注于某一块),来探讨一下运行时异常以及导致这些异常的原因。接下来我们将聊聊30种常见的异常和错误,并且告诉你如何在代码中解决这些问题。

21.“ArrayIndexOutOfBoundsException”

这是代码在尝试访问不在数组的索引取值范围内的元素时会显示的运行时错误消息。如下所示的代码会触发此异常:
String[] name = {
    "tom",
    "dick",
    "harry"
};
for (int i = 0; i <= name.length; i++) {
    System.out.print(name[i] + '\n');
}

如下是另外一个例子 (@DukeU):
int[] list = new int[5];
list[5] = 33; // illegal index, maximum index is 4

数组的索引是从零开始的,并且比数组长度小了1。通常,在定义数组索引的限制时,要使用“<”而不是“<=”。

可以看看这个例子,索引是如何触发“ArrayIndexOutOfBoundsException”的。 (@StackOverflow)

22.“StringIndexOutOfBoundsException”

当代码尝试访问字符串中不在字符串范围内的字符串片段时,就会出现此问题。这种情况通常会发生在代码尝试创建一个字符串的子字符串,可是传入的参数值不符合字符串长度限制的时候。如下就是这类问题的一个例子 (@javacodegeeks):
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);
    }
}

像数组的索引一样,字符串的索引是从零开始的。索引字符串时,最后一个字符的索引值比字符串的长度小1。 “StringIndexOutOfBoundsException”这个错误消息一般都意味着索引正在尝试访问不存在于字符串中的字符。

这里有一个说明了“StringIndexOutOfBoundsException”是怎样发生还有如何去修复的例子。(@StackOverflow)

23.“NullPointerException”

当程序尝试使用没有经过赋值的对象引用时,就会发生“NullPointerException”。(@geeksforgeeks).
// A Java program to demonstrate that invoking a method
// on null causes NullPointerException
import 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 程序经常出现如下状况:
  • 语句引用一个值为空的对象。
  • 尝试去访问已经定义但是还没有分配过引用的类。
这里就开发人员可能会在什么时候遇到“NullPointerException”以及如何处理它,进行了讨论。(@StackOverflow)

24.“NoClassDefFoundError”

“NoClassDefFoundError”会发生在解释器找不到在主方法使用到了的类的文件的时候。如下是DZone的示例 (@DZone):
如果你对如下程序执行编译:
class A
{
  // some code
}
public class B
{
    public static void main(String[] args)
    {
        A a = new A();
    }
}

它会生成两个 .class 文件:A.class 和 B.class。删除 A.class 文件并且运行 B.class 文件,就会得到 NoClassDefFoundError 错误消息:
Exception in thread "main" java.lang.NoClassDefFoundError: A
at MainClass.main(MainClass.java:10)
Caused by: java.lang.ClassNotFoundException: A
at 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)

如果存在如下问题,就会发生这样的问题:
  • 该文件不在正确的目录。
  • 类的名称必须与文件的名称相同(不包括文件扩展名),且名称是区分大小写的。

你可以读一读这里关于为什么会在运行 Java 软件时发生“NoClassDefFoundError”的讨论。(@StackOverflow)

25.“NoSuchMethodFoundError”

当 Java 软件尝试调用类的方法而该方法在类里面没有定义时,就会出现这样的错误消息 (@myUND):
Error: Could not find or load main class wiki.java

当声明中有错别字的时候,一般就会出现“NoSuchMethodFoundError”这样的错误。

阅读这里的教程可以了解如何避免 NoSuchMethodFoundError 错误。 (@javacodegeeks)

26. “NoSuchProviderException”

当请求了一个不可用的安全方案提供方(Security Provider)的时候,就会引发“NoSuchProviderException” (@alvinalexander):
javax.mail.NoSuchProviderException

如果你在尝试找出“NoSuchProviderException”为什么会发生的原因,请进行如下检查:
  • JRE 配置。
  • 配置中的 Java 主目录配置。
  • 使用的哪个 Java 环境。
  • 安全方案提供方选项。
你可以读一下这里关于导致“NoSuchProviderException”的原因的讨论。(@StackOverflow)

27. AccessControlException

AccessControlException 表示请求访问的系统资源(比如文件系统或这网络)被拒绝了,例如本例中的 JBossDeveloper (@jbossdeveloper):
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")

可以读一读这里这篇关于解决“AccessControlException”错误的讨论。 (@github)

28. “ArrayStoreException”

“ArrayStoreException”会发生在向 Java 的数组中转换元素受到转换规则限制而发生中断的时候。例如,这个来自于 JavaScan.com 的这个例子就表现了发生这种问题的程序 (@java_scan):
 /* ............... START ............... */

 public class JavaArrayStoreException {

     public static void main(String...args) {
         Object[] val = new Integer[4];
         val[0] = 5.8;
     }

 }
 /* ............... END ............... */

输出结果如下:
Exception in thread "main" java.lang.ArrayStoreException: java.lang.Double
at ExceptionHandling.JavaArrayStoreException.main(JavaArrayStoreException.java:7)

数组在被初始化的时候,需要声明允许进入数组的对象的种类。因此数组的每个元素都得是相同类型的对象。

可以读一读这里关于如何解决“ArrayStoreException”问题的讨论 (@StackOverflow)

29. “Bad Magic Number”

这个错误消息的意思是网络上的类定义文件可能出问题了。如下是服务器端的错误消息示例(@TSS_dotcom):
Java(TM) Plug-in: Version 1.3.1_01
Using JRE version 1.3.1_01 Java HotSpot(TM) Client VM
User home directory = C:\Documents and Settings\Ankur

Proxy Configuration: Manual Configuration

Proxy: 192.168.11.6:80

java.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)

“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):
Error: Could not create the Java Virtual Machine

Error: A fatal exception has occurred. Program will exit.

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

可以读一读这里关于如何修复“Could not create Java Virtual Machine”错误的讨论。(@StackOverflow)

32. “class file contains wrong class”

“class file contains wrong class”问题一般会发生在 Java 代码尝试在错误的目录中寻找类文件的时候,产生类似于如下所示的错误消息:
MyTest.java:10: cannot access MyStruct
bad class file: D:\Java\test\MyStruct.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();
^

要修复此问题,如下提示可以提供一些帮助:
  • 确保源文件的名称和类的名称匹配——包括大小写。
  • 检查包的说明语句是否正确或者缺失。
  • 确保源文件位于正确的目录。
可以读一读这里关于如何修复“类文件包含错误类”错误的讨论。 (@StackOverflow)

33. “ClassCastException”

“ClassCastException” 消息表示 Java 代码正尝试将对象转换到一个错误的类型。在下面这个来自于 Java 概念日有所进(Java Concept of the 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_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/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 模式而不是二进制模式来上传的。
  • 网页服务器是以二进制而非 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):
@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 错误发生的讨论(@StackOverflow)

38. “BadPaddingException”

“BadPaddingException”会发生于解密时填充块被用来创建一个可以用 8 位的倍数来计算长度的消息的时候。这里有一个来自于 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)

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” 发生时,有能发生了如下状况:
  • 忘记了在主方法的 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.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)

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_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”问题的讨论。

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”的讨论。@StackOverflow

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).

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 开发者综合指南》哦。

引用
  • 大小: 199.7 KB
  • 大小: 199.7 KB
来自: oschina
3
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • C# 邮件服务器

    C# 开发的邮件服务器 Features supports pop3 smtp imap etc. supports ssl/tls for pop3, smtp and imap. supports multi mail vitural server, can bind multi domains. supports run as windows service, winform application with or without tray icon control. supports remote management using mailservermanager.exe supports mail recycle bin supports plugins using api interfaces Build and release download source code or use the releases i provided. if from source code you should run afterbuild.bat after build the solution successfuly then you get the debug or release version from application folder. Installation run MailServerLauncher.exe to install as windows service or just run as desktop application with or without tray icon. Configuration run MailServerManager.exe at the machine runs mailserver service or app. Connect to server press connect button from menu. type server localhost or 127.0.0.1 or leave it empty type username Administrator with case sensitive type password emtpy press ok to connect with saving or not Add virtual server type name and select storage api [your vitural server]>system>general, add dns servers for query mailto's domain mx record. [your vitural server]>system>services, enable smtp and pop3 services and set ipaddress binding with or without ssl/tls. the host name is required when set bindings. eg. bind smtp service to smtp.[your.domain] + IPAddress.Any [your vitural server]>system>service>relay, 'send email using DNS' and set at least a local ipaddress binding for email sending. the name of the binding here only a name,not mean domain. [your vitural server]>system>logging, enable logging for all services when something error you can see the details from 'Logs and Events' node [your vitural server]>domains, set email host domain, eg. if your email will be xyz@abc.com then the domain should be abc.domain, description is optional [your vitural server]>security, !!! important, add rules for your service to allow outside access like email client. eg. add a rule 'Smtp Allow All' for smtp service with ip allows between 0.0.0.0 to 255.255.255.255 to enable smtp service for outside access add 'Pop3 Allow All' and 'Rlay Allow All' like that too. [your vitural server]>filters, there are two types of filter named 'DnsBlackList' and 'VirusScan' its configurable by run it's executable from mail server install path. Domain name resolution Add smtp.[your.domain], pop3.[your.domain], imap.[your.domain] resolution to your server public ip address with A record or to your server domain with CNAME record. mx record is optional if [your.domain] has a A record.if not, you shoud add a mx record point to your server ip. Remote management to enable remote management you must add ACL to allow mail server managers connect from outside network. use MailServerAccessManager.exe to add management users or just use administrator. add rules to allow access from specific IPs or ip ranges The users here only for management cases.

  • ASP.NET:邮件服务器与客户端

    目录: 一、概述 二、MX设置 三、使用系统的SMTP功能发邮件 四、使用hMailServer收发邮件 五、Web邮件客户端 一、概述 首先必须清楚SMTP才是提供邮件服务器的核心,收发邮件全靠SMTP。不信你关掉hMailServer的POP3和IMAP,服务器照样可以收发邮件。POP3和IMAP只是邮件服务器实现的用于提供邮件客户端收取和管理邮件的两种协议,其中POP3协议只能...

  • 详解asp.net邮件收发系统

    详解asp.net邮件收发系统 通过邮件客户端,不需要登录邮箱网站我们就能直接收发邮件。 1 系统分析 邮件收发是各个网站几乎必备的功能,在用户注册、邮箱确认、邮箱客服、找回密码等环节有典型应用。但是在上述例子中,基本都是用的邮件发送的功能,而邮件接收并管理的功能应用的相对较少。而且.NET 平台目前内置的完善的邮件接收的方法还是个空白。 使用一个邮箱服务器挂靠在Live.com上,域名为shuiqu.com的邮箱,实现邮件的收发。 1.1.1 系统目标 本系统需要实现的目标有以下5点。 ⑴ 实现邮件发

  • 开源.NET邮件服务器

    LumiSoft Mail Server是一个开源,免费的邮件服务器,能运行在.net/mono上,支持SMTP/POP3/IMAP4/WebMail,支持MS Sql Server/PostgreSql/Xml等数据存储方式.很适合中小型企业使用,稳定性和兼容性上都没什么问题。 1、基于Microsoft .Net2.0平台,系统更加稳定。2、提供可扩展的接口. 可以与应用无缝

  • C#毕业设计——基于C#+asp.net+cs的Web Mail邮件收发系统设计与实现(毕业论文+程序源码)——邮件收发系统

    大家好,今天给大家介绍基于C#+asp.net+cs的Web Mail邮件收发系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。文章目录: 项目难度:中等难度 适用场景:相关题目的毕业设计 配套论文字数:8808个字20页 包含内容:整套源码+完整毕业论文 资源文件目录简图如下: 提示:以下为毕业论文的简略介绍,项目源码及完整毕业论文下载地址见文末。引言 省略因此,本设计在脚本中调用.NET框架中System.Web.Mail命名空间,结合HTML完成邮件发送的开发与设计实现。1.1 选题意义

  • .NET的几种开源的邮件组件,你用过那种?

    .NET Core的邮件组件你用过哪些呢?MailKit吗?其实还有。下面是收集github中开源的邮件组件,感兴趣的童鞋可以点击链接去看看详细使用说明。1、FluentEmail:电子邮件发送库。FluentEmail是一款在GitHub上开源免费的支持.Net和.Net Core邮件发送组件,有两个接口“FluentEmail.Core和FluentEmail.Smtp”,第一个是...

  • ASP.NET MVC 5之邮件服务器与客户端

    一、概述 首先必须清楚SMTP才是提供邮件服务器的核心,收发邮件全靠SMTP。不信你关掉hMailServer的POP3和IMAP,服务器照样可以收发邮件。POP3和IMAP只是邮件服务器实现的用于提供邮件客户端收取和管理邮件的两种协议,其中POP3协议只能收取服务器上的邮件,而IMAP协议可供客户端管理服务器上的邮件。目前几乎所有的第三方服务器的SMTP都限制了发送配额等各种限制,并且几乎所有的邮件服务器都会检测发送方的域名和IP是否匹配。简单说就是别用第三方的进行测试,也别用自建的locahost发邮件测试,到底怎么测试呢?在非服务器环境下的邮件发送测试,有3种方案: (1)模拟邮件的发送

  • 创建基于MailKit和MimeKit的.NET基础邮件服务

    邮件服务是一般的系统都会拥有和需要的功能,但是对于.NET项目来说,邮件服务的创建和使用会较为的麻烦。.NET对于邮件功能提供了System.Net.Mail用于创建邮件服务,该基础服务提供邮件的基础操作,并且使用也较为的简单。对于真正将该功能使用于项目的人,就会慢慢发现其中的优缺点,甚至有些时候不能忍受其中的问题。在这里介绍一种微软用于替代System.Net.Mail的...

  • net core邮件服务器,C#发送电子邮件(SMTP)及outlook.com账号之概要

    这是关于c#发送电子邮件(SMTP)的技术笔记,以”简报“形式呈现。因为最后成功通过outlook.com发送了邮件,所以,我觉得还是有必要记录一下其中的要点。一、技术核心.net Framework提供的两个类:SmtpClient和MailAddress前者负责连接到服务器并且发送邮件,后者构成邮件的内容。详细请参考:二、多个接收人观察网易邮箱,多个接收人使用的是分号(【,】)分割,但是直...

  • smtp4dev-用于开发和测试的假smtp电子邮件服务器-.NET开发

    适用于Windows,Linux,Mac OS-X(以及可能提供.NET Core的其他地方)的虚拟SMTP服务器。 使您可以测试应用程序,而不会向实际客户发送垃圾邮件,而无需使用特殊配置来设置复杂的真实电子邮件服务器。 smtp4dev-用于开发和测试的伪造的SMTP电子邮件服务器。 适用于Windows,Linux,Mac OS-X(以及可能提供.NET Core的其他地方)的虚拟SMTP服务器。 使您可以测试应用程序,而不会向实际客户发送垃圾邮件,而无需使用特殊配置来设置复杂的真实电子邮件服务器。 可以查看和检查smtp4dev中收到的消息。 如果您正在寻找旧的Windows GUI v2版本。 在这里抓住它。 如果您发现smtp4dev有用,请注意

  • C#邮件服务器MailServer(源程序)

    我的商业源程序论坛:www.bzcode.net C#邮件服务器MailServer(源程序) 包含:MailServer,Net,NetHelp,UI 采用C#开发 呵,不得多见的哟

  • 搭建邮件服务器,过程非常简单

    搭建邮件服务器,过程非常简单,只需几个步骤即可。通常在Linux搭建邮件服务器是需要安装很多软件和配置文件的,所以我们可以使用一个开源邮件服务器软件来搭建的。

  • asp.net 邮件服务器,用asp.net设计高效邮件列表_邮件服务器

    <%@ Page Language=”VB” Debug=”True” Explicit=”True”%><%@ Import Namespace=”System.Data” %><%@ Import Namespace=”System.Data.OleDb” %><%@ Import Namespace=”System.Web.Mail” %><%@ Import Namespace=”Syst...

  • 如何搭建属于自己的邮件服务器

    申请了属于自己的域名,并且建立了网站,如果您还在您的网站上留下的联系email地址是QQ邮箱或者163以及其它的邮箱地址,这对你网站品牌是多么不好的影响啊,因此您需要搭建一个属于自己的邮件服务器,有了属于自己的邮件服务器后,可以有很多用处,用途举例如下: 别人在您网站注册会员时,发送邮件验证 电子邮件推广,国外还是很流行通过email营销(有被标记为垃圾邮件风险) 您可以随时增加邮箱地址,用...

  • .net程序通过SSL加密服务器发送邮件,

    一、先判断本地网路是否可以登录网页版邮件,这是大前提,可能邮箱服务器有网络限制或者是公司网络有屏蔽。如果ping不通别着急,可能邮箱服务器禁ping 二、网络没问题后就用程序发邮件,看下代码,普通非SSL和安全加密就差一个api //创建邮件对象        MailMessage MyMail = mail;  //是否Html格式邮件 MyMail.IsBodyHtml = true...

Global site tag (gtag.js) - Google Analytics