50个常见 Java 错误以及如何避免它们
ztj100 2024-12-06 20:54 18 浏览 0 评论
在开发 Java 软件时可能会遇到许多类型的错误,但大多数都是可以避免的。我们收集了 50 个最常见的 Java 软件错误,并附有代码示例和教程,可帮助您解决常见的编码问题。
编译器错误
当 Java 软件代码通过编译器运行时,会创建编译器错误消息。重要的是要记住,编译器可能会为一个错误抛出许多错误的消息。所以修复第一个错误并重新编译。那可以解决很多问题。
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 代码中。所以开发者没有放置所谓括号来平衡括号。
2. “Unclosed String 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");
}
}
通常,这种情况会发生在:
字符串文字以引号结尾。这很容易通过用所需的引号关闭字符串文字来更正。
字符串字面量超出一行。长字符串文字可以分解为多个文字并用加号 (“+”) 连接。
作为字符串文字一部分的引号不会使用反斜杠 (“\”) 进行转义。
3. “Illegal Start of an Expression”
出现“非法开始表达式”错误的原因有很多。它最终成为不太有用的错误消息之一。一些开发人员说这是由错误的代码引起的。
通常,创建表达式是为了产生新值或为变量赋值。编译器希望找到一个表达式,但由于语法与预期不匹配而无法找到它。
} // 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
}
4. “Cannot Find Symbol”
这是一个非常常见的问题,因为 Java 中间的所有标识符都需要在使用之前进行声明。在编译代码时,编译器不能理解标识符的含义。
您可能会收到“找不到符号”的消息的原因有很多:
声明时标识符的拼写可能与在代码中使用时的拼写不同。
该变量从未被声明。
该变量未在声明的同一范围内使用。
该类未导入。
5. “Public Class XXX Should Be in File”
当类 XXX 和 Java 程序文件名不匹配时,会出现“public class XXX should be in file”消息。只有在类和 Java 文件相同时才会编译代码。
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);
}
}
要解决此问题:
命名类和文件类相同。
确保两个名称的大小写一致。
6. “Incompatible Types”
“类型不兼容”是当赋值语句试图将变量与类型表达式配对时发生的逻辑错误。当代码试图将文本字符串放入整数时,通常会出现这种情况——反之亦然。这不是 Java 语法错误。
test.java:78: error: incompatible types
return stringBuilder.toString();
^
required: int
found: String
1 error
当编译器给出“不兼容的类型”消息时,确实没有一个简单的解决方法:
有可以转换类型的函数。
开发人员可能需要更改代码预期执行的操作。
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;
}
}
有几种方法可以触发“无效方法声明;需要返回类型”错误:
忘记说明类型
如果该方法没有返回值,则需要在方法签名中将“void”声明为类型。
构造函数名称不需要说明类型。但是如果构造函数名称有错误,那么编译器会将构造函数视为没有声明类型的方法。
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
被调用的方法需要在方法声明中定义的某些参数。检查方法声明并仔细调用以确保它们兼容。
9. “Missing Return Statement”
当方法没有 return 语句时,会出现“missing return statement”消息。每个返回值(非空类型)的方法都必须有一个真正返回该值的语句,以便可以在方法外调用它。
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”消息的原因有几个:
return 语句只是被错误地省略了。
该方法未返回任何值,但未在方法签名中声明类型 void。
10. “Possible Loss of Precision”
当分配给变量的信息超过其所能容纳的信息时,就会发生“可能的精度损失”。如果发生这种情况,碎片将会被扔掉。如果这没问题,那么代码需要将变量显式声明为新类型。
“可能的精度损失”错误通常发生在:
尝试将实数分配给具有整数数据类型的变量。
尝试为具有整数数据类型的变量分配双精度值。
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 }
编码实用程序和适当的代码缩进可以更容易地找到这些不平衡的大括号。
12. “Unreachable Statement”
当一个语句写在一个阻止它被执行的地方时,就会发生“Unreachable statement”。通常,这是在 break 或 return 语句之后。
for(;;){
break;
... // unreachable statement
}
int i=1;
if(i==1)
...
else
... // dead code
通常只需移动 return 语句即可修复错误。
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
14. “Operator ... Cannot be Applied to <X>”
当运算符用于不在其定义中的类型时,会出现此问题。
operator < cannot be applied to java.lang.Object,java.lang.Object
当 Java 代码尝试在计算中使用类型字符串时,通常会发生这种情况。要修复它,需要将字符串转换为整数或浮点数。
15. “Inconvertible Types”
当 Java 代码尝试执行非法转换时,会发生“不可转换类型”错误。
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;
例如,布尔值不能转换为整数。
16. “Missing Return Value”
当 return 语句包含不正确的类型时,您将收到“缺少返回值”消息。例如,以下代码:
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
通常,有一个不返回任何内容的 return 语句。
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;
}
通常通过更改方法签名以匹配 return 语句中的类型来解决此问题。在这种情况下,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;
}
18. “Non-Static Variable ... Cannot Be Referenced From a Static Context”
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
}
}
要修复“非静态变量...无法从静态上下文中引用”错误,可以做两件事:
该变量可以在签名中声明为静态。
代码可以在静态方法中创建非静态对象的实例。
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
从静态方法调用非静态方法就是声明一个调用非静态方法的类的实例。
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};
相关推荐
- 其实TensorFlow真的很水无非就这30篇熬夜练
-
好的!以下是TensorFlow需要掌握的核心内容,用列表形式呈现,简洁清晰(含表情符号,<300字):1.基础概念与环境TensorFlow架构(计算图、会话->EagerE...
- 交叉验证和超参数调整:如何优化你的机器学习模型
-
准确预测Fitbit的睡眠得分在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。在...
- 机器学习交叉验证全指南:原理、类型与实战技巧
-
机器学习模型常常需要大量数据,但它们如何与实时新数据协同工作也同样关键。交叉验证是一种通过将数据集分成若干部分、在部分数据上训练模型、在其余数据上测试模型的方法,用来检验模型的表现。这有助于发现过拟合...
- 深度学习中的类别激活热图可视化
-
作者:ValentinaAlto编译:ronghuaiyang导读使用Keras实现图像分类中的激活热图的可视化,帮助更有针对性...
- 超强,必会的机器学习评估指标
-
大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...
- 机器学习入门教程-第六课:监督学习与非监督学习
-
1.回顾与引入上节课我们谈到了机器学习的一些实战技巧,比如如何处理数据、选择模型以及调整参数。今天,我们将更深入地探讨机器学习的两大类:监督学习和非监督学习。2.监督学习监督学习就像是有老师的教学...
- Python 模型部署不用愁!容器化实战,5 分钟搞定环境配置
-
你是不是也遇到过这种糟心事:花了好几天训练出的Python模型,在自己电脑上跑得顺顺当当,一放到服务器就各种报错。要么是Python版本不对,要么是依赖库冲突,折腾半天还是用不了。别再喊“我...
- 神经网络与传统统计方法的简单对比
-
传统的统计方法如...
- 自回归滞后模型进行多变量时间序列预测
-
下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。假设要预测其中一个变量。比如,sparklingwine。如何建立一个模型来进行预测呢?一种常见的方...
- 苹果AI策略:慢哲学——科技行业的“长期主义”试金石
-
苹果AI策略的深度原创分析,结合技术伦理、商业逻辑与行业博弈,揭示其“慢哲学”背后的战略智慧:一、反常之举:AI狂潮中的“逆行者”当科技巨头深陷AI军备竞赛,苹果的克制显得格格不入:功能延期:App...
- 时间序列预测全攻略,6大模型代码实操
-
如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,欢迎移步宝藏公众号...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)