澳门新浦京8455com30个 Java 开发常见错误及规避技巧

澳门新浦京8455com 2

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

澳门新浦京8455com 1

澳门新浦京8455com 2

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

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

引用原文:50 Common Java Errors and How to Avoid Them (Part
1)作者:Angela
Stringfellow翻译:雁惊寒译者注:本文介绍了20个常见的Java编译器错误,每种错误都包含了代码片段、问题说明,并给出了相关的链接来帮助你快速地理解并解决这些问题。以下是译文。在开发Java软件的时候可能会遇到很多类型的错误,但大多数可以避免。我们精心挑选了20个最常见的Java软件错误,包含了代码示例和教程,以帮助你解决一些常见的编码问题。要获得更多编写Java程序的提示和技巧,你可以下载我们的“Comprehensive
Java Developer’s
Guide”这本书,它里面包含了所有你需要的东西,从各类工具到最佳网站和博客、YouTube频道、Twitter影响者、LinkedIn组、播客、must-attend
events等等。如果你正在使用.NET,你应该阅读我们的50个最常见的.NET软件错误指南,以避免出现这些错误。但是如果你当前遇到的挑战是与Java相关的,那么请阅读下面的文章以了解最常见的问题及其解决方法。编译器错误在编译器运行Java代码的时候会创建编译器错误消息。有一点很重要,编译器可能会因为一个错误抛出多个错误消息。所以修复一个错误,然后重新编译,这样可以解决很多问题。1.
“…
Expected”
当代码中缺少某些东西时,会产生这个错误。通常这是因为缺少一个分号或右括号。

17.“Cannot Return a Value From Method Whose Result Type Is Void”

当一个void方法尝试返回值时,就会发生此Java错误,例如在以下示例中:

