图片 2

50个常见的 Java 错误及避免方法

本文由码农网 –
小峰原创翻译,转发请看清文末的转发必要,迎接出席大家的付费投稿布置!

本文由码农网 –
小峰原创翻译,转载请看清文末的转发供给,迎接参加我们的付费投稿安插!

Java习感觉常错误列表,java不可胜言错误

Java多如牛毛错误列表:

  • 找不到符号(symbol)

  • 类X是public的,应该被声称在名字为X.java的文本中

  • 缺点和失误类、接口或枚举类型

  • 缺失X

  • 缺失标志符

  • 不法的表明式初步

  • 品种不相称

  • 私下的不二法门表明;供给回到类型

  • 数组越界(java.lang.ArrayIndexOutOfBoundsException卡塔尔(قطر‎

  • 字符越界(java.lang.StringIndexOutOfBoundsException卡塔尔(قطر‎

  • 类Y中的方法X参数不包容

  • 缺少return语句

  • 精度损失

  • 在分条析理时达到了文本结尾

  • 实施不到的言辞

  • 变量没被初叶化

在付出Java软件时大概会越过海重机厂重品种的不当,但许多是能够制止的。为此大家罗列了肆拾多少个最遍布的Java编码错误,个中含有代码示例和学科,以赞助大家化解广大的编码难题。

接上文肆19个不可胜数的 Java
错误及制止方法(第一部分)

1. 找不到符号(symbol)

当你在代码中援用八个还未阐明的变量时相似会报这几个错误。考虑上面包车型大巴例子:

1 2 3 4 5 6 7 8 9 10 public class Test { public static void main(String[] args) { int a = 3; int b = 4; int c = 20;   average = (a + b + c)/5.0; System.out.println(average); } }
1 2 3 4 5 1 error found: File: Test.java <hr> Error: Test.java:7: cannot find symbol symbol : variable average location: class Test

在地点的例证中,变量average未有被声称——也等于说你必要报告编写翻译器average的门类是何许,比方:

1 double average = (a + b + c)/5.0;

别的,当你在代码中引用四个办法但从没在措施名后加上括号时也会报那个指鹿为马,加上括号用以注解援引的是个函数,纵然当函数未有参数时也不可能省略括号。比方:

1 2 3 4 5 6 7 8 9 public class Test { public static void main(String[] args) { my_method; }   public static void my_method() { System.out.println("Hello, world!"); } }
1 2 3 4 5 1 error found: File: Test.java <hr> Error: Test.java:7: cannot find symbol symbol : variable my_method location: class Test

在上边的事例中,编写翻译器在main方法中搜索名字为my_method的变量,实际上,你是想调用二个称呼my_method的方法:

1 2 3 4 5 6 7 8 9 public class Test { public static void main(String[] args) { my_method(); }   public static void my_method() { System.out.println("Hello, world!"); } }

其三种状态,纵然你忘记导入你所接收的包时也会冒出那几个混淆是非。举例,构思上边那个从客户这里读入多个平头的例子:

1 2 3 4 5 6 public class Test { public static void main(String[] args) { Scanner console = new Scanner(System.in); int n = console.nextInt(); } }
1 2 3 4 5 6 7 8 9 2 errors found: File: Test.java <hr> Error: cannot find symbol symbol: class Scanner location: class Test File: Test.java <hr> Error: cannot find symbol symbol: class Scanner location: class Test

这里的标题是前后相继必得导入java.util.Scanner(也许java.util.)。不然,编写翻译器不清楚Scanner是何等类型。当您在管理公事的输入/输出时,就算忘记导入java.util.Arrays大概java.io.,也会遭受那几个错误。

1 2 3 4 5 6 7 import java.util.*; // or --> import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner console = new Scanner(System.in); int n = console.nextInt(); } }

最后,当我们在行使大小敏感的变量名时也会遇见那么些荒谬。Java中负有的标记符(identifiers)都以分别朗朗上口写的。那就象征,若是大家注脚了
三个名字为average的变量,然后在后面用Average引用它时,编译器就可以报找不到Average这么些变量的怪诞。

编写翻译器错误

当Java软件代码通过编写翻译器运转时,会创设编写翻译器错误消息。谨记编写翻译器也许会指向叁个荒诞抛出过多荒诞音信。所以得修复第一个谬误并再度编译。那样做可以解决广大标题。

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)

2. 类X是public的,应该被声称在名字为X.java的文件中

在三个Java程序中,若是类名与公事名不相配时会报这几个错。譬喻,上边那些Foo.java程序:

1 2 3 4 5 public class Bar { public static void main(String[] args) { System.out.println("Hello, world!"); } }
1 2 3 1 error found: File: Foo.java <hr> Error: class Bar is public, should be declared in a file named Bar.java

鉴于Foo与Bar不相配,这段代码会编写翻译退步。改进这一个混淆视听,大家既可以够改进类名,也能够校订文件名。

1.“…Expected”

今世码中缺乏有个别事物时,会发生此错误。经常是因为缺少分号或右括号。

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

普通,此错误音讯不会精确分明难题的适用地方。为了找到错误:

  • 管教全数的左括号都有二个心领神悟的右括号。
  • 在查看提示的Java代码行此前附带看看行。此Java软件错误未有被编写翻译器注意到,直到在代码中越来越深档期的顺序地查看。
  • 一时三个字符,如三个左括号,并不应当放在Java代码的本来地方。所以开垦人士未有放置八个右括号来平衡括号。

点击查阅有关错误的圆括号会怎么着形成错误(@StackOverflow)的演示。

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)

3. 缺点和失误类、接口或枚举类型

那几个错误是一种与大括号有关的错误,日常的话,那几个不分青红皂白发生在前后相继最终有太多大括号时;举个例子:

1 2 3 4 5 6 public class Test { public static void main(String[] args) { System.out.println("Hello!"); } } }
1 2 3 1 error found: File: Test.java <hr> Error: class, interface, or enum expected


种找寻这种不当的形式是未可厚非的缩进代码(因为这种错误总是与大括号有关)。大家得以在Dr.java中按组合键CT宝马X5L-A(去选中这么些程序),然后按
TAB键(来不易地削减代码)。在大家地点的实例代码中,程序的末梢有多个大括号,那在叁个官方的次序中是不容许现身的。由此,大家无非去掉三个大括号就可以让程序准确的编写翻译。

1 2 3 4 5 public class Test { public static void main(String[] args) { System.out.println("Hello!"); } }

2.“Unclosed String Literal”

设若字符串文字结束时髦未引号的话,会创立“Unclosed String
Literal”的大谬不然新闻,並且新闻将呈现在与谬误相同的行上。(@DreamInCode)Literal是值的源代码。

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

司空见惯。这种情况发生在:

  • 字符串文字不以引号结尾。那非常轻巧修改,加上所需的引号,闭合字符串文字就能够。
  • 字符串文字扩大超过一行。长字符串文字能够分解成字符串文字,并累积加号(“+”)。
  • 用作字符串文字部分的引号不通过反斜杠(“”)进行转义。

点击阅读有关Java软件错误音信Unclosed String
Literal的座谈。(@Quora)

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

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

开卷此有关非静态方法和静态方法之间分歧的阐述。

4. 缺失X

当编写翻译器检查到代码中缺点和失误字符时会现身”缺点和失误X”这种样式的失实,错误音信会告知您在哪行缺点和失误了哪些字符,考虑下边包车型大巴程序:

1 2 3 4 5 6 7 8 9 public class Test public static void main(String[] args) { my_method(); }   public static void my_method() { System.out.println("Hello, world!") } }
1 2 3 4 5 2 errors found: File: Test.java <hr> Error: Test.java:1: '{' expected File:.java <hr> Error: Test.java:7: ';' expected

