50 个 Java 开发常见错误及规避技巧 (Part 1) 已翻译 100%

oschina 投递于 2017/06/21 11:39 (共 21 段, 翻译完成于 06-22)
阅读 6785
收藏 153
3
加载中

在开发 Java 软件时可能会遇到许多类型的错误,但大多数可以避免。 我们列举了 50 个最常见的 Java 软件错误,其中包含代码示例和教程,以帮助您解决常见的编码问题。

更多关于编写更好的 Java 程序的提示和技巧,请下载我们的“综合 Java 开发人员指南”,指南包含从工具到最好的网站及博客,YouTube 频道,有影响力的 Twitter,领英小组,播客,所有你需要用到的 Java 相关内容。

如果您正在使用 .NET,您还应该查看我们的 50 个最常见的 .NET 软件错误指南,以及如何避免这些错误。 如果您当前的挑战与 Java 相关,请继续阅读以了解最常见的问题及其解决方法。

总长
翻译于 2017/06/21 12:12
0

编译器错误

编译器错误消息在Java软件代码在编译器执行时产生。需要重点记住的是,一个编译器可能为一个错误抛出多个错误消息。所以修复第一个错误并重编译,就能修复很多的问题。

1. “… 可预料的”

当编码出现遗漏时,就会发生这类错误。可能是缺失了一个括号或者分号。

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

这种错误消息常常不会准确的定位到错误发生的位置。为了找到错误,建议:

  • 确保所有的左括号有对应匹配的右括号。

  • (使用 IDE,译者注)在代码行前的提示中检查。这种 Java 软件错误不要由编译器来关注,应该把更后面的工作交给它。

  • 有时候一个字符,比如一个左括号不应该写在 Java 代码的开始处。这样造成的结果是开发者不会写右括号去凑成一对。

对照这个“一个缺失的括号”的例子来制造一个错误。

观指居士
翻译于 2017/06/21 16:28
0

2.“未封闭的 String 表达式”

“未封闭的 String 表达式”错误消息发生在 Sting 表达式结束时没有引号标记,错误消息将在发生错误的同一行提示出来。一个 String 表达式在源码中是一个值。

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

    }     

}

通常情况下,错误发生在:

  • String 表达式结束时没有使用引号标记。这种错误只要在 String 表达式结束是使用引号就能简单的改正

  • String 表达式超过一行时。长的 String 表达式可以被拆分成多个表达式,然后用 "+" 连接起来。

  • 引号是 String 表达式中的元素又没有使用下划线“\”进行转义。

阅读这篇《未封闭的 String 表达式的讨论》。

观指居士
翻译于 2017/06/21 16:45
0

3. “非法的表达式开头” 

出现“非法表达式开头”错误的原因有很多。但它最终归类于一个不太有用的错误消息之一。有些开发者说这是由糟糕的代码造成的。

通常,创建表达式是用于生成新值或为变量赋值。编译器期望找到一个表达式,但找不到它,因为语法不符合预期。 (@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
    }

请浏览下这个讨论,关于如何解决“非法表达式开头”错误的方法 。 (@StackOverflow)

Tocy
翻译于 2017/06/21 13:00
1

4. “找不到符号” 

这是一个非常常见的问题,因为 Java 中的所有标识符都需要在使用之前进行声明。 当编译代码时,编译器并不理解标识符的含义。

在你遇到“找不到符号”消息时可能有很多种原因:

  • 标识符声明时的拼写可能与代码中使用时的拼写不同。

  • 该变量从未被声明。

  • 该变量使用的位置与其声明的作用域不同。

  • 类并未被导入。

请通读关于“找不到符号”错误的讨论,其中也包含创建该问题的示例代码。(@StackOverflow)

Tocy
翻译于 2017/06/21 13:07
0

5. “公共类 XXX 应该在文件中出现”

“公共类 XXX 应该在文件中出现”这个消息出现在类XXX和Java程序文件名不一致时。源代码只有在类名和 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);  
    }
  }

要修复这种情况:

  • 类名和文件名一样。

  • 确保这两个名字的大小写一致。

“公共类 XXX 应该在文件中出现”错误的例子。(@StackOverflow)

观指居士
翻译于 2017/06/21 17:30
1

6. “不兼容类型” 

“不兼容的类型”是在赋值语句中尝试将变量与类型表达式匹配时触发的逻辑错误。通常是在代码尝试将文本字符写入到整数中时出现,反之亦然。 这不是 Java 语法错误。 (@StackOverflow

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

当编译器给出“不兼容的类型”消息时,确实没有一个简单的修复方案:

  • 有可以转换类型的函数。

  • 开发人员可能需要按照代码的预期修改之。

看一个例子,来说明如何通过使用字符串到整型的赋值来创建"不兼容类型"错误。(@StackOverflow)

Tocy
翻译于 2017/06/21 13:14
0

7. “无效的方法声明;需求返回类型”

此错误表示方法签名中没有明确说明方法的返回类型。

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

有几种方式会触发“无效的方法声明; 需求返回类型“错误:

  • 忘记说明返回类型

  • 如果方法没有返回值,那么需要用“void”表示方法签名中的返回类型。

  • 构造函数名称不需要说明返回类型。 但是,如果构造函数名称中出现错误,那么编译器会将构造函数视为没有指定类型的方法。

下面是一个例子讲述构造函数命名怎么触发“无效的方法声明;需求返回类型”的错误 。 (@StackOverflow)

cassia_
翻译于 2017/06/21 21:54
0

8. “类 Y 中的方法 X 不能应用于给定类型”

此错误消息是 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)

cassia_
翻译于 2017/06/21 22:04
1

9. “缺少返回语句”

当一个方法缺少返回语句时,会发生“缺少返回语句”错误。 每一个有返回值的方法(非 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!");
    }
}

下面列举了一些编译器抛出“缺少返回语句”的消息的原因:

  • 返回语句被错误地省略了

  • 一个方法没有返回任何值,但是在方法签名中没有声明为void类型

查看如何修复“缺少返回语句”的 Java 错误的示例(@StackOverflow)

cassia_
翻译于 2017/06/21 23:15
0
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(12)

qwfys
qwfys
还是看英文舒服。
家周伟
这个ide横飞的年代,写出这样的低能代码都该杀猪
暗影风暴
暗影风暴
这内容不敢恭维啊,多少年前的文章?
丶青衣
丶青衣

引用来自“xmlspyspring”的评论

这些都没有意义,这都是什么时代的东西啊.
最天朝猿类最需要提示的就是小心的的输入法,中文标点,坑你没商量.
👍
xmlspyspring
xmlspyspring
这些都没有意义,这都是什么时代的东西啊.
最天朝猿类最需要提示的就是小心的的输入法,中文标点,坑你没商量.
1363435084
1363435084
ide都有提示的 难道用的txt?
终于19岁
终于19岁
JAVA,这么落后,老化,僵硬的语言
l
lotsbug
每一条的标题不应该翻译或者至少应该保留原文吧,这样也有利于SEO,翻译了反而不知道是什么了……
毕竟开发工具里显示的还是英文
胃在烧
胃在烧
这是在用txt编程吗?
Eric_林
Eric_林
这些东西用的着说吗?!
返回顶部
顶部