public static void move()
{
    System.out.println("What do you want to do?");
    Scanner scan = new Scanner(System.in);
    int userMove = scan.nextInt();
    return userMove;
}
public static void usersMove(String playerName, int gesture)
{
    int userMove = move();
    if (userMove == -1)
    {
        break;
    }

通常,这可以通过更改方法签名匹配返回语句中的类型来修正错误。在这种情况下,void的实例可以改为int:

public static int move()
{
    System.out.println("What do you want to do?");
    Scanner scan = new Scanner(System.in);
    int userMove = scan.nextInt();
    return userMove;
}

阅读关于如何修复“Cannot Return a Value From Method Whose Result Type Is
Void”错误的讨论。(@StackOverflow)

String[] name = { "tom", "dick", "harry"};for (int i = 0; i = name.length; i++) { System.out.print(name[i] + 'n');}
private static double volume(String solidom, double alturam, double areaBasem, double raiom) {double vol; if (solidom.equalsIgnoreCase("esfera"){ vol=(4.0/3)*Math.pi*Math.pow(raiom,3); } else { if (solidom.equalsIgnoreCase("cilindro") { vol=Math.pi*Math.pow(raiom,2)*alturam; } else { vol=(1.0/3)*Math.pi*Math.pow(raiom,2)*alturam; } } return vol;}

18.“Non-Static Variable … Cannot Be Referenced From a Static Context”

当编译器尝试从静态方法(@javinpaul)访问非静态变量时,就会发生此错误:

public class StaticTest {
    private int count=0;
    public static void main(String args[]) throws IOException {
        count++; //compiler error: non-static variable count cannot be referenced from a static context
    }
}

要修复“Non-Static Variable … Cannot Be Referenced From a Static
Context”错误,可以做这两件事:

  • 在签名中声明此变量为静态。
  • 在静态方法中写代码创建非静态对象的实例。

阅读此介绍静态和非静态变量之间区别的教程。(@sitesbay)

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

通常,这种错误消息不会指出产生问题的确切位置。要找出问题所在,需要:确保所有的左括号都有相应的右括号。查看错误所指示的那一行前面的代码。这个错误通常是在后面的代码中才会被编译器发现。有的时候,有些字符不应该位于Java代码的第一个。实例:一个丢失的圆括号引发的错误。2.
“Unclosed String Literal”
当字符串结尾缺少引号时,会产生“unclosed
string literal”错误消息,并且该消息就显示在出错的那一行上。

19.“Non-Static Method … Cannot Be Referenced From a Static Context”

此问题发生在Java代码尝试在非静态类中调用非静态方法的情况下。
例如,以下代码:

class Sample
{
   private int age;
   public void setAge(int a)
   {
      age=a;
   }
   public int getAge()
   {
      return age;
   }
   public static void main(String args[])
   {
       System.out.println("Age is:"+ getAge());
   }
}

将返回错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
Cannot make a static reference to the non-static method getAge() from the type Sample

从静态方法中调用非静态方法就是声明调用非静态方法的类的实例。

阅读此关于非静态方法和静态方法之间区别的阐述。

int[] list = new int[5];list[5] = 33; // illegal index, maximum index is 4
 public abstract class NFLPlayersReference { private static Runningback[] nflplayersreference; private static Quarterback[] players; private static WideReceiver[] nflplayers; public static void main(String args[]){ Runningback r = new Runningback("Thomlinsion"); Quarterback q = new Quarterback("Tom Brady"); WideReceiver w = new WideReceiver("Steve Smith"); NFLPlayersReference[] NFLPlayersReference; Run();// { NFLPlayersReference = new NFLPlayersReference [3]; nflplayersreference[0] = r; players[1] = q; nflplayers[2] = w; for ( int i = 0; i  nflplayersreference.length; i++ ) { System.out.println("My name is " + " nflplayersreference[i].getName()); nflplayersreference[i].run(); nflplayersreference[i].run(); nflplayersreference[i].run(); System.out.println("NFL offensive threats have great running abilities!"); } } private static void Run() { System.out.println("Not yet implemented"); } }

20.“(array) <X> Not Initialized”

当数组被声明但未初始化时,你将得到“(array) <X> Not
Initialized”的消息。数组的长度是固定的,因此每个数组都需要以所需的长度进行初始化。

以下代码就可以接受:

AClass[] array = {object1, object2}

即:

AClass[] array = new AClass[2];
...
array[0] = object1;
array[1] = object2;

而非:

AClass[] array;
...
array = {object1, object2};

阅读此关于如何在Java软件中初始化数组的讨论。(@StackOverflow)

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

通常,这种错误在以下这些情况下会产生:字符串不是以引号结尾。这很容易修改,用指定的引号来结束字符串即可。字符串超出一行。长字符串可以分成多个短串,并用加号连接。作为字符串一部分的引号没有使用反斜杠来进行转义。请阅读这篇文章:未封闭的字符串错误消息。3.
“Illegal Start of an Expression”
出现“Illegal Start of an
Expression”错误的原因有很多。它已经成为不太有用的错误消息之一。一些开发者认为这是由坏的代码味道造成的。通常,创建一个表达式是为了生成一个新值或给其他变量赋值。编译器期望找到一个表达式,但是因为语法不符合预期而找不到表达式。在下面这些代码中可以找到这种错误。

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

数组索引从零开始,结束于小于数组长度的那一个。通常,当定义数组索引的限制时,通过使用“<”而不是“<=”来修复。

查看此关于索引如何触发“ArrayIndexOutOfBoundsException”Java软件错误消息的例子。(@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); }}
} // 把它添加到这里 public void newShape(String shape) { switch (shape) { case "Line": Shape line = new Line(startX, startY, endX, endY); shapes.add(line); break; case "Oval": Shape oval = new Oval(startX, startY, endX, endY); shapes.add(oval); break; case "Rectangle": Shape rectangle = new Rectangle(startX, startY, endX, endY); shapes.add(rectangle); break; default: System.out.println("ERROR. Check logic."); } } } // 从这里删掉它 }

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);
    }
}

和数组索引一样,字符串索引从零开始。在索引字符串的时候,最后一个字符小于字符串的长度。
“StringIndexOutOfBoundsException”Java软件错误消息通常意味着索引正在尝试访问没有包含的字符。

这里有一个说明“StringIndexOutOfBoundsException”如何发生和修复的例子。(@StackOverflow)

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