其一错误消息告诉您在第1行缺失了七个大括号,在第7行缺点和失误了叁个分集团。消除这种错误非常轻便——只需把缺点和失误的字符在科学的职位上补上就可以。

1 2 3 4 5 6 7 8 9 public class Test { public static void main(String[] args) { my_method(); }   public static void my_method() { System.out.println("Hello, world!"); } }

3.“Illegal Start of an Expression”

并发“Illegal Start of an
Expression”错误的缘由有那多少个。因而名列不太灵光的荒谬消息之一。有个别开荒者以致认为这是由坏的代码造成的。

平常,创造表达式是为着转换新的值或为变量分配值。编写翻译器期待找到表达式,但因为语法不切合预期而找不到表明式。(@StackOverflow)在此些语句中就能够开掘此错误。

} // ADD IT HERE
       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.");
        }
        }
    } // REMOVE IT FROM HERE
    }

点击浏览有关什么清除“Illegal Start of an
Expression”错误的座谈。(@StackOverflow)

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)

5. 缺点和失误标志符

当把代码写在了点子外时会冒出那个荒谬;这种似是而特别常也是由大括号引起的。构思上面包车型大巴事例:

1 2 3 4 5 6 7 public class Test { System.out.println("Hello!");   public static void main(String[] args) { System.out.println("World!"); } }
1 2 3 4 5 2 errors found: File: Test.java <hr> Error: <identifier> expected File: Test.java <hr> Error: illegal start of type

