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

oschina 投递于 2017/06/21 11:39 (共 21 段, 翻译完成于 06-22)
阅读 6107
收藏 152
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
Tocy
翻译于 2017/06/21 13:00
1

4. “找不到符号” 

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

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

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

  • 该变量从未被声明。

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

  • 类并未被导入。

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

Tocy
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
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_
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_
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_
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_林
这些东西用的着说吗?!
返回顶部
顶部