请阅读这篇文章:如何排除“illegal start of an expression”错误。4.
“Cannot Find
Symbol”
这是一个非常常见的问题,因为Java中的所有标识符都需要在使用之前进行声明。出现这个错误是因为,在编译代码时,编译器不明白该标识符的含义。有很多原因可能会产生“cannot
find
symbol”错误信息:标识符声明时的拼写可能与代码中使用时的拼写不一致。变量从未被声明。未在同一作用域内声明该变量。没有导入类。请阅读这篇文章:关于“cannot
find symbol”错误的讨论。5. “Public Class XXX Should Be in
File”
当XXX类和Java程序文件名不匹配时,就会产生“public class XXX should
be in file”错误消息。 只有当类名和Java文件名相同时,才能编译代码。

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)

// 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"); } }}
package javaapplication3; public class Robot { int xlocation; int ylocation; String name; static int ccount = 0; public Robot(int xxlocation, int yylocation, String nname) { xlocation = xxlocation; ylocation = yylocation; name = nname; ccount++; } } public class JavaApplication1 { public static void main(String[] args) { robot firstRobot = new Robot(34,51,"yossi"); System.out.println("numebr of robots is now " + Robot.ccount); } }

24.“NoClassDefFoundError”

澳门新浦京8455com,当解释器找不到包含主方法的类的文件时,将发生“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)

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

要解决这个问题,可以:把类和文件命名为相同的名字。确保两个名称始终保持一致。请阅读这篇文章:“Public
class XXX should be in file”错误的示例。6. “Incompatible
Types”
“Incompatible
Types”是赋值语句尝试对变量与表达式进行类型匹配时发生的逻辑错误。通常,将字符串赋值给一个整数时会产生这个错误,反之亦然。这不是一个Java语法错误。

25.“NoSuchMethodFoundError”

当Java软件尝试调用类的方法并且该方法不再有定义时,将发生此错误消息(@myUND):

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

当声明中有错字时,通常会出现“NoSuchMethodFoundError”Java软件错误。

阅读此教程以了解如何避免“NoSuchMethodFoundError”的错误消息。(@javacodegeeks)

class A{ // some code}public class B{ public static void main(String[] args) { A a = new A(); }}
test.java:78: error: incompatible typesreturn stringBuilder.toString(); ^required: intfound: String1 error

26.“NoSuchProviderException”

当请求的安全提供程序不可用时,会发生“NoSuchProviderException”异常(@alvinalexander):

javax.mail.NoSuchProviderException

当试图找到为什么发生“NoSuchProviderException”时,请检查:

  • JRE配置。
  • 配置中设置的Java home。
  • 使用哪个Java环境。
  • 安全提供程序条目。

阅读关于在运行Java软件时会导致“NoSuchProviderException”原因的讨论。(@StackOverflow)

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

当编译器抛出“incompatible
types”消息时,确实不太容易解决这个问题:使用类型转换函数。开发人员可能需要修改代码原有的功能。看一下这个例子:将一个字符串赋值给整数会出现“incompatible
types”错误。7. “Invalid Method Declaration; Return Type
Required”
这个错误消息的意思是,在方法声明中未显示地声明方法的返回类型。

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)

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)
public class Circle{ private double radius; public CircleR(double r) { radius = r; } public diameter() { double d = radius * 2; return d; }}

28.“ArrayStoreException”

当Java数组中转换元素的规则被破坏时,就会发生“ArrayStoreException”异常。对于放到数组中的内容一定要非常小心。(@Roedyg)例如,来自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)

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

有这几种情况会触发“invalid method declaration; return type
required”错误:忘记声明类型。如果方法没有返回值,那么需要在方法声明中指定“void”作为返回类型。构造函数不需要声明类型。但是,如果构造函数名称中存在错误,那么编译器会把构造函数看成是没有指定类型的方法。看一个这个例子:构造函数的命名问题触发“invalid
method declaration; return type required“问题。8. “Method in Class
Cannot Be Applied to Given
Types”
这个错误消息比较有用,它的意思是某个方法调用了错误的参数。

29.“Bad Magic Number”

此Java软件错误消息意味着网络上的类定义文件可能出错了。 以下是来自The
Server Side的示例(@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 SettingsAnkur
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)

Error: Could not find or load main class wiki.java
RandomNumbers.java:9: error: method generateNumbers in class RandomNumbers cannot be applied to given types;generateNumbers();required: int[]found:generateNumbers();reason: actual and formal argument lists differ in length

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

出现broken pipe的原因通常有:

  • 耗尽磁盘暂存空间。
  • RAM可能被堵塞。
  • 数据流可能已损坏。
  • 读取管道的过程可能已经关闭。