在此种景色下,很显著第三个打字与印刷语句应该献身main方法里面,那样技巧经过编写翻译。然则,当大家的程序中有多于三个措施何况大括号也不相称时,这种“缺点和失误标志符”的错误就不便于被开采了:

1 2 3 4 5 6 public class Test { public static void main(String[] args) { System.out.println("Hello!");} System.out.println("World!"); } }
1 2 3 4 5 6 7 3 errors found: File: Test.java <hr> Error: <identifier> expected File: Test.java <hr> Error: illegal start of type File: Test.java <hr> Error: class, interface, or enum expected

在下边包车型客车代码中多了一个大括号,但是因为代码未有科学的缩进,所以很难搜索那些指鹿为马。那样使得main方法在打字与印刷“hello”语句后就终止了,那样打字与印刷“world”的口舌就产生方法以外的代码了。改进那一个错误的措施丰盛简单易行——只需求把第三行的大括号删除就能够了:

1 2 3 4 5 6 public class Test { public static void main(String[] args) { System.out.println("Hello!"); System.out.println("World!"); } }

4.“Cannot Find Symbol”

那是三个那些普及的难点,因为Java中的全数标志符都需求在被选取以前行行宣示。
爆发错误的来由在于编写翻译代码时,编写翻译器不明了标志符的意义。

图片 1

也许选拔“Cannot Find Symbol”音讯的缘故有为数不少:

  • 标记符注明时的拼写大概与在代码中动用时的拼写分裂。
  • 变量从未被声称。
  • 变量使用时与评释未在同等范围内。
  • 类未有导入。

点击阅读有关“Cannot Find
Symbol”错误的详细座谈以致产生此难点的代码示例。(@StackOverflow)

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)

6. 野鸡的表明式开首

当编译器蒙受一条不合规的言辞时会报“不合法的表明式初步”这种张冠李戴。思考上边包车型客车例证:

