前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >常见的 Java 错误及避免方法之第三集(每集10个错误后续持续发布)

常见的 Java 错误及避免方法之第三集(每集10个错误后续持续发布)

作者头像
用户1289394
发布2018-11-05 17:30:29
7230
发布2018-11-05 17:30:29
举报
文章被收录于专栏:Java学习网

21.“ArrayIndexOutOfBoundsException”

这是在代码尝试访问不在值内的数组索引时发生的运行时错误消息。以下代码将触发此异常:

代码语言:javascript
复制
String[] name = {    "tom",    "dick",    "harry"};for (int i = 0; i <= name.length; i++) {
    System.out.print(name[i] + '\n');
}

这是另一个例子(@DukeU)

代码语言:javascript
复制
int[] list = new int[5];list[5] = 33; // illegal index, maximum index is 4

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

查看此关于索引如何触发“ArrayIndexOutOfBoundsException”Java软件错误消息的例子。(@StackOverflow)

22.“StringIndexOutOfBoundsException”

当代码尝试访问不在字符串范围内的字符串的一部分时,就会发生这种问题。通常,这发生在代码尝试创建字符串的子字符串,且长度与参数设置不符之时。下面是一个例子(@javacodegeeks):

代码语言:javascript
复制
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)

23.“NullPointerException”

当程序尝试使用没有赋值的对象引用时,就会出现“NullPointerException”异常。(@geeksforgeeks)

代码语言:javascript
复制
// 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程序经常在以下情况下出现异常:

  • 语句引用一个空值的对象。
  • 尝试访问一个已定义但未分配引用的类。

这里有一个开发人员遇到“NullPointerException”以及如何处理它的讨论。(@StackOverflow)

24.“NoClassDefFoundError”

当解释器找不到包含主方法的类的文件时,将发生“NoClassDefFoundError”异常。来自DZone的示例(@DZone):

如果你编译此程序:

代码语言:javascript
复制
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的消息:

代码语言:javascript
复制
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):

代码语言:javascript
复制
Error: Could not find or load main class wiki.java

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

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

26.“NoSuchProviderException”

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

代码语言:javascript
复制
javax.mail.NoSuchProviderException

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

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

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

27. AccessControlException

AccessControlException表示所请求访问的系统资源,如文件系统或网络是被拒绝的,如本例中的JBossDeveloper(@jbossdeveloper):

代码语言:javascript
复制
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”

当Java数组中转换元素的规则被破坏时,就会发生“ArrayStoreException”异常。对于放到数组中的内容一定要非常小心。(@Roedyg)例如,来自JavaScan.com的这个例子说明此程序(@java_scan):

代码语言:javascript
复制
/* ............... START ............... */
 public class JavaArrayStoreException {     public static void main(String...args) {
         Object[] val = new Integer[4];
         val[0] = 5.8;
     }
 } /* ............... END ............... */

可以产生以下输出:

代码语言:javascript
复制
Exception in thread "main" java.lang.ArrayStoreException: java.lang.Doubleat ExceptionHandling.JavaArrayStoreException.main(JavaArrayStoreException.java:7)

当数组被初始化时,我们需要声明允许进入数组的对象的种类。 每个数组元素都需要成为相同类型的对象。

阅读此关于如何解决“ArrayStoreException”的讨论。(@StackOverflow)

29.“Bad Magic Number”

此Java软件错误消息意味着网络上的类定义文件可能出错了。 以下是来自The Server Side的示例(@TSS_dotcom):

代码语言:javascript
复制
Java(TM) Plug-in: Version 1.3.1_01Using JRE version 1.3.1_01 Java HotSpot(TM) Client VM
User home directory = C:\Documents and Settings\Ankur
Proxy 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)

“bad magic number”错误消息可能发生在以下情况下:

  • 类文件的前四个字节不是十六进制数字CAFEBABE。
  • 类文件以ASCII模式而不是以二进制模式上传。
  • Java程序在编译之前运行。

阅读此关于如何找到“bad magic number”异常原因的讨论。(@coderanch)

30.“Broken Pipe”

此错误消息是指来自文件或网络套接字的数据流已停止工作或从另一端关闭(@ExpertsExchange)。

代码语言:javascript
复制
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可能被堵塞。
  • 数据流可能已损坏。
  • 读取管道的过程可能已经关闭。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习网 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 21.“ArrayIndexOutOfBoundsException”
  • 22.“StringIndexOutOfBoundsException”
  • 23.“NullPointerException”
  • 24.“NoClassDefFoundError”
  • 25.“NoSuchMethodFoundError”
  • 26.“NoSuchProviderException”
  • 27. AccessControlException
  • 28.“ArrayStoreException”
  • 29.“Bad Magic Number”
  • 30.“Broken Pipe”
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档