阅读此关于Java错误“broken
pipe”的讨论。(@StackOverflow)

第二部分完,敬请关注第三部分的内容。

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

在调用方法时,应传入在其声明时定义的那些参数。请检查方法声明和方法的调用,以确保它们是匹配的。这个讨论说明了方法声明和方法调用中参数的不兼容性所导致的Java错误。9.
“Missing Return Statement”
当一个方法缺少return语句时,会触发“Missing
Return
Statement”错误消息。有返回值的方法必须要有一条返回某个值的语句,以便在方法之外调用该值。

javax.mail.NoSuchProviderException
public String[] OpenFile() throws IOException { MapString, Double map = new HashMap(); FileReader fr = new FileReader("money.txt"); BufferedReader br = new BufferedReader(fr); try{ while (br.ready()){ String str = br.readLine(); String[] list = str.split(" "); System.out.println(list); } } catch (IOException e){ System.err.println("Error - IOException!"); }}

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

编译器抛出“missing return
statement”消息有这几个原因:返回语句被错误地省略了。该方法没有返回任何值,但是在方法声明中未声明类型为void。请查看如何解决“missing
return statement”错误这个例子。10. “Possible Loss of
Precision”
当赋值给变量的信息超过了该变量可以承载的上限时,就会触发“Possible
Loss of
Precision”错误。一旦发生这种情况,部分信息将被丢弃。如果这样做没问题的话,那么在代码上应该将变量显式地声明为新的类型。以下情况通常会发生“possible
loss of
precision”错误:尝试将一个实数赋值给整型类型的变量。尝试将一个double数据赋值给整型类型的变量。Java中的基本数据类型解释了不同数据类型的特点。11.
“Reached End of File While
Parsing”
这个错误消息通常在程序缺少右大括号时触发。有时,在代码的末尾增加右大括号可以快速地修复此错误。

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")
public class mod_MyMod extends BaseModpublic String Version(){ return "1.2_02";}public void AddRecipes(CraftingManager recipes){ recipes.addRecipe(new ItemStack(Item.diamond), new Object[] { "#", Character.valueOf('#'), Block.dirt });}

可以读一读这里这篇关于解决“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 ............... */
java:11: reached end of file while parsing }

输出结果如下:

编码工具和适当的代码缩进可以更容易地找到这些不匹配的大括号。请阅读这篇文章:缺少的大括号会触发“reached
end of file while parsing”错误消息。12. “Unreachable
Statement”
当一条语句出现在一个它不可能被执行的地方时,会触发“Unreachable
statement”错误。通常,是在一个break或return语句之后。

Exception in thread "main" java.lang.ArrayStoreException: java.lang.Doubleat ExceptionHandling.JavaArrayStoreException.main(JavaArrayStoreException.java:7)
for(;;){ break; ... // unreachable statement}int i=1;if(i==1) ...else ... // dead code

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

通常,简单地移动return语句即可修复此错误。请阅读这篇文章:如何修复“Unreachable
Statement”错误。13. “Variable Might Not Have Been
Initialized”
在方法中声明的局部变量如果没有初始化,就会发生这种错误。如果在if语句中包含没有初始值的变量时,就会发生这种错误。

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)
int x;if (condition) { x = 5;}System.out.println(x); // x可能尚未初始化

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

请阅读这篇文章:如何避免触发“Variable Might Not Have Been
Initialized”错误。14. “Operator … Cannot be Applied to
当操作符作用于未在其定义范围内的类型时,会出现此问题。

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
operator  cannot be applied to java.lang.Object,java.lang.Object

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

当Java代码尝试在计算中使用字符串类型时,经常会触发这种错误。要修复这个问题,需要将字符串转换为整数或浮点数。请阅读这篇文章:非数字类型为什么会导致Java软件错误。15.
“Inconvertible
Types”
当Java代码尝试执行非法转换时,会发生“Inconvertible Types”错误。

Error: Could not create the Java Virtual MachineError: A fatal exception has occurred. Program will exit.
TypeInvocationConversionTest.java:12: inconvertible typesfound : java.util.ArrayListjava.lang.Class? extends TypeInvocationConversionTest.Interface1required: java.util.ArrayListjava.lang.Class? lessRestrictiveClassList = (ArrayListClass?) classList;

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