1 2 3 4 5 6 7 8 9 public class Test { public static void main(String[] args) { my_method();     public static void my_method() { System.out.println("Hello, world!"); } }
1 2 3 4 5 6 7 8 9 10 11 5 errors found: File: Test.java <hr> Error: Test.java:6: illegal start of expression File: Test.java <hr> Error: Test.java:6: illegal start of expression File: Test.java <hr> Error: Test.java:6: ';' expected File: Test.java <hr> Error: Test.java:6: ';' expected File: Test.java <hr> Error: Test.java:9: reached end of file while parsing

此地,缺乏了一个闭馆main方法大括号。由于main方法没有被关门,编写翻译器把调用my_method方法之后的代码也当做main方法的一片段。不过,前面包车型大巴代码是public
static void my_method(State of Qatar {,很断定,那在多个措施内违规。

“非法的表达式开首”这种错误比不上大家地方提到的“××缺点和失误”这种音信有赞助。对于这种是非混淆(以至许多其余部分错误),极其常有不能缺少检查一下出错代码后边的那几
行。对于地点十三分例子,大家只供给在编写翻译器报错的那行前边加上海大学括号关闭main方法即可了。重新编译,全数的谬误都扫除了。

1 2 3 4 5 6 7 8 9 public class Test { public static void main(String[] args) { my_method(); }   public static void my_method() { System.out.println("Hello, world!"); } }

5.“Public Class XXX Should Be in File”

当XXX类和Java程序文件名不匹配时,会发生“Public Class XXX Should Be in
File”新闻。唯有当类和Java文件一律时,代码才会被编译。(@coderanch):

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

为赶尽杀绝这一个主题材料:

  • 类和文件命名相通。
  • 保证两名号的景况亦然。

点击查阅“Public Class XXX Should Be in
File”错误的示范。(@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);
    }
}

和数组索引同样,字符串索引从零开首。在索引字符串的时候,最后三个字符小于字符串的长短。
“StringIndexOutOfBoundsException”Java软件错误信息日常意味着索引正在品尝访谈尚未包蕴的字符。

此地有叁个证实“StringIndexOutOfBoundsException”怎么样产生和修复的例证。(@StackOverflow)

7. 门类不相配


你的次第在管理项目相关的难点时会报那几个错。大家得以对有个别类型实行互相转变,比方,你能够轻易把一个char类型转为int类型,反之亦然;你也能够通
过发展转型把八个double类型转为int类型。可是,你不能把基本类型与像String那样的靶子开展相互转变。比如:

1 2 3 4 5 public class Test { public static void main(String[] args) { int num = "Hello, world!"; } }
1 2 3 4 5 1 error found: File: Test.java <hr> Error: Test.java:3: incompatible types found : java.lang.String required: int

诚如的话,你不可能像化解别的一些破绽相当多相符废除这种错误。那不是一种语法错误,而是一种有关项目的逻辑错误。把二个String类型转为int类型日常的话都是一点意义都未有。然而,在局地选取中,你也许需求把String类型转为int类型,比方,当以此字符串代码一个数字时:

1 2 3 4 5 public class Test { public static void main(String[] args) { int num = "500"; } }
1 2 3 4 5 1 error found: File: Test.java <hr> Error: Test.java:3: incompatible types found : java.lang.String required: int

消除这种错误日常接受那样的法子:依赖于Java中像Integer那样的类,那个基本类型的卷入类中有能选用字符串类型的参数的主意,那样就把字符串类型转为整型了:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public class Test { public static void main(String[] args) { int num = Integer.parseInt(&quot;500&quot;); } } ``` 但是,这种解决“类型不兼容”错误的方案是一种例外,不是什么规则,因为这种错误一般来自于逻辑上的错误。   <a name="invalid-method"/></a> ### 8. 非法的方法声明;需要返回类型   在Java中的每个方法都要求明确的声明返回类型,即使这个方法什么也不返回,也要用void进行标识,就像main方法那样。   当一个方法没有声明返回类型时,会出现这种错误: &lt;pre class=&quot;brush: java; gutter: true; first-line: 1; highlight: []; html-script: false&quot;&gt; public class Test { public static void main(String[] args) { int x = getValue(); System.out.println(x); }   public static getValue() { return 10; } }
1 2 3 1 error found: File: Test.java <hr> Error: Test.java:7: invalid method declaration; return type required

消除这种主题材料,在措施证明处加上适合的量的归来类型就能够:

1 2 3 4 5 6 7 8 9 10 public class Test { public static void main(String[] args) { int x = getValue(); System.out.println(x); }   public static int getValue() { return 10; } }

6.“Incompatible Types”

“Incompatible
Types”是钦命语句尝试将变量与项目表明式配成对时产生的逻辑错误。
平常会在代码尝试将文本字符串放入到整型中时现身,反之亦然。那并不是Java语法错误。(@StackOverflow)

test.java:78: error: incompatible types
return stringBuilder.toString();
                             ^
required: int
found:    String
1 error

当编写翻译器给出“Incompatible Types”消息时,就不是简轻巧单修补能够征服的了:

  • 有能够调换类型的函数。
  • 开采职员也许需求改变代码预期的功用。

查看此例子,里面表明了怎么着试着将二个字符串分配给二个子弹头,出现“Incompatible
Types”新闻。(@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)

9. 数组越界(java.lang.ArrayIndexOutOfBoundsException卡塔尔国

当你利用违法的目录访问数组时会报数组越界这种是非颠倒,数组arr的合法错误范围是[0,
arr.length-1];当您探访那之外的目录时会报这些错。举例:

1 2 3 4 5 6 7 8 public class Test { public static void main(String[] args) { int[] arr = {1, 2, 3}; for (int i = 0; i <= arr.length; i++) { System.out.println(arr[i]); } } }
1 2 3 4 5 6 7 java.lang.ArrayIndexOutOfBoundsException: 3 at Test.main(Test.java:5) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)

这种不当很像大家上面就要说的字符串索引越界,这种混淆是非的错误新闻尾巴部分与错误极小相关。可是,第1行就告知大家错误的自始至终的经过是数组越界了,在大家地点的事例,违规的索引值是3,上面一行的错误音讯告诉你错误发生在Test类的第5行上,在main方法之内。

在上边的事例中,因为大家循环过多引致现身那几个荒谬,循环索引i最大可感到4,而4超过了数组的长度,因而越界了。相反,i的上界应该使用<也许一模二样效果的语句来节制。

1 2 3 4 5 6 7 8 public class Test { public static void main(String[] args) { int[] arr = {1, 2, 3}; for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }

当管理数组越界时,打字与印刷出遍历数组的目录十一分有扶助,那样大家就能够追踪代码找到为什么索引达到了三个野鸡的值。

7.“Invalid Method Declaration; Return Type Required”

此Java软件错误音信表示方法签字中未明朗宣示方法的回来类型。

public class Circle
{
    private double radius;
    public CircleR(double r)
    {
        radius = r;
    }
    public diameter()
    {
       double d = radius * 2;
       return d;
    }
}

有多数路径会触发“Invalid Method Declaration; Return Type Required”
错误:

  • 记不清注脚类型
  • 万一方式没有再次回到值,那么必要将“void”注脚为艺术具名中的类型。
  • 构造函数名称无需注明类型。
    然则,要是构造函数名称中存在错误,那么编写翻译器将会把构造函数视为未有一点点名项指标章程。

查阅此表达布局函数命名怎么样触发“Invalid Method Declaration; Return Type
Required”
难题的例证。(@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)

10. 字符串索引越界(java.lang.StringIndexOutOfBoundsException卡塔尔国

当您在前后相继中去访谈多少个字符串的地下索引时会报字符串索引越界那一个荒唐。一个String的官方索引范围是[0,str.leng()-1];当您探问那之外的目录时会报那么些错。举例:

1 2 3 4 5 6 7 8 9 public class Test { public static void main(String[] args) { String str = "Hello, world!";   String a = str.substring(-1, 3); String b = str.charAt(str.length()); String c = str.substring(0, 20); } }
1 2 3 4 5 6 7 8 java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.substring(Unknown Source) at Test.main(Test.java:5) 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 edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:271)


种错误的错误音讯尾部与不当高昂尼克斯锁。不过,第1行就证实了不当的地点是字符串的目录,在大家那些事例,不合规的目录是-1,上面一行错误音信告诉我们那几个错误是在实行substring方法时抛出的,发生错误的职位是Test类的第5行。这种与谬误相关的顺序轨迹告诉大家先后是在调用哪个形式时出的
错,那样我们就能够跟踪代码,并最后改正它。

值得注意的是,下边程序中的a,b,c都会抛出这种不当,但是程序在碰着第一个错误时就被迫结束了。

那不是编写翻译时的错误,而是运转时的失实。换句话说,编写翻译器能科学编写翻译这段程序因为它只是在逻辑上有错,其它,在程序运转以前,大家也无助预料是或不是会有错误发生。消除这种不当,大家要求改进程序的逻辑来保管未有地点访谈不合法的目录。

8.“Method <X> in Class <Y> Cannot Be Applied to Given Types”

此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

调用的方式期望艺术评释中定义的一点参数。检查措施申明并紧凑调用,以保证它们是分外的。

查看此讨论,里面表达了Java软件错误新闻怎么着辨别在章程注脚和艺术调用中由参数成立的不宽容性。(@StackOverflow)

25.“NoSuchMethodFoundError”

当Java软件尝试调用类的办法並且该措施不再有定义时,将生出此错误音讯(@myUND):

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

当评释中有错字时,通常会冒出“NoSuchMethodFoundError”Java软件错误。

开卷此教程以明白何以制止“NoSuchMethodFoundError”的不当信息。(@javacodegeeks)

11. 类Y中的方法X参数不相配

当你在调用函数时参数数量或相继不对时会报那么些指皁为白。举例,思索上边的次序:

1 2 3 4 5 6 7 8 9 public class Test { public static void main(String[] args) { myMethod(1.0, 2, "Hello!"); }   public static void myMethod(double d, String s, int x) { System.out.println(s + " " + d + " " + x); } }
1 2 3 4 5 6 1 error found: File: Test.java <hr> Error: method myMethod in class Test cannot be applied to given types; required: double,java.lang.String,int found: double,int,java.lang.String reason: actual argument int cannot be converted to java.lang.String by method invocation conversion

这种不分青红皂白的错误新闻极度常有赞助。“required”这一行错误新闻告诉大家方法的参数是何许,方法的参数列表在从此以后边。在地点的例证中,myMethod方法的参数前后相继顺序应该是double类型、String类型,最终是一个int类型的变量。
错误消息的下一行(found开端的这一行)告诉我们前后相继在调用这一个方式时用了怎么着的参数。在上边的例子中,是三个double类型,叁个int类型,最终是二个String类型的变量,很明朗顺序是不没错。

缓和这种不当,大家必要保险措施的参数个数和类型与函数申明时都形似才行。

1 2 3 4 5 6 7 8 9 public class Test { public static void main(String[] args) { myMethod(1.0, "Hello!", 2); }   public static void myMethod(double d, String s, int x) { System.out.println(s + " " + d + " " + x); } }

9.“Missing Return Statement”

当三个主意未有回到语句时,就能够现出“Missing Return
Statement”的消息。每种重回值(非void类型)的法子都一定要有一个字面上再次来到该值的讲话,以便在艺术之向外调拨运输用它。

public String[] OpenFile() throws IOException {
    Map<String, 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!");
    }
}

编写翻译器抛出“Missing Return Statement”音讯的由来有几多:

  • 重返语句由于错误被略去。
  • 该办法未有回来任何值,但项目void在点子签名中未注脚。

查看怎么修复“Missing Return
Statement”Java软件错误的亲自去做。(@StackOverflow)

26.“NoSuchProviderException”

当号令的平安提供程序不可用时,会生出“NoSuchProviderException”至极(@alvinalexander):

javax.mail.NoSuchProviderException

当试图找到为啥爆发“NoSuchProviderException”时,请检查:

  • JRE配置。
  • 配备中装置的Java home。
  • 使用哪个Java情形。
  • 百色提供程序条约。

读书有关在运作Java软件时会招致“NoSuchProviderException”原因的争论。(@StackOverflow)

12. 缺少return语句

当您声Bellamy(BellamyState of Qatar个方法有再次回到值不过从未写return语句时会报这一个荒谬。举个例子:

1 2 3 4 5 6 7 8 9 10 public class Test { public static void main(String[] args) { int x = twice(5); System.out.println(x); }   public static int twice(int x) { int value = 2 * x; } }
1 2 3 1 error found: File: Test.java <hr> Error: Test.java:9: missing return statement

我们经过函数评释告知编写翻译器twice方法会再次来到叁个int值,但是大家并未写return语句:

1 2 3 4 5 6 7 8 9 10 11 public class Test { public static void main(String[] args) { int x = twice(5); System.out.println(x); }   public static int twice(int x) { int value = 2 * x; return value; } }

在好几if条件句中,编写翻译器也会感到函数未有重回值。像上边那个事例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class Test { public static void main(String[] args) { int x = absVal(-5); System.out.println(x); }   public static int absVal(int x) { if (x < 0) { return -x; }   if (x >= 0) { return x; } } }
1 2 3 1 error found: File: Test.java <hr> Error: Test.java:15: missing return statement

制止这种不当,大家得以接收接收else语句(就疑似我们在变量没被最早化同样),或然大家得以不要第叁个if语句,因为大家领略,倘诺程序能够施行到这些地点,程序就能够直接重回x了:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class Test { public static void main(String[] args) { int x = absVal(-5); System.out.println(x); }   public static int absVal(int x) { if (x < 0) { return -x; }   return x; } }

10.“Possible Loss of Precision”

当越来越多的新闻被分配给二个变量而当先它的体积,就能够发生“Possible Loss of
Precision”音信。倘诺现身这种状态,那么零星就能被扔掉。
假如如此没有关系,那么代码须求将变量显式注脚为新的连串。

图片 2

“Possible Loss of Precision”错误常常发生在:

  • 品味为整数数据类型的变量分配多少个实数。
  • 尝试为整数数据类型的变量分配二个double。

此Java中着力数据类型的分解公布了数量特征。(@Oracle)

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)

13. 精度损失

当你把音讯保存到三个变量中,而音讯量超越了这些变量的所能容纳的本事时会报那一个错。最广大的事例是把double类型赋值给int类型。

1 2 3 4 5 6 public class Test { public static void main(String[] args) { int pi = 3.14159; System.out.println("The value of pi is: " + pi); } }
1 2 3 4 5 1 error found: File: Test.java <hr> Error: Test.java:3: possible loss of precision found : double required: int

以此混淆是非发生的案由是Computer在蕴藏double类型时所需的空间是int类型的两倍。假若您不留意精度的损失,你能够透过上转型的办法来报告编写翻译器:

1 2 3 4 5 6 public class Test { public static void main(String[] args) { int pi = (int)3.14159; System.out.println("The value of pi is: " + pi); } }

前段时间编写翻译器不会报错了,可是pi这一个变量由于开展了取整,最后值为3。

11.“Reached End of File While Parsing”

当程序缺少关闭大括号(“}”)时,Java代码中就能够产生此错误音信。
有的时候大家得以因此在代码的末尾放置大括号来异常的快修复错误。

public class mod_MyMod extends BaseMod
public String Version()
{
     return "1.2_02";
}
public void AddRecipes(CraftingManager recipes)
{
   recipes.addRecipe(new ItemStack(Item.diamond), new Object[] {
      "#", Character.valueOf('#'), Block.dirt
   });
}

上述代码将导致以下错误:

java:11: reached end of file while parsing }

编排utilities程序和适当的代码缩进能够更便于地找到这类疏漏的大括号。

此示例发布了紧缺了大括号会怎样创制“Reached
End of File While Parsing”的荒诞消息。(@StackOverflow)

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)

14. 在解析时达到了文件结尾

当你未有用大括号关闭你的次第时会出现这一个混淆是非。错误新闻分明的建议编写翻译器在未曾刚毅程序该甘休时就达到了文件的结尾。举例:

1 2 3 4 5 6 7 8 public class Test { public static void main(String[] args) { my_method(); }   public static void my_method() { System.out.println("Hello, world!"); }
1 2 3 1 error found: File: Test.java <hr> Error: Test.java:9: reached end of file while parsing

缓慢解决那么些荒谬,大家只要求在结尾加上关闭程序的大括号(“}”)就可以。一时只是在文件末尾缺乏了二个大括号,但也可能有相当大可能率是在前后相继的中级少写或多写了大括号的案由。

一种调节和测量检验的法门是用连忙键CT瑞鹰L-A +
TAB来不易的减少你的代码。由于程序的题目与大括号有关,那样代码就不可以知道精确的缩进。找到程序中首先个缩进不得法的地点,那就是乖谬产生的地点。

一旦大括号精确的协作上,编译器就不会报错了:

1 2 3 4 5 6 7 8 9 public class Test { public static void main(String[] args) { my_method(); }   public static void my_method() { System.out.println("Hello, world!"); } }

12.“Unreachable Statement”

当三个口舌写在贰个拦住它实践之处时,就能发生“Unreachable
statement”错误。经常它出未来脚刹踏板或重回语句之后。

for(;;){
   break;
   ... // unreachable statement
}
int i=1;
if(i==1)
  ...
else
  ... // dead code

普通轻巧地移动再次来到语句将修复错误。阅读有关如何修复Unreachable Statement
Java软件错误的座谈。
(@StackOverflow)

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)

15. 进行不到的言语

当编译器检验到一些语句在一切程序流程中不容许被实施到时会报那些错。那些错误平常是由return或break后的言语所形成的。比如:

1 2 3 4 5 6 7 8 9 10 11 12 public class Test { public static void main(String[] args) { int value = twice(5); System.out.println(value); }   public static int twice(int x) { int twice = 2 * x; return twice; System.out.println("Returning " + twice); } }
1 2 3 4 5 2 errors found: File: Test.java <hr> Error: Test.java:10: unreachable statement File: Test.java <hr> Error: Test.java:11: missing return statement

编 译器报了多少个错:二个是说System.out.println(“Returning ” +
twice卡塔尔;这一行不容许被法施行到,另一个不当是因为编写翻译器借使能够执行print语句,那样的话我们在它今后也应当有个return语句,可是程序
中一贯不,所以报那几个错。

鸡犬不留这么些错误,大家能够把print语句放到return的最近,那样程序就能够实行了:

1 2 3 4 5 6 7 8 9 10 11 12 public class Test { public static void main(String[] args) { int value = twice(5); System.out.println(value); }   public static int twice(int x) { int twice = 2 * x; System.out.println("Returning " + twice); return twice; } }

13.“Variable <X> Might Not Have Been Initialized”

当方法中扬言的一些变量未开头化时,就能够时有发生这种不当。它也会产出在未有发轫值的变量是if语句组成都部队分的景观下。

int x;
if (condition) {
    x = 5;
}
System.out.println(x); // x may not have been initialized

阅读此有关什么幸免接触“Variable <X> Might Not Have Been
Initialized”错误的座谈。(@reddit)

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)

第二片段完,敬请关怀第三部分的开始和结果。

15. 变量没被开始化

当您在前后相继中去引用一个并未有被发轫化的变量时会报这一个错。上边看叁个特别轻易的例子:

1 2 3 4 5 6 7 8 9 10 11 12 public class Test { public static void main(String[] args) { int x = 2; int y; System.out.println(x + y); } }     1 error found: File: Test.java <hr> Error: Test.java:5: variable y might not have been initialized

在前后相继中你未有告诉编写翻译器y的值,所以y不能够被打印,y供给像x相似被起首化未来才干使用。

在部分更复杂的事态下,if语句只怕导致变量未有被起头化。比如:

1 2 3 4 5 6 7 8 9 10 11 12 public class Test { public static void main(String[] args) { int x; boolean setX = false;   if (setX) { x = 10; }   System.out.println(x); } }
1 2 3 1 error found: File: Test.java <hr> Error: Test.java:8: variable x might not have been initialized

这里很猛烈,x将不可能被科学的初步化,因而编写翻译器报错。不过,在有的景观下即便大家能够很掌握的知道变量能够被伊始化,可是编写翻译器无法和大家一致推测出变量是或不是会被带头化,举个例子:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class Test { public static void main(String[] args) { int x; boolean setToTen = false;   if (setToTen) { x = 10; }   if (!setToTen) { x = 0; }   System.out.println(x); } }
1 2 3 1 error found: File: Test.java <hr> Error: Test.java:14: variable x might not have been initialized

很显著,x一定会被多少个if语句中的猖獗三个赋值,但是编写翻译器并无法推断出(译者注:须求在运作时工夫明白),一种修正这一个错误的不二等秘书技是行使else语句。当使用else语句时,编写翻译器就有最够的凭据测度出x将被开始化:

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class Test { public static void main(String[] args) { int x; boolean setToTen = false;   if (setToTen) { x = 10; } else { x = 0; }   System.out.println(x); } }

Java千千万万错误列表:
找不到符号(symbol) 类X是public的,应该被声称在名字为X.java的文书中
缺点和失误类、接口或枚…

14.“Operator … Cannot be Applied to <X>”

当操作符用于非定义中的类型时,就会师世此主题材料。

operator < cannot be applied to java.lang.Object,java.lang.Object

当Java代码尝试在构思中利用途目字符串时,平常会产生这种状态。
要修复的话,就须要将字符串转变为整型或浮点型。

翻阅此证实非数字类型怎样促成Java软件错误进而警告操作符不可能使用于类型的例证。
(@StackOverflow)

15.“Inconvertible Types”

当Java代码尝试实施不合规转移时,就能生出“Inconvertible Types”错误。

TypeInvocationConversionTest.java:12: inconvertible types
found   : java.util.ArrayList<java.lang.Class<? extends TypeInvocationConversionTest.Interface1>>
required: java.util.ArrayList<java.lang.Class<?>>
    lessRestrictiveClassList = (ArrayList<Class<?>>) classList;

诸如,布尔值不可能更动为整型。

开卷此有关怎么着在Java软件中退换不可转变的类其余探究。(@StackOverflow)

16.“Missing Return Value”

当return语句饱含不得法的项目时,你将摄取“Missing Return
Value”的音信。举例,以下代码:

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

归来以下错误:

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”Java软件错误音讯的研商。(@coderanch)

第四盘部完,敬请关切第二片段的剧情。

发表评论

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