^例如,布尔类型不能转换为整形。请阅读这篇文章:如何在Java软件中转换不可转换的类型。16.
“Missing Return Value”
当返回语句包含不正确的类型时,你会收到“Missing
Return Value”消息。例如,查看以下代码:

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();^
public class SavingsAcc2 { private double balance; private double interest; public SavingsAcc2() { balance = 0.0; interest = 6.17; } public SavingsAcc2(double initBalance, double interested) { balance = initBalance; interest = interested; } public SavingsAcc2 deposit(double amount) { balance = balance + amount; return; } public SavingsAcc2 withdraw(double amount) { balance = balance - amount; return; } public SavingsAcc2 addInterest(double interest) { balance = balance * (interest / 100) + balance; return; } public double getBalance() { return balance; }}

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

返回以下错误:

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); }}
SavingsAcc2.java:29: missing return value return; ^ SavingsAcc2.java:35: missing return value return; ^ SavingsAcc2.java:41: missing return value return; ^ 3 errors

这会导致如下错误:

通常,这个错误的出现是因为有某个返回语句没有返回任何东西。请阅读这篇文章:如何避免“Missing
Return Value”错误。17. “Cannot Return a Value From Method Whose Result
Type Is
Void”
当一个void方法尝试返回任何值时,会发生此Java错误,例如在以下代码中:

Exception in thread “main” java.lang.ClassCastException: com.B cannot be cast to com.Cat com.ClassCastExceptionDemo.main(ClassCastExceptionDemo.java:23)
public static void move(){ System.out.println("What do you want to do?"); Scanner scan = new Scanner(System.in); int userMove = scan.nextInt(); return userMove;}public static void usersMove(String playerName, int gesture){ int userMove = move(); if (userMove == -1) { break; }

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

通常,更改方法的返回类型与返回语句中的类型一致,可以解决这个问题。例如,下面的void可以改为int:

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)
public static int move(){ System.out.println("What do you want to do?"); Scanner scan = new Scanner(System.in); int userMove = scan.nextInt(); return userMove;}

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

请阅读这篇文章:如何修复“Cannot Return a Value From Method Whose Result
Type Is Void”错误。18. “Non-Static Variable … Cannot Be Referenced
From a Static
Context”
当编译器尝试在静态方法中访问非静态变量时,会发生此错误:

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
public class StaticTest { private int count=0; public static void main(String args[]) throws IOException { count++; //compiler error: non-static variable count cannot be referenced from a static context }}

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

要解决“Non-Static Variable … Cannot Be Referenced From a Static
Context”这个错误,可以做两件事情:可以将变量声明为静态。可以在静态方法中创建非静态对象的实例。请阅读这个教程:静态和非静态变量之间的区别。19.
“Non-Static Method … Cannot Be Referenced From a Static
Context”
当Java代码尝试在静态类中调用非静态方法时,会发生此问题。例如,以下代码:

@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; }}
class Sample{ private int age; public void setAge(int a) { age=a; } public int getAge() { return age; } public static void main(String args[]) { System.out.println("Age is:"+ getAge()); }}

“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*..)
Exception in thread "main" java.lang.Error: Unresolved compilation problem: Cannot make a static reference to the non-static method getAge() from the type Sample

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

要在静态方法中调用非静态方法,需要是声明一个要调用的非静态方法的类的实例。请阅读这篇文章:非静态方法和静态方法之间的区别。20.
“(array) Not Initialized”
当数组已经声明但未初始化时,你会得到“(array)
Not
Initialized”这样的错误消息。数组的长度是固定的,因此每个数组都需要以所需的长度进行初始化。以下代码是正确的:

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)
AClass[] array = {object1, object2}

当 “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()); }}
AClass[] array = new AClass[2];...array[0] = object1;array[1] = object2;

出来指定路径名上的文件不存在之外,这种问题也有可能意思是存在的文件是不可被访问的。可以读一读这里关于为什么“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(); }}
AClass[] array;...array = {object1, object2};

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

请阅读这篇文章:关于如何在Java中初始化数组。未完待续今天我们讨论了编译器的错误,下次我们将深入讨论各种可能会出现的运行时异常。像本文的结构一样,下次也会包含代码片段、解释,以及相关的链接来帮助你尽快修复代码。

